![]() |
Focus der GUI bei WM_AfterShow
Hallo,
Ich habe ein kleines Problem. Ich möchte beim Start der Anwendung ein Sub-Fenster anzeigen. Ich möchte aber dass die Haupt-Form dann schon im Hintergrund zu sehen ist. Deswegen verwende ich ein WM_AfterShow -Event. Allerdings ist der Focus dann im Nirvana. Sobald ich Tab-Drücke ist der Focus auf der Komponente mit der TabOrder 1. Ich brauche den Focus aber auf der Komponente mit der Tab-Order 0 ohne dass ich dafür etwas drücken muss. Wo ist das Problem?
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin PostMessage(self.handle, WM_AfterShow, 0,0); // Dadurch kommt das ShowMessage erst nachdem das MainForm sichtbar ist end; procedure TForm1.WMAfterShow(var Message: TWMChar); begin Form2.ShowModal; end; ... procedure TForm2.FormShow(Sender: TObject); begin Edit1.SetFocus; // Das bringt nichts. Der Focus ist nicht auf Edit1, wie ich es gerne hätte. end; |
AW: Focus der GUI bei WM_AfterShow
Du könntest folgendes versuchen:
In Form1 eine Variable FirstActivate: Boolean einführen. Wenn FirstActivate False ist dann Form2 im Form1.OnActivate öffnen und FirstActivate auf True setzen. Vielleicht hilft das schon. |
AW: Focus der GUI bei WM_AfterShow
Das löst das Problem leider nicht. Vielleicht ist es auch wo anders lokalisiert?
Nachtrag: Habs nochmal mit einer leeren Form mit einem simplen TEdit darauf versucht. Selbes Problem. |
AW: Focus der GUI bei WM_AfterShow
Hallo,
versuch es doch mal so:
Delphi-Quellcode:
Gruß
procedure TForm1.FormActivate(Sender: TObject);
begin PostMessage (Handle, WM_AFTERSHOW, 0, 0); end; |
AW: Focus der GUI bei WM_AfterShow
Ist das PostMessage und WMAfterShow raus?
|
AW: Focus der GUI bei WM_AfterShow
ich hab das mal mit einem Timer gelöst.
Vielleicht nicht elegant aber es funktioniert. Den Timer auf False setzen interval auf 10
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin TimerA.Enabled := True; end; procedure TForm1.TimerATimer(Sender: TObject); begin TimerA.Enabled := False; Form2.ShowModal; end; //Form2 procedure TForm2.FormShow(Sender: TObject); begin Edit1.SetFocus; end; |
AW: Focus der GUI bei WM_AfterShow
Jep, die Message ist raus.
Der Vorschlag von Volker hat funktioniert:
Delphi-Quellcode:
Ich versteh' zwar nicht warum, aber jetzt funktioniert es.
procedure TForm1.FormActivate(Sender: TObject);
begin PostMessage (Handle, WM_AFTERSHOW, 0, 0); end; Danke! |
AW: Focus der GUI bei WM_AfterShow
Hallo,
Zitat:
Wenn Du in Form1.FormShow die Message absetzt, dann läuft folgendes ab:
Delphi-Quellcode:
->
WMAfterShow
Delphi-Quellcode:
(das Edit erhält den Fokus) ->
Form2.ShowModal
Delphi-Quellcode:
(das Form1 holt sich den Fokus, d. h.: das Edit erhält eine WM_KILLFOCUS Botschaft)
Form1.FormActivate
Die Message in Form1.FormActivate abgesetzt: (Form1 bzw. ein Control hat den Fokus) ->
Delphi-Quellcode:
->
WMAfterShow
Delphi-Quellcode:
(das Edit erhält den Fokus)
Form2.ShowModal
Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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