![]() |
Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Liste der Anhänge anzeigen (Anzahl: 2)
Liebe Gemeinde,
es ist zu warm! Ich gurke jetzt schon seit viel zu langer Zeit an einen kleinen und bestimmt recht simplen Formularproblem, aber ich kriegs einfach nicht gebacken. Wir nehmen eine neue Beispielapplikation frisch aus File->New->VCL Form Application (Delphi) Dem fügen wir noch ein kleines Unterformular hinzu. Das rufen wir mit einen Klick auf einen Button im Hauptformular auf. Das funktioniert alles soweit prächtig. Auch die Z-Order und Fokus sind in meinem Sinne: Wenn das Unterformular geöffnet und den Fokus hat, dann ist das Hauptformular im Hintergrund. Selbst wenn man den Fokus auf das Hauptformular gibt, bleibt das Unterformular im Vordergrund...super, spitze, so soll es sein. Hier ein bisschen Quelltext. Beispielprogramme als Anhang. Weiter unten geht es dann zu meinen Problem.
Delphi-Quellcode:
program ZOrderFormExample;
uses Vcl.Forms, MainFormUnit in 'MainFormUnit.pas' {MainForm}, SubFormUnit in 'SubFormUnit.pas' {SubForm}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TSubForm, SubForm); Application.Run; end.
Delphi-Quellcode:
unit MainFormUnit;
interface uses System.Classes, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, SubFormUnit; type TMainForm = class(TForm) btnOpenSubform: TButton; procedure btnOpenSubformClick(Sender: TObject); private public end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.btnOpenSubformClick(Sender: TObject); begin SubFormUnit.SubForm.Show; end; end.
Delphi-Quellcode:
unit SubFormUnit;
interface uses System.Classes, Vcl.Controls, Vcl.Forms; type TSubForm = class(TForm) private public end; var SubForm: TSubForm; implementation {$R *.dfm} end. Und hier jetzt die Version, die dem richtigen Quelltext entspricht und leider mein Problem verursacht: Das Unterformular ist privater Member des Hauptformulars. Wenn das Unterformular den Fokus an das Hauptformular verliert, wird es hinter dem Hauptformular geschoben. DAS DARF NICHT SEIN! :evil:
Delphi-Quellcode:
Wie kann ich hier ein Verhalten wie im ersten Fall erhalten?
unit MainFormUnit;
interface uses System.Classes, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, SubFormUnit; type TMainForm = class(TForm) btnOpenSubform: TButton; procedure btnOpenSubformClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FMySubForm : SubFormUnit.TSubForm; public end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.btnOpenSubformClick(Sender: TObject); begin FMySubForm.Show; end; procedure TMainForm.FormCreate(Sender: TObject); begin FMySubForm := SubFormUnit.TSubForm.Create(Self); end; end. Und zwar ohne dermaßen mit TopMost-Krempel zu hantieren das andere bzw. Drittanwendungen verdeckt werden (Explorer, Browser etc.)! Wer weiß Rat? Wer schreitet zur Tat? :?: |
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Mach das SubFormulat modal.
|
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Zitat:
Eine mögliche Lösung. Aber gibt es vielleicht auch eine Variante, bei der ich das Hauptformular weiterhin bedienen kann? |
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Statt Formcreate lieber
Delphi-Quellcode:
procedure TMainForm.FormActivate(Sender: TObject);
begin If not Assigned(FMySubForm) then begin FMySubForm := TSubForm.Create(self); end; end; |
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Zitat:
Wie, warum und wieso? Was passiert da im Hintergrund (ja, es ist zu warm um in der VCL zu debuggen). Könnte ich irgendwelche Nachteile haben, weil ich die Unterformulare erst im FormActivate erzeuge? Hintergrundinformation: Der Nutzer muss immer irgendetwas tun (Klicken oder Tastenkombination), um die Unterformular zu öffnen. Also das Hauptformular ist schon da. |
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Also so ganz genau weiß ich nicht wie das ist, aber ich weiß dass das damit zusammenhängt, dass das FormCreate durchlaufen wird bevor Application.run abgearbeitet wird. Das FormActivate dagegen nach dem Befehl Application.run kommt.
Nachteile sehe ich das im FormActivate zu machen keine. |
AW: Z-Order-Problem beim Fokuswechsel zwischen Haupt- und Unterformular
Dann könnte man aber auch "lazy initialization as usual" umsetzen, die Property kann ja ruhig privat sein.
Delphi-Quellcode:
type
TMainForm = class(TForm) btnOpenSubform: TButton; procedure btnOpenSubformClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FMySubForm : SubFormUnit.TSubForm; function GetMySubForm: SubFormUnit.TSubForm; property MySubForm: SubFormUnit.TSubForm read GetMySubForm; public end; ... function TMainForm.GetMySubForm: SubFormUnit.TSubForm; begin if not Assigned(FMySubForm) then FMySubForm := SubFormUnit.TSubForm.Create(self); Result := FMySubForm; end; procedure TMainForm.btnOpenSubformClick(Sender: TObject); begin MySubForm.Show; //die Property ansprechen, nicht das private Feld end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz