Animierter Splash- Screen
-
Danke erstmal fuer die Antwort.
Aber so aehnlich hab ich das doch! ???
Ich erzeuge AboutDlg,
Damit wird ein Thread - in AboutDlg - erzeugt und gestartet,
der Thread wird terminiert bei Close von AboutDlg
AboutDlg wird deleted VOR Application->Run();(die Zeile hatte ich nicht mit geschrieben).Das "Aushebeln" der Threads ist kein Problem, da vor Run() der Splash- Dialog (AboutDlg) beendet wird, d.h., wenn der Programm- HauptThread startet ist alles vorbei. Die Messageverarbeitung brauch ich ja auch fuer den Timer zum bewegen.
Das Problem ist ja, dass der Thread in TAboutDlg scheinbar nicht viel macht!
Zumindest solange die anderen Formulare initialisiert werden.
Ich hatte auch schon mal nur Update() / Refresh() im Thread. bringt aber auch nichts.
-
DerAltenburger schrieb:
Da das Hauptformular extrem lange brauchen kann, bis es sich zeigen kann, blockiert mir das irgendwie den Timer und die GIF- Animation! Das soll aber gerade die Wartezeit ueberbruecken!
angezeigt wird das Formular mit Show, was im Run() aufgerufen wird.
AboutDlg wird deleted VOR Application->Run();
dann wird das Formular aber nicht geladen, sondern wenn Run() aufgerufen wird.
Die Threads laufen niemals gleichzeitig, da du den einen vor dem anderen killst.Aber so aehnlich hab ich das doch! ???
naja, ich hab die beiden Threads als nebeneinander beschrieben.
-
AndreasW schrieb:
AboutDlg wird deleted VOR Application->Run();
dann wird das Formular aber nicht geladen, sondern wenn Run() aufgerufen wird.
Die Threads laufen niemals gleichzeitig, da du den einen vor dem anderen killst.Mein Problem ist ja, dass mein AboutDlg scheintot ist (auch der Thread da drin), solange das Hauptformular - und auch noch ein paar weitere - CreateForm(ed) werden. Die beiden Formulare (haupt und AboutDlg) sollen nicht gleichzeitig sichtbar sein! Nach Anzeige des Hauptformulars hat's keine Probleme. AboutDlg soll WAEHREND alle anderen Formen Created werden sichtbar sein, der Maus folgen und eine Gif- Animation zeigen!
Deshalb die 'putzige' Reihenfolge.
1. AboutDlg erzeugen
2. anzeigen
3. darin einen Thread starten
4. hauptform und alle anderen Formulare erzeugen
5. About deleten - damit wird Thread terminiert von AboutDlg
6. Application->Run()Nur bleibt AboutDlg stecken in seiner Funktion (Timer und Animation)!!!

-
hm,
dan nimm das AboutDlg als MainForm und lade das Hauptformular im Hintergrund.
vielleicht gehts dann ja. Ich kanns leider nicht testen, da ich kein Quellcode und sowieso kein BCB auf dem Rechner habe
-
Den relevanten Quellcode hab' ich ja gepostet. Zum Hauptformular nur soviel:
Da sind etliche Komponenten drauf die lange zum initialisieren brauchen (DirectoryTree - muss Ordnerstruktur laden), einige ActiveX- Teile (Windowsmedia player, IE ...)etliche Graphicanzeigen (TImage in Scrollboxen)...
Vile Daten muessen auch aus einer Ini- Datei geladen und initialisiert werden - Einstellungen der Komponenten vom letzten Start, Datei- History ...Als Hauptform geht das AboutDlg auch nicht - dann kann ich das ja nicht unsichtbar machen, da gehen doch alle anderen Formen mit weg, oder?
Und das Hauptformular zur Laufzeit aendern ist ja auch verboten.

-
Das mit dem delete im Hauptformular gefällt mir nicht.
Mach es lieber so: In ein die Splashform (BorderStyle = bsNone, FormStyle = fsStayOnTop, Position = poScreenCenter, Name = Splashform) einen TTimer plazieren (Interval = 3000) und im OnTimer-Ereignis folgendes eintragen:void __fastcall TSplashform::Timer1Timer(TObject *Sender) { // nach 5 Sekunden die Splashform schließen Close(); }im OnClose-Ereignis der Splashform folgendes eintragen:
void __fastcall TSplashform::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; }
-
Was hast Du gegen das DELETEN ???
Ich mach das z.Z. in Main VOR Application->Run();
Das klappt prima! Die Form wird ja nicht mehr gebraucht, wenn Application "startet".Mein Problem ist aber was anderes: Die SplashForm reagiert nicht richtig, waehrend die Programmformulare erzeugt und initialisiert werden.
Wie gesagt, da soll eine Animation ablaufen (animiertes GIF und Timer).
-
Das mit Deinem Thread in der Splash-Form ist, wie schon gesagt, nicht so der Hit. Das bringt nichts, zumal ja die Application noch gar nicht richtig initialisiert ist und Du schon Processmessages aufrufst.
-
Da haste ja Recht.
Den Thread hab' ich auch nur eingebaut, weilSplashForm sonst gar keine Reaktion / Animation zeigt, solange die anderen Formulare nicht initialisiert sind. D.h. ohne den Thread funszt die SplashForm erst wenn Run() gestartet wurde. Da soll das aber eigentlich aufhoehren. Das Laden der Formen dauert lange genug. Falls nicht kann das auch von Hauptform mit Verzoegerung abgeschatet werden, Das ist aber nicht noetig (Ist aber mit vorgesehen, falls SplashForm nicht lange genug zu sehen ist).
-
Wie ist denn deine Animation genau realisiert?
Ich habe z.B. kein Problem, auf der Splash-Form per TAnimate die clock.avi aus dem Windows-Verzeichnis abzuspielen, während mittels Sleep(12000); im Konstruktor der Hauptform die Verarbeitung angehalten wird.
-
Die Animation ist:
a) Eine animierte Gif- Grafik (mit TGIFIMAGE von Melander)
b) Ein Timer der die Form der Maus hinterherlaufen lassen soll (50 .. 100msec)Die Gif- Animation und der Timer reagieren aber erst NACH Initialisieren der Hauptform (nach CreateForm) bzw. aller anderen Formen. Deshalb der Thread mit dem Processmessage(), damit ruckelt es wenigstens teilweise los.
Ich hab im Thread (in der SplashForm) auch mit Synchronize gearbeitet, bringt aber auch nichts.
[EDIT]
Ich kann auch mal das ganze AboutDlg (.h und .cpp) posten. Testen kann das nur jemand der TGIFImage von Melander installiert hat!)
[EDIT]
-
Danke erstmal an alle fuer Eure bemu.
Aber mein BCB 4.0 Hat ein prinzipielles Problem damit.Jansens Tip mit TAnimate ist ok, geht etwas besser - aber ich hab nun mal animierte gif- Dateien. Ausserdem bringt das ne Fehlermeldung "Schreiben auf ... nicht moeglich" wenn eine weitere Form Created wird - obwohl die unsichtbar ist. Die anderen Formen enthalten aber alle von TImages.
Ist auch egal!!! Ich mach das ganz anders!
1. In WinMain ruf ich entweder mit ShellExecute das gleiche Programm mit spez. Parameter und normal alle FormCreate(Formnamen) auf oder ich Erzeuge AboutDlg als Hauptformular und lass das Programm ndamit starten!
Welche Weg das Prog nimmt, haengt vom Parameter 1 ab!
:: Steht drin, startet nur AboutDlg sonst nur alle anderen.2. Zum Synchronisieren mach ich was mit Mutex.
Im eigentliProgramm (mit allen Formen) wird erzeugt, wenn alle Fornulare Created sind.In AboutDlg wird (mit Timer) versucht den gleichen Mutex zu Oeffnen.
Sobald das gelingt - dann muss das ander Programm gestertet sein - schliesst sich AboutDlg!Voila
Da das jetzt zwei unabhaengige Fenster am BS erzeugt, zeigen die sich voellig ungestoert und unbeeinflusst - auch uebereinander.
PS: Das Beenden verzoegere ich noch um 3 - 4 sec, damit AboutDlg auch lange genug zu sehen ist!
-
Ganz schön viel Aufwand für einen kleinen Splash-Screen. Kannst Du nicht einfach das Gif in ein AVI wandeln und dann mir TAnimate anzeigen?
-
DerAltenburger schrieb:
Jansens Tip mit TAnimate ist ok, geht etwas besser - aber ich hab nun mal animierte gif- Dateien. Ausserdem bringt das ne Fehlermeldung "Schreiben auf ... nicht moeglich" wenn eine weitere Form Created wird - obwohl die unsichtbar ist. Die anderen Formen enthalten aber alle von TImages.
Irgendwie stoert sich der BCB an den TImages in den Formen. Da gibts "...Zeichnen auf ... Canvas ... nicht moeglich"

Ausserdem ist doch der Aufwand so gross nicht. Mit dem Mutex kann ich auch gleich noch Mehrfachaufrufe des Programmes verhindern - das wollte ich schon immer mal haben. Mit Aufruf der alten Instanz und Parameteruebergabe!
