Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Forms umschalten - ohne zwischendurch Desktop zu sehen? (https://www.delphipraxis.net/190560-forms-umschalten-ohne-zwischendurch-desktop-zu-sehen.html)

mcmichael 16. Okt 2016 08:43

Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Hallo Experten,

in meiner Anwendung empfange ich den Benutzer mit einem Begrüßungs-Form mit einem START-Knopf.
Der Button soll unter anderem vom Begrüßungs-Form umschalten auf ein anderes Form.
Das geschieht auch, ABER: zwischen dem verschwinden des Begrüßungs-Forms und dem Darstellen
des neuen Forms ist eine Verzögerung, bei der bei schwachen Computern der Desktop für
fast eine Sekunde sichtbar ist.
Gibt's Wege, bei denen ich verzugslos umschalten kann?

Danke schon mal,
Michael

Uwe Raabe 16. Okt 2016 10:15

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Zitat:

Zitat von mcmichael (Beitrag 1351012)
zwischen dem verschwinden des Begrüßungs-Forms und dem Darstellen
des neuen Forms ist eine Verzögerung, bei der bei schwachen Computern der Desktop für
fast eine Sekunde sichtbar ist.
Gibt's Wege, bei denen ich verzugslos umschalten kann?

Zeig doch erst einmal, wie du jetzt die Umschaltung vornimmst.

Jim Carrey 16. Okt 2016 11:04

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Da fällt mir spontan ein ...

Delphi-Quellcode:
const
 WM_FORM_VISIBLE = WM_USER + 1;

type
 TDeineAnwendung = class(TForm)
 // ....
 private
  bFormVisibleChecked: Boolean;
  procedure WMFormVisible(var msg: TMessage); message WM_FORM_VISIBLE;
 public
 // ....
end;

implementation

// ....

procedure TDeineAnwendung.FormCreate(Sender: TObject);
begin
 bFormVisibleChecked := False;
end;

procedure TDeineAnwendung.WMFormVisible(var msg: TMessage);
begin
 if not bFormVisibleChecked then
  begin
   showmessage('Zweites Formular ist jetzt komplett sichtbar - verstecke Formular eins!');
   bFormVisibleChecked := True;
  end;
end;

procedure TDeineAnwendung.FormPaint(Sender: TObject);
begin
 if not bFormVisibleChecked then
  PostMessage(Handle, WM_FORM_VISIBLE, 0, 0);
end;
Die showmessage() wird erst angezeigt, wenn Formular 2 komplett sichtbar ist.
In WMFormVisible kannst du jetzt den Begrüßungsbildschirm ausblenden, schließen oder was auch immer machen.

mcmichael 16. Okt 2016 11:53

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Also momentan mache ich es so:

in der dpr alle Application.CreateForm

Delphi-Quellcode:

//Im Ereignis-Code des "START" Buttons:
ControlForm.Hide; //das ist das "Begrüßungs-Form"
Form1.Show; //hier soll es weitergehen
Form1.Left:=0;
Form1.Top:=0;
Form1.width:=1024;
Form1.height:=768;
tc:=GetTickcount;
repeat
      Application.ProcessMessages;
until (GetTickcount-tc)>200;
MainUnit.MainLoop; //hier werden einige GDI+ Grafikroutinen aufgerufen die auf dem Form1 zeichnen
...

mcmichael 16. Okt 2016 11:57

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Wenn ich Form1.Show vor dem ControlForm.hide aufrufe, ist der Inhalt von Form1
unvollständig. Und das impliziert dein Ansatz doch, oder?


Zitat:

Zitat von Jim Carrey (Beitrag 1351014)
Da fällt mir spontan ein ...
...
Die showmessage() wird erst angezeigt, wenn Formular 2 komplett sichtbar ist.
In WMFormVisible kannst du jetzt den Begrüßungsbildschirm ausblenden, schließen oder was auch immer machen.


Jim Carrey 16. Okt 2016 12:15

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Wenn ich Form1.Show vor dem ControlForm.hide aufrufe, ist der Inhalt von Form1
unvollständig. Und das impliziert dein Ansatz doch, oder?
Ne. ControlForm.Hide darf erst in WMFormVisible aufgerufen werden. Bis dahin ist Form1 schon komplett sichtbar.

WMFormVisible nicht mit FormShow verwechseln. Setz mal eine ShowMessage in FormShow und WMFormVisible.
Du wirst sehen, dass die MessageBox in FormShow kommt, bevor das Formular sichtbar ist. Die MessageBox in WMFormVisible kommt erst, nachdem das Formular komplett gezeichnet wurde und somit sichtbar ist.

Wenn du also ControlForm.Hide; in WMFormVisible machst, verschwindet der Begrüßungsbildschirm erst wenn dein Haupt-Formular komplett sichtbar ist.

Im Anhang mal ein Beispiel.

mcmichael 17. Okt 2016 19:58

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
@Jim Carrey:
perfekt.
so läuft's einwandfrei!

Vielen Dank!

Jim Carrey 17. Okt 2016 21:37

AW: Forms umschalten - ohne zwischendurch Desktop zu sehen?
 
Vielen Dank für die Rückmeldung.

Der Ehrlichkeit halber muss ich gestehen: ich weiß nicht, ob das eine saubere und gute Lösung ist.
Aber ich hatte damit von Windows XP bis Windows 10 noch nie Probleme.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.

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