![]() |
Splash Screen sofort anzeigen
Hallo,
unser Programm wird i.d.R. von einem Netzlaufwerk ausgeführt. Nun haben wir unsere Komponenten ausgetauscht und mit DevExpress-Komponenten ersetzt. Die zu ladenden Module (bpls) sind dadruch natürlich gewachsen. Das hat zur Folge, dass das Programm nun länger zum laden braucht. Wir würden gerne einen Splashscreen sofort nach Start anzeigen, während im Hintergrund die Module geladen werden, um dem Benutzer zu signalisieren, dass das Programm gestartet wird (keine Rückmeldung ist einfach nicht schön und im schlimmsten Fall verwirrend) Wir haben viel ausprobiert. Unter anderen sind wir nach diesem Tutorial vorgegangen: ![]() Dort wird explizit auf unser Problem eingegangen. Jedoch waren alle Versuche vergebens - es werden immer erst die Module geladen, erst dann wird der Splashscreen ausgeführt. Gibt es denn keine Möglichkeit den Splash-Screen sofort anzuzeigen? Hat jemand vielleicht eine Idee oder einen Link mit mehr Informationen o.Ä.? |
AW: Splash Screen sofort anzeigen
Ja, wir haben auch die tausenden DevExpress-BPLs.
Vorab-Fazit: nein, geht nicht (einfach) * ohne BPLs, alles in der EXE * * hier wird zuerst die ganze Datei geladen und anschließend der Code ausgeührt, also garnicht möglich * mit BPLs in der EXE auch nicht * * denn Sie wird als Letztes ausgeführt, nachdem alle gelinkten BPLs geladen wurden, also nicht machbar * wenn du es schaffst deine BPL als erstes laden zu lassen * * darfst dort natürlich keine anderen BPLs als Abhängigkeit haben (DevExpress, RTL, VCL, ...) * * also schön NonVCL ist wohl am Schnellsten, mit den wenigsten Abhängigkeiten * * dann könntest du es schaffen, allerdings werden scheinbar die Units nicht sofort initialisiert, sondern erst wenn sie von Anderen sie verwendet werden, aber du brauchst eine Unit-Initialization, um dort deine Form zu erstellen und anzuzeigen. Alternativen: * ein Bootloader * * also eine kleine EXE, die zuerst gestartet wird und den Splashscreen anzeigt, bis sie das große Programm erfolgreich gestartet hat * nicht aus dem Netzwerk starten ;) Ich hab hier ein paar alte bzw. sehr langsame PC mit einem langsamen Netzwerk, dort hatte ich mir mal eine Batch geschrieben, welche die Dateien runterläd, in ein lokales Verzeichnis. statt
Delphi-Quellcode:
wird dann
MeinProgramm.exe -Parameter ...
Delphi-Quellcode:
verwendet,
MeinProgramm.local.cmd \\IRGENDWAS\FREIGABE\ -Parameter ...
welche auch noch paar Sekunden länger sichtbar ist, bis der Splashscreen/Ladefortschritsanzeige kommt.
Code:
@PROMPT @@$G$S
CD /D "%~dp0" REM REM example: "C:\MeinZeug\MeinProgramm.local.cmd" \\IRGENDWAS\FREIGABE\ -DIE -PARAMETER -WENN -VORHANDEN @REM example as single-line command without batch: CMD /C "CD /D "C:\MeinZeug"&&TASKKILL /F /IM MeinProgramm.exe&&ECHO Temp\>xcopy_exclude.txt&&ECHO Backup>>xcopy_exclude.txt&&ECHO *.ini>>xcopy_exclude.txt&&XCOPY \\IRGENDWAS\FREIGABE\* .\ /D /S /E /H /R /C /G /K /Z /V /Y /EXCLUDE:xcopy_exclude.txt&&DEL xcopy_exclude.txt&&START "" /B MeinProgramm.exe -DIE -PARAMETER -WENN -VORHANDEN" @SET ERR=0 @SET PROGRAM=MeinProgramm.exe @ECHO. @ECHO #Source: %~1 @ECHO #Local: %~dp0 @IF NOT EXIST "%~1\%PROGRAM%" ( ECHO source-directory does not exist && SET ERR=1 ) @IF NOT EXIST "%~dp0\%PROGRAM%" ( ECHO local-directory is not correct && SET ERR=2 ) @IF NOT %ERR% == 0 GOTO error TASKKILL /F /IM "%PROGRAM%" 2>NUL @TITLE Download FileUpdates from %~1 XCOPY "%~1\*" "%~dp0" /D /S /E /H /R /C /G /K /Z /V /Y /EXCLUDE:%~f0 @IF ERRORLEVEL 2 SET ERR=3 @TITLE Start %PROGRAM% SHIFT /1 START "" /B "%PROGRAM%" %* @IF ERRORLEVEL 9059 SET ERR=4 @IF NOT %ERR% == 0 GOTO error @TIMEOUT /t 5 EXIT /B :error @TIMEOUT /t 300 EXIT %ERR% *** COPY-ExcludeList *** *.config *.ini Backup Temp\ .7z .zip |
AW: Splash Screen sofort anzeigen
Vielen Dank für die Antwort! Wird vermutlich früher oder später auf einen Bootloader hinauslaufen :)
|
AW: Splash Screen sofort anzeigen
In dem Fall kann man sicherlich das Hauptprogramm zur BPL machen und den Bootloader einfach die BPL dynamisch laden lassen, die dann wieder den ganzen DevExpress-Geschmus lädt :)
Vorteil ist, dass Du im eigenen Prozess bist für Deinen SplashScreen, vielleicht kannst da dann Fortschritt oder so anzeigen lassen |
AW: Splash Screen sofort anzeigen
Dann mußt du deine BPLs und/oder DLLs aber dynamisch laden, damit die EXE nicht gleich zu Beginn drauf wartet.
![]() ![]() |
AW: Splash Screen sofort anzeigen
Und über die .dpr datei geht es nicht auch?
Delphi-Quellcode:
sollte doch eigentlich auch fruchten?!
Application.Initialize;
// hier splashscreen laden und anzeigen lassen oder was auch immer für ein formular, in meinem fall dynamisch: Splash := TSplash.Create(nil) ; Splash.Show; // hier die eigentlichen formulare laden lassen Application.MainFormOnTaskbar := True; Application.CreateForm(TfrmMain, frmMain); // vielleicht mit einer progressbar, zwischen den CreateForm's dann hochzählen lassen... Application.CreateForm(TfrmMore, frmMore); // splash entsorgen Splash.Hide; Splash.Free; // programm normal ablaufen lassen Application.Run; |
AW: Splash Screen sofort anzeigen
Nein, denn hier geht es darum, dass erstmal alle Dateien übers Netzwerk in den lokalen RAM geladen werden
und erst wenn alles da ist und alle hart gelinkten DLLs und BPLs initialisiert wurden, erst dann läuft der Code der EXE los. [edit] so get's och @Dolly :lol: |
AW: Splash Screen sofort anzeigen
Zitat:
Zitat:
|
AW: Splash Screen sofort anzeigen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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