事件表单1:
procedure TForm1.Panel1DblClick(Sender: TObject);
begin
TForm2.Create(Self).ShowModal;
end;
事件表单 2:
procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
ShowMessage('Test');
end;
我应该怎么做才能避免fom2的onCellClick事件?
事件表单1:
procedure TForm1.Panel1DblClick(Sender: TObject);
begin
TForm2.Create(Self).ShowModal;
end;
事件表单 2:
procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
ShowMessage('Test');
end;
我应该怎么做才能避免fom2的onCellClick事件?
WM_LBUTTONDBLCLK
消息。当您在此处执行ShowModal
调用时,应用程序无法在对话框显示之前处理尚未发布的WM_LBUTTONUP
消息。由于TDBGrid
在处理WM_LBUTTONUP
消息时触发OnCellClick
事件,并且该消息恰好被发布到网格中,因为模态窗体现在是活动窗口,所以您会遇到问题。虽然可以说它应该提到您甚至不必按下鼠标按钮...当用户释放鼠标时,发生在网格单元格中的其中一个。
OnCellClick
。当前的行为相当令人困惑,如果您在有效单元格上释放按钮而不是在空白区域上,则事件将为您按下按钮的单元格触发。OnCellClick
是一团糟。
GetMessage
的详细信息,请参阅文档。WM_TIMER
消息具有最低优先级。这是一件好事,使其成为一种故障安全方法。procedure TForm2.FormCreate(Sender: TObject);
begin
DBGrid1.Enabled := False;
Timer1.Interval := 1;
Timer1.Enabled := True;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
DBGrid1.Enabled := True;
Timer1.Enabled := False;
end;
PeekMessage
+ PM_REMOVE
可以完成任务,但似乎消息队列中没有东西? - kobik@Sertac提供了一个很好的解释。
我将尝试通过创建一个中间类来修复TDBGrid
,例如:
type
TDBGrid = class(DBGrids.TDBGrid)
protected
FDown: Boolean;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
end;
TForm2 = class(TForm)
...
DBGrid1: TDBGrid;
...
end;
implementation
procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDown := True;
try
inherited;
except
FDown := False;
raise;
end;
end;
procedure TDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if FDown then
try
inherited;
finally
FDown := False;
end;
end;
FDown
标志仅表示在MouseDown
消息之后只能跟随MouseUp
消息。
经过我的简单测试,我没有注意到任何影响,但是可能会有影响。
Application.ProcessMessages()
了吗?procedure TForm1.Panel1DblClick(Sender: TObject);
begin
Application.ProcessMessages;
TForm2.Create(Self).ShowModal;
end;
WM_LBUTTONUP
。而在第二个按钮向下时,会发布WM_LBUTTONDBLCLK
。我已经看到过多次建议处理鼠标抬起来实现点击。点击是不同的,它是按下/捕获/释放。这是一个VCL设计错误。 - Sertac Akyuz