Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Focus der GUI bei WM_AfterShow (https://www.delphipraxis.net/176741-focus-der-gui-bei-wm_aftershow.html)

Patrick 24. Sep 2013 09:11

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;

stahli 24. Sep 2013 09:37

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.

Patrick 24. Sep 2013 10:10

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.

Volker Z. 24. Sep 2013 10:34

AW: Focus der GUI bei WM_AfterShow
 
Hallo,

versuch es doch mal so:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  PostMessage (Handle, WM_AFTERSHOW, 0, 0);
end;
Gruß

stahli 24. Sep 2013 10:35

AW: Focus der GUI bei WM_AfterShow
 
Ist das PostMessage und WMAfterShow raus?

EarlyBird 24. Sep 2013 10:49

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;

Patrick 24. Sep 2013 10:59

AW: Focus der GUI bei WM_AfterShow
 
Jep, die Message ist raus.

Der Vorschlag von Volker hat funktioniert:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
   PostMessage (Handle, WM_AFTERSHOW, 0, 0);
end;
Ich versteh' zwar nicht warum, aber jetzt funktioniert es.

Danke!

Volker Z. 24. Sep 2013 14:50

AW: Focus der GUI bei WM_AfterShow
 
Hallo,

Zitat:

Der Vorschlag von Volker hat funktioniert: [...] Ich versteh' zwar nicht warum, aber jetzt funktioniert es.
Es liegt an der Folge der Aufrufe: zuerst OnShow, danach OnActivate.

Wenn Du in Form1.FormShow die Message absetzt, dann läuft folgendes ab:
Delphi-Quellcode:
WMAfterShow
->
Delphi-Quellcode:
Form2.ShowModal
(das Edit erhält den Fokus) ->
Delphi-Quellcode:
Form1.FormActivate
(das Form1 holt sich den Fokus, d. h.: das Edit erhält eine WM_KILLFOCUS Botschaft)

Die Message in Form1.FormActivate abgesetzt:
(Form1 bzw. ein Control hat den Fokus) ->
Delphi-Quellcode:
WMAfterShow
->
Delphi-Quellcode:
Form2.ShowModal
(das Edit erhält den Fokus)

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz