【发布时间】:2014-01-23 19:38:37
【问题描述】:
我有一个字符串网格,它显示了一堆文件和有关这些文件的信息。有关当前所选项目的更多信息显示在单独的面板中。所以,我想知道所选行何时更改以更新面板。 OnSelectCell 不好,因为它在选择实际移动到新位置之前触发。这就是我的意思:
function TStrGrd.SelectCell(ACol, ARow: Longint): Boolean; {override}
begin
Result:= inherited SelectCell(ACol, ARow);
Mesage('Cur row: '+ IntToStr(row));
Mesage('New row: '+ IntToStr(ARow));
{ My own event }
if Assigned(FCursorChanged)
then FCursorChanged(Self); <-------- user will see the old row
end;
如果选择了最后一行并单击第一行,我将收到以下消息:
Cur row: 999
New row: 0
如果我创建自己的事件处理程序并将选择要移动的行传递给它,它将起作用。它应该 100% 工作,但我对此不太满意,因为用户必须在该事件处理程序中编写一些额外的代码。
我可以拦截所有用户交互(鼠标/按键按下)和我以编程方式进行的所有选择更改,但这需要相当多的代码。应该有更优雅的方式。
- 这个问题与What event fires every time a TDbGrid's selected location is changed? 类似,但不是重复的。该问题的答案是“使用 OnDataChange”,但 TStringGrid 没有该事件。
- @Andriy M 在这里提出了 OnSelectCell 不起作用的原因:Detecting single vs multiple selections in Delphi TStringGrid
【问题讨论】:
-
“在实际移动选择之前”是什么意思?
Row和Col已更改。 -
我希望您可以将消息(POST 而非发送)发送到您的网格,某种您自己的 WM_USER+delta。我希望在处理所有其他消息并且您将获得您自己的自定义消息的那一刻,包括更改属性和绘画在内的所有工作都已经完成。实际上 PostMessage 是最典型的 WinGDI/VCL 卸载某些任务的方式。 // 但是,我的直觉表明您只是尝试使用错误的工具。整体描述问题,您试图通过延迟事件处理程序解决什么?也许你可以用更多类似 VCL 的方式来解决它?
-
@Arioch'The-请查看更新后的问题。
标签: delphi