Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick.
Falk0ner, вс, 06/07/2008 - 15:34.
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:
procedure TForm1.ListBox1Click(Sender: TObject);
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;
Нашел альтернативное решения данной проблемы на англоязычном сайте, мне помогло))
Lutz Kutsche
Delphi Developer
Sat, 01 Dec 2001 03:00:00 GMT
Re:OnClick and OnDblClick
Hi Iain,
I haven't found a way to suppress the OnClick event, but I found a
workaround for it.
The problem is, that the OnClick event gets fired _before_ the
OnDblClick, so we need a way to
change that behaviour.
To accomplish this, I started the OnClick handler like this:
type
TFrmMain = class(TForm)
...
private
DoubleClicked: Boolean;
end;
procedure TFrmMain.ControlClick(Sender: TObject);
begin
Application.ProcessMessages;
if DoubleClicked then begin
DoubleClicked := false;
Exit;
end;
...{your code}
end;
procedure TFrmMain.ControlDblClick(Sender: TObject);
begin
DoubleClicked := True;
...{your code}
end;
Отправить комментарий