unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
i:integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
begin
ListBox1.Items.Add(IntToStr(i) + ' : FormClick');
inc(i);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ListBox1.Items.Add(IntToStr(i) + ' : FormMouseDown');
inc(i);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ListBox1.Items.Add(IntToStr(i) + ' : FormMouseUp');
inc(i);
end;
procedure TForm1.FormDblClick(Sender: TObject);
begin
ListBox1.Items.Add(IntToStr(i) + ' : FormDblClick');
inc(i);
MessageDlg('test', mtWarning, [mbOK], 0);
end;
이렇게 단순히 이벤트순서를 출력하게끔 코딩하고
폼에다가 드블클릭 딱한번만 했거덩요..'타탁'
했는데요..
결과는
0: FormMouseDown
1: FormClick
2: FormMouseUp
3: FormDblClick
=> 여기서 메세지 박스 나오겠죠..
4: FormMouseDown
이렇게 나오네요.. FormMouseDown 이벤트가 제일 나중에 나오는게 맞는건가요?
마지막에 FormMouseUp이 나와야 되는게 아닌가요?..ㅠㅠ
그런데 희안한건 드블클릭시 메세지 박스출력하는 부분을 주석처리하면
0: FormMouseDown
1: FormClick
2: FormMouseUp
3: FormDblClick
4: FormMouseDown
5: FormMouseUp
이렇게 됩니다... 이게 정상적인거 아닌에요?
이벤트 땜에 코딩 엉망되게 생겼네요..ㅠㅠ
FormDblClick 에서 메세지박스가 뜨게되면 포커스가 Form1에서 메세지 박스로 이동하게 되어서 생기는 문제입니다..
마우스가 두번 연속으로 다운되면 DblClick 이벤트가 먹게되는데..(단 다운보다는 DblClick 이벤트가 먼저 뜨게되네요...요건 몰랐습니다..전 당연히 다운이후에 더블클릭이 타는줄 알았네요... 하여간 행위상으로는 마우스 다운이 먼저 들어가고...더블클릭 이벤트가 발생하고 마우스 업이 되는 상황으로 연결됩니다.) 더블클릭 이벤트 타면서 메세지 박스가 나타나고..그럼 포커스를 빼앗기기때문에 마우스 업 이벤트는 안 일어나게 됩니다..