AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Splash Screen sofort anzeigen

Ein Thema von reaktor · begonnen am 17. Jun 2020 · letzter Beitrag vom 18. Jun 2020
Antwort Antwort
reaktor

Registriert seit: 1. Aug 2012
6 Beiträge
 
#1

Splash Screen sofort anzeigen

  Alt 17. Jun 2020, 09:54
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.Ä.?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Splash Screen sofort anzeigen

  Alt 17. Jun 2020, 11:04
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 MeinProgramm.exe -Parameter ... wird dann 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
reaktor

Registriert seit: 1. Aug 2012
6 Beiträge
 
#3

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 10:46
Vielen Dank für die Antwort! Wird vermutlich früher oder später auf einen Bootloader hinauslaufen
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
455 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 10:56
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 11:20
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.400 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 12:17
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?!
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 12:56
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (18. Jun 2020 um 12:58 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.619 Beiträge
 
#8

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 12:57
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
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
455 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Splash Screen sofort anzeigen

  Alt 18. Jun 2020, 13:51
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.
  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 +1. Es ist jetzt 18:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf