Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Splash Screen sofort anzeigen (https://www.delphipraxis.net/204664-splash-screen-sofort-anzeigen.html)

reaktor 17. Jun 2020 09:54

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:
https://www.delphipraxis.net/165336-...ashscreen.html

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.Ä.?

himitsu 17. Jun 2020 11:04

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:
MeinProgramm.exe -Parameter ...
wird dann
Delphi-Quellcode:
MeinProgramm.local.cmd \\IRGENDWAS\FREIGABE\ -Parameter ...
verwendet,
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

reaktor 18. Jun 2020 10:46

AW: Splash Screen sofort anzeigen
 
Vielen Dank für die Antwort! Wird vermutlich früher oder später auf einen Bootloader hinauslaufen :)

MyRealName 18. Jun 2020 10:56

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

himitsu 18. Jun 2020 11:20

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.
MSDN-Library durchsuchenLoadLibrary bzw. Delphi-Referenz durchsuchenLoadPackage

KodeZwerg 18. Jun 2020 12:17

AW: Splash Screen sofort anzeigen
 
Und über die .dpr datei geht es nicht auch?

Delphi-Quellcode:
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;
sollte doch eigentlich auch fruchten?!

himitsu 18. Jun 2020 12:56

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:

DieDolly 18. Jun 2020 12:57

AW: Splash Screen sofort anzeigen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1467669)
Und über die .dpr datei geht es nicht auch?

sollte doch eigentlich auch fruchten?!

Nein weil
Zitat:

* 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

MyRealName 18. Jun 2020 13:51

AW: Splash Screen sofort anzeigen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1467669)
Und über die .dpr datei geht es nicht auch?

...

sollte doch eigentlich auch fruchten?!

Unit Initialization und auch als Laden der statisch gekinkten BPLs und DLLs läuft schon vor der ersten Zeile Code in der DPR.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 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