Einzelnen Beitrag anzeigen

taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#1

application.ondeactivate (funktioniert nur bei focus)

  Alt 5. Nov 2007, 20:35
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
  Mit Zitat antworten Zitat