意外 tStringGrid.OnFixedCellClick 在 tOpenDialog 后面触发
Unintended tStringGrid.OnFixedCellClick firing behind tOpenDialog
我在 Windows 10 上使用 Delphi 柏林。我需要在基于 tStringGrid 的 tForm 上使用 tOpenDialog。
当我双击一个与打开的对话框中的固定列或行重叠的文件时,onFixedCellClick 事件会在打开的对话框消失后立即自动触发。在下图中,文件位于固定行的相同位置,即第一行。
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
OpenDialog1: TOpenDialog;
procedure FormClick(Sender: TObject);
procedure StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Options := StringGrid1.Options + [goFixedColClick, goFixedRowClick];
end;
procedure TForm1.FormClick(Sender: TObject);
begin
OpenDialog1.Execute;
end;
procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
Caption := '';
end;
在大多数情况下,我可以通过移动对话框 window 或单击一次文件并单击打开按钮来处理此问题,但我不能保证将使用它的其他人会这样做。
这是什么原因,我该如何解决这个问题?
我认为这是一个问题,因为 TCustomGrid
如何在鼠标松开消息(在其覆盖的 MouseUp
方法中)触发其 OnFixedCellClick
事件而不检查是否有相应的鼠标按下消息 (FHotTrackCell.Pressed
)。快速修复(如果你可以复制和修改 Vcl.Grids
):在柏林的第 4564 行(在 TCustomGrid.MouseUp
方法中添加另一个条件来检查,导致调用 FixedCellClick):
if ... and FHotTrackCell.Pressed then
FixedCellClick(Cell.X, Cell.Y);
换句话说,如果没有相应的鼠标按下,则不要调用 FixedCellClick
。
我在 Windows 10 上使用 Delphi 柏林。我需要在基于 tStringGrid 的 tForm 上使用 tOpenDialog。
当我双击一个与打开的对话框中的固定列或行重叠的文件时,onFixedCellClick 事件会在打开的对话框消失后立即自动触发。在下图中,文件位于固定行的相同位置,即第一行。
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
OpenDialog1: TOpenDialog;
procedure FormClick(Sender: TObject);
procedure StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Options := StringGrid1.Options + [goFixedColClick, goFixedRowClick];
end;
procedure TForm1.FormClick(Sender: TObject);
begin
OpenDialog1.Execute;
end;
procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
Caption := '';
end;
在大多数情况下,我可以通过移动对话框 window 或单击一次文件并单击打开按钮来处理此问题,但我不能保证将使用它的其他人会这样做。
这是什么原因,我该如何解决这个问题?
我认为这是一个问题,因为 TCustomGrid
如何在鼠标松开消息(在其覆盖的 MouseUp
方法中)触发其 OnFixedCellClick
事件而不检查是否有相应的鼠标按下消息 (FHotTrackCell.Pressed
)。快速修复(如果你可以复制和修改 Vcl.Grids
):在柏林的第 4564 行(在 TCustomGrid.MouseUp
方法中添加另一个条件来检查,导致调用 FixedCellClick):
if ... and FHotTrackCell.Pressed then
FixedCellClick(Cell.X, Cell.Y);
换句话说,如果没有相应的鼠标按下,则不要调用 FixedCellClick
。