Und nun auch noch der nächste Schrott: (grade nochmal mit XE6 getestet und seit mindestens XE im Arsch)
TCommonDialog.Execute sucht sich zwar das "richtige" Fenster raus, wo der Dialog drangehängt werden soll (siehe ModalPopupMode), es sei denn man gibt dem Execute das gewünschte Fenster-
Handle mit,
aber beim TFindDialog.Execute wird letztendlich das ParentWnd dann doch nicht ausgewertet, stattdessen geht man bescheuerter Weise im TFindDialog.Execute auf EnumThreadWindows und holt sich dort die erste Form, welche gefunden wird (das zuletzt Erstellte), statt den Parameter zu verwenden.
- noch kein weiteres Fenster (MDI-Childs werden ignoriert) -> EnumThreadWindows liefert die MainForm (ist ja auch das einzige Fenster) -> MainForm bekommt nachher wieder Fokus
- ein weiteres (abgedockte) Fenster -> EnumThreadWindows liefert Dieses, selbst wenn es nicht aktiv ist (wurde einfach nur zufällig als Letztes erstellt) -> das Fenster bekommt sofort beim Anzeigen kurz den Fokus und dann danach auch wieder (selbst wenn ein anderes Fenster eigentlich den Fokus hatte)
- Fenster wieder schließen (hier wurde caFree vergessen, womit das Fenster nur unsichtbar wird) -> wieder wird das externe Fenster gefunden, obwohl es unsichtbar ist -> das unsichtbare Fenster soll nachher den Fokus bekommen und die ganze Anwendung verschwindet im Hintergrund :beifall:
Wobei das auch beim Standardvorgehen von Delphi knallen sollte, denn da werden ja automatisch alle Fenster erzeugt, selbst wenn sie nicht sofort, sondern erst später sichtbar gemacht werden.
siehe Demo: Neues Fenster > FindText > Dialog zu > Programm weg (am Besten noch irgendein anderes Programm offen haben, wohinter es sich dann verstecken kann)
Und hier auch mal ein Zweizeiler, welcher den Schrott demonstiert.
Delphi-Quellcode:
TMyForm.Create(Self).Close;
// DFM: Visible=True
FindDialog1.Execute;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm.Create(Self)
do begin
Show;
Close;
end;
FindDialog1.Execute;
end;
Standardmäßig hängen sich alle weiteren nichtmodalen Forms und die Dialoge an die MainForm und sind auch an Dieser ausgerichtet (stehen immer vor ihr).
Wer das nicht will, muß nur ein bissl was machen:
Application.ModalPopupMode sollte man, vorallem bei Mehrfensteranwendungen besser nicht auf dem Standardwert pmNone stehen lassen
und bei den eigenen Forms, welche nicht von der MainForm aus gestartet werden, die aber nicht an/über der akiven Form hängen sollen ... da sollte man auch noch Form.PopupMode setzen.
Hier wäre es einfacher, wenn man dem TForm.Show, ebenso wie schon beim Dialog.Execute (falls man den Wert nicht ignoriert), einen optionalen Parameter mitgeben könnte, wo man eine explizize Popupform übergibt, damit man das dort hat, wo man es auch braucht.
Gerate nochmal getestet: Delphi 7 = OK / XE und XE6 = futsch
Wer bezahlt uns eigentlich die versenkte Arbeitszeit?
Wir dachten ja meistens, daß es an unserem Programm liegt, weil es ja sonst scheinbar funktioniert, da sich keiner beschwert. (da gingen inzwischen bestimmt schon mehrere Mann-Wochen drauf, in den letzten knapp 3 Jahren)
Und es dauert bestimmt noch paar Stündchen, bis ich alle Delphi-Bugs erfasst hab (jetzt, wo ich endlich weiß, wo man suchen muß) und dann dürfen die sich über 'nen Anruf vom Cheffe freuen.
[edit] Neuer Anhang siehe #5