Delphi XE2를 사용하여 아래 코드를 작성했습니다. Form1을 만들고 Form1은 즉시 Form2의 인스턴스를 만듭니다. Form2의 단추를 누르면 두 번째 Form2가 만들어집니다.MainFormOnTaskbar + 툴팁으로 인한 포커스 도용
위로 가기이 두 번째, 최상위, Form2의 단추 위에 마우스를 놓고 툴팁이 나타날 때까지 툴팁이 나타나는 순간 첫 번째 Form2가 포커스를 훔칩니다.
Application.MainFormOnTaskbar
이 True
인 경우에만 문제가 발생합니다. 또한 Form1의 FormCreate
메서드에서 만든 첫 번째 Form2를 사용합니다. PostMessage()
을 사용하여 응용 프로그램의 초기화가 완료 될 때까지 첫 번째 Form2의 생성을 지연하면 문제가 해결됩니다.
왜 이런 일이 일어나고 있는지 알고 싶습니다. Delphi의 Application 객체가 힌트 표시를 포함한 많은 것을 처리한다는 것을 이미 알았습니다. 델파이가 초기화 과정에서 창 핸들을 다시 만들 수 있다는 것을 알고 있지만, 위에서 설명한 동작을 완전히 설명하지 못했습니다 (또는 실제로 위의 두 가지 사실이 관련이 있는지 여부).
PROJECT1.DPR
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True; // False makes problem go away
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
로, Unit1.pas
unit Unit1;
interface
uses
Vcl.Forms, Unit2;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
public
procedure CreateForm2;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateForm2;
end;
procedure TForm1.CreateForm2;
var
frm : TForm2;
begin
frm := TForm2.Create(Application); // (Could pass Self - makes no difference)
frm.Show;
end;
end.
Unit2.pas
unit Unit2;
interface
uses
Vcl.Forms, System.Classes, Vcl.Controls, Vcl.StdCtrls, WinApi.Windows;
type
TForm2 = class(TForm)
Button1: TButton; // This button has a hint
procedure Button1Click(Sender: TObject);
end;
var
Form2: TForm2;
implementation
uses
System.SysUtils, Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.CreateForm2;
end;
end.
+1 매우 좋은 질문입니다. –