Hallo Gemeinde,
Wieder einmal gehts bei mir nicht weiter.
Folgende Ausgangslage:
Es gibt ein MainForm und ein Form2.
Das Form2 wird irgendwann als eine Art PopUp geöffnet und über eine andere Applikation gelegt. Die Koordinaten kommen von dieser Fremdapplikation via
COM Callback.
Nun sollte es so sein dass bei einem Klick irgendwo ausserhalb dieser Form 2 diese geschlossen werden soll. Wir haben dies mit Mainform.FormDeActivate und Application.DeActivate realisiert.
Leider ist es nun aber so dass Application.OnDeactivate nur funktioniert wenn vorher der Focus einmal auf der eigenen Applikation gelegen hat. Alle Versuche nach dem Show dieser den Focus zu geben sind gescheitert.
Zur Veranschaulichung:
Delphi-Quellcode:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
if Form2.activated then
form2.Close;
end;
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
form2.Close;
form2.activated := False;
end;
// falls form 2 über den Button ausgelöst wird funktioniert alles
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Left := StrToInt(edit1.Text);
form2.Top := StrToInt(edit2.Text);
form2.Show;
SetWindowPos(form2.handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW)
end;
// Als Versuch mit einem Timer Applikation starten und einmal auf den Desktop klicken. Nun muss zuerst der Focus mit Klick wieder auf die eigene Applikation gelegt werden bevor Application.OnDeActivate ausgelöst wird.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled := False;
form2.Left := StrToInt(edit1.Text);
form2.Top := StrToInt(edit2.Text);
form2.Show;
SetWindowPos(form2.handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW)
end;
Kennt jemand einen Workaround?
Gruss Werner
Ich habe dieses Problem schon in Delphi-Source gepostet
http://forum.dsdt.info/viewtopic.php?t=34652