AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Ich krieg mein Fenster nicht automatisch aktiv.

Ich krieg mein Fenster nicht automatisch aktiv.

Ein Thema von t2000 · begonnen am 25. Feb 2021 · letzter Beitrag vom 25. Feb 2021
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 19:11
Vergesst doch mal den blöden Splash Screen. Daum geht es doch gar nicht.

Den lösche ich erst später da StyOnTop stehen bleiben soll, bis der Bildschirm komplett sichtbar ist. Das funktioniert auch alles sehr gut.

Es geht darum, direkt nach dem Start aus dem Delphi-Main-Form, welches auch noch bis zum Programmende genutzt werden soll, ein NEUES Fenster geöffnet werden soll. Und dieses zweite Fenster soll das Eingangsfenster für den Anwender sein. Und das möchte ich aktiv haben.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
132 Beiträge
 
#12

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 19:16

Es geht darum, direkt nach dem Start aus dem Delphi-Main-Form, welches auch noch bis zum Programmende genutzt werden soll, ein NEUES Fenster geöffnet werden soll. Und dieses zweite Fenster soll das Eingangsfenster für den Anwender sein. Und das möchte ich aktiv haben.
Mein letzter Vorschlag macht das doch, zumindest bei mir.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 19:22
Also hiermit ist ClientForm bei mir aktiv:
Delphi-Quellcode:
procedure TfrmMain.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SETUPAPPLICATION, 0, 0);
end;

procedure TfrmMain.WMSetupApplication(var pmvMessage: TMessage);
begin
  FClientForm := TfrmClient.Create(Self);
  FClientForm.Show;
end;
Bis bald...
Thomas
Das ist nicht in Ordnung, weil FormShow sehr früh aufgerufen wird. Bevor das Fenster sichtbar ist.
Ich starte
Splash kommt
Desktop-Form kommt
... jetzt laufen die ganzen Inits .. das dauert ein wenig ...
MainForm wird gezeigt (also die zweite Form)
und der Splash verschwindet.

Am Bildschirm ist jetzrt die DesktopForm (die erste Form, Delphi-MainForm) sichtbar, aber im Hintergrund
Im Fordergrund ist die zweite Form, meine persönliche MainForm
Leider nicht aktiv, was zu optischen Unschönheiten führt, die ich gerne beseitigen möchte.
Ich könnte (siehe erstes Posting) an der Stelle, an der ich den Splash schließe ein Postmessage machen. Aber da vermute ich keinerlei Änderung. Was ist "WM_SETUPAPPLICATION". Ich finde nichts im Internet darüber.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 19:43
Der Focus wird mir geklaut.

In einem Testprogramm warte ich über einen Timer etwas. Also so das ALLE Dinge abgeschlossen sind. Dann geht es.

Ich muss also eine Lösung finden, das wirklich ALLE create/show/activate vom "frmDesktop" (Delphi-MainForm) abgeschlossen ist.
ERST DANN darf ich das neue Fenster erzeugen.

Wahrscheinlich ein erneutes "OnIdle" programmieren.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 20:01
Gelöst!

Es hat nichts mit WinAPI Sperre oder ähnlichem zu tun.

Wenn ich mittels Timer eine Sekunde nach dem frmMain.Show warte, dann funktioniert alles.

Es könnte schon mit dem Splash zusammenhängen. Schließe ich den Splash zur falschen Zeit, bekomme ich das Fenster nicht aktiv. Die falsche Zeit ist genau in dem Moment, zwischen dem Focuswechsel von Form 1 zu Form 2.
Ohne das jetzt im Detail zu testen. Mit dem Timer geht alles.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 20:05
Einzige Änderung: Der Timer, der den Splash verzögert schließt.

Wenn mir jemand die Gründe erklären könnte, wäre ich sehr dankbar.

Delphi-Quellcode:
procedure TfrmDesktop.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  if frmSplash <> nil then begin
    SystemInit;
    FfrmMain := TfrmMain.Create( self);
    FfrmMain.Init;
    FfrmMain.Show;
    TimerSplash.Enabled := True;
  end;
end;

procedure TfrmDesktop.TimerSplashTimer(Sender: TObject);
begin
  TimerSplash.Enabled := False;
  FreeAndNil( frmSplash);
end;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.584 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 20:14
Du kannst im Delphi mal ein paar Events loggen.
Screen.OnActiveControlChange/OnActiveFormChange
Application.xxx bzw. ApplicationEvents.OnActivate/OnDeactivate/OnRestore/OnModalBegin/OnModalEnd

Dann siehst'e wann/wo dein Fokus hin geht,
bzw. ein Haltepunkt, wenn er am verschwinden ist und dann im Debugger gucken von wo es ausgelöst wurde.

Beim Schließen von Delphi-Fenstern versucht an einigen Stellen die VCL den Fokus zurückzusetzen (lässt nicht Windows entscheiden wohin er geht).
Nimmst sich die VCL dann ein HWND für's MSDN-Library durchsuchenSetFocus, welches aber nicht mehr existiert, dann schmeißt Windows das Programm in den Hintergrund. (das wurde übrigens auch im SetForegroundWindow erwähnt)

Passiert z.B. gern, wenn man ein Fenster anzeigt, während oder kurz bevor ein anderes Fenster geschlossen wird.
Noch schöner, wenn man z.B. im OnClose ein ShowMessage oder ShowModal macht, denn Delphi hängt den Dialog ans aktuell aktive Fenster, aber Dieses verschwindet ja grade und es nimmt dabei auch gleich den Dialog mit ins Nirvana.



Sobald dein Programm einmal den Fokus verloren hat und er auf ein anderes Programm übergehen konnte (wenn Deines nicht das einzige sichtbare Programm ist), dann kann dein Programm sich den Fokus nicht selbstständig zurückholen. (außer zufällig trifft eine der erwähnten Bedingenen von SetForegroundWindow zu)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (25. Feb 2021 um 20:22 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 06:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf