![]() |
Progressbar während Objekterzeugung aktualisieren
Hallo Delphianer,
vielleicht hat jemand von euch für folgendes Problem eine Lösung: Nachdem eine Anmeldemaske mit dem korrekten Kennwort ausgefüllt wurde, wird das Hauptformular (bestehend aus vielen Komponenten) erzeugt: Application.CreateForm(TfrmMain, frmMain); //Objekt erzeugen Da diese Erzeugung mehrere Sekunden dauert, wollte ich vor der Objekterzeugung eine Progressbar einschalten (als durchlaufende Marquee), um die Wartezeit optisch zu überbrücken. Leider wird während der Objekterzeugung die Progressbar nicht aktualisiert. Weiss jemand Rat? Gruß, Echtet |
AW: Progressbar während Objekterzeugung aktualisieren
Zitat:
|
AW: Progressbar während Objekterzeugung aktualisieren
Was dauert denn so lange? Die Erzeugung der Komponenten oder hast du da aus Versehen noch etwas in FormCreate oder so, das so lange dauert?
Grundsätzlich muss das Programm auch irgendwann zur Abarbeitung der WM_PAINT-Botschaften kommen, sonst aktualisiert auch nichts. Application.ProcessMessages bewirkt das. |
AW: Progressbar während Objekterzeugung aktualisieren
Hallo,
Hier erst mal etwas Code:
Delphi-Quellcode:
Ich habe nun zweimal das "Application.Processmessages" eingefügt, leider bringt es keine Verbesserung. Ich müsste eigentlich während der Objekterzeugt weitere Application.Processmessages einfügen. Aber wie geht das?
If DataModule1.IBDatabase.Connected = True then //wenn die Verbindung funktioniert...
begin Screen.Cursor := crAppStart; KlangAbspielen(login); ProgressBarLogin.Position := 0; ProgressBarLogin.MarqueeSize := 50; //Einschalten der ProgressBar Application.Processmessages; <-- hier zusätzlich eingefügt Application.CreateForm(TfrmMain, frmMain); //Objekt erzeugen Application.Processmessages; <-- hier zusätzlich eingefügt frmMain.Show; frmLogin.Visible := False; //Anmeldemaske ausblenden end; Zitat:
In FormCreate steht folgendes:
Delphi-Quellcode:
Ich werde mal die Zeiten für die obigen Befehle messen...
procedure TfrmMain.FormCreate(Sender: TObject);
begin LogEinschalten; //Verwendung der Komponente HotLog UngesicherteRegisterListe := TStringList.Create; //Liste erzeugen DokumentBMP := TBitmap.Create; //wegen Scanner-Funktionalität DokumentJPG := TJPEGImage.Create; Application.OnMessage := MyMsg; //wegen Scanner-Funktionalität TWOpenDSM(Application.Handle); //wegen Scanner-Funktionalität end; Gruß, Echtet |
AW: Progressbar während Objekterzeugung aktualisieren
Zitat:
Beim Erzeugen von Komponenten gibt es das Problem, dass jede neu erzeugte Komponente ein "Notification" Aufruf verursacht. Bei 200 Kompos wären das 1+2+3+...+199+200 Aufrufe. Der Zeitaufwand wächst also Quadratisch. |
AW: Progressbar während Objekterzeugung aktualisieren
Das OnCreate wird noch vor dem Anzeigen der Form aufgerufen ... wo nichts da ist, kann man wohl schlecht etwas anzeigen?
|
AW: Progressbar während Objekterzeugung aktualisieren
Hallo himitsu,
vielleicht stehe ich ja jetzt auf dem Schlauch... Zitat:
Oder habe ich Dich völlig falsch verstanden? Gruß, Echtet |
AW: Progressbar während Objekterzeugung aktualisieren
Richtig. Und wie soll eine Komponente etwas anzeigen können, wenn sie noch gar nicht existiert?
|
AW: Progressbar während Objekterzeugung aktualisieren
Stichwort: Splashscreen
|
AW: Progressbar während Objekterzeugung aktualisieren
Kannst du nicht etwas weniger auf einmal erzeugen. Es werden doch nicht gleich 200 Komponenten auf einmal sichtbar bzw. notwendig sein. HZier musst du evtl. etwas mehr Dynamik reinbringen.
Ansonsten muss sich eben jede Komponente melden, wenn sie fertig ist. Und dann kannst du auf einem extra Formular (z.B. Splash-Screen) den Fortschritt anzeigen. |
AW: Progressbar während Objekterzeugung aktualisieren
Hallo,
Zitat:
Zitat:
1. Ich erzeuge ein Login-Formular. Im Login-Formular befindet sich die Progressbar (momentan noch deaktiviert) 2. Ich prüfe User und kennwort ab 3. Ist beides Korrekt, wird die Progressbar aktiviert und sie sollte "loslaufen" 4. Nun wird das Hauptformular (mit den vielen Komponenten erzeugt und mit Show angezeigt) 5. Während diese Erzeugens des Hauptformulars ändert sich leider nicht die Fortschrittsanzeige der Progressbar. Zitat:
Danke für die vielen Hinweise! Gruß, Echtet |
AW: Progressbar während Objekterzeugung aktualisieren
![]() Wenn es um wenige Sekunden nach der Anmeldung geht, würde ich im LoginForm einfach ein nettes Image "bitte warten..." anzeigen. Für eine laufende ProgressBar müsstest Du diese (die betreffende Instanz) Deinem Mainform übergeben, das diese dann zyklisch hochzählt. Da der Ladefortschritt aber durch Dich schwer zu überwachen ist, wird das wohl schwierig werden. Ein empfehlenswerter Ansatz für sehr komplexe Formulare kann sein, mit embeded Forms zu arbeiten (oder notfalls mit Frames). Dadurch erhält man eine übersichtlichere Projektstruktur und Du könntest bei jedem Form, das eingebettet wird, einen Fortschritt darstellen. |
AW: Progressbar während Objekterzeugung aktualisieren
oder du machst so nen balken, wie er beim bootvorgang von xp kommt der einfach nur durchläuft und keinen fortschritt anzeigt
|
AW: Progressbar während Objekterzeugung aktualisieren
Das ist dann eine ProgressBar im Marguee-Style.
Das Problem ist aber, dass diese still steht, wenn das Programm beschäftigt ist (z.B. weil es ein Formular lädt). |
AW: Progressbar während Objekterzeugung aktualisieren
Liste der Anhänge anzeigen (Anzahl: 4)
Hier ein Beispiel...
|
AW: Progressbar während Objekterzeugung aktualisieren
Hallo Delphianer,
vielen Dank nochmal für die vielen Tips. Aufgrund der Hinweise zum SpashScreen habe ich mir diese Thematik nochmal näher angeschaut (velen Dank auch an Omata für die beispielhaften Routinen!). Ich werde wohl aus den ![]() Da mir anfangs nicht bewusst war, dass man einen SplashScreen nicht nur zu Programmbeginn einblenden lassen kann, hier mal skizzenhaft mein Vorgehen. Vielleicht hilft es dem einen oder anderen ebenso... 1. Form1 (Login = Hauptformular) wird beim Programmstart automatisch erzeugt. 2. frmMain wird nach korrekter anmeldung aufgerufen. 3. Die Spash-Komponente wird auf dem frmMain abgelegt. 4. Nachdem aus der Form1 der Befehl "Application.CreateForm(TfrmMain, frmMain);" ausgeführt wurde, startet nach kurzer Verzögerung der SpashScreen 5. frmMain wird angezeigt "frmMain.Show" 6. Spash-Komponente wird ggf beendet bzw blendet langsam aus Gruß, Echtet |
AW: Progressbar während Objekterzeugung aktualisieren
Naja, aber Moment, wenn das das Problem löst, sind das Problem doch nicht die vielen Komponenten, sondern das was in OnCreate oder OnShow passiert, oder?
Denn die Komponenten sind ja bereits vollständig erzeugt, wenn du in OnCreate ankommt. |
AW: Progressbar während Objekterzeugung aktualisieren
Hallo,
deswegen sagte ich ja auch "damit könne ich einigermaßen die Funktionalität abbilden". Du hast sicherlich recht, dass die Lösung nicht perfekt ist. Ich denke schon, dass die Anzahl der Komponenten eine Rolle spielt, denn diese werden doch mit der Erzeugung des Hauptformulars ebenfalls erst (automatisch mit dem Formular) erzeugt. Tatsächlich habe ich immer noch eine Wartezeit, bis der SplashScreen angezeigt wird, aber diese ist kürzer als ohne die SpashScreen-Lösung. Ich bleibe aber weiter dran, ob es ggf. noch weiter verbesserungsmöglichkeiten gibt. Gruß, Echtet |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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