Animierter Splash- Screen



  • 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;
    }
    


  • @F98

    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.



  • @F98

    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! 🙂


Anmelden zum Antworten