Image laden mit Zeitverzögerung



  • Hallo erstmal , das ist mein erster Beitrag hier . Hoffe das hier ist das richtige "Sub-Forum" nehme es mal an da ich C++ Builder verwende falls nicht bitte ich um Entschuldigung.

    Kommen wir nun zu meinem Problem :

    Die Form besteht aus einem Image und aus einem Button (wow) .
    Bei FormCreate lade ich ein Bild in das Image nennen wird das Bild Logo.
    Wenn ich auf den Button klicke sollte ein Bild einer Katze hineingeladen werden.
    Danach soll der Compiler eine halbe Sekunde warten( Sleep(500); ) und dann wieder das ursprüngliche Bild hineinladen (=Logo).

    So weit so gut , jedoch wenn ich nun auf den Button klicke wird das Bild der Katze gar nicht erst hineingeladen , stattdessen bleibt das Bild Logo einfach da (nichts verändert sich).

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    Image1->Picture->LoadFromFile("adis puzzle logo.bmp");
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
    Image1->Picture->LoadFromFile("Katze.bmp");
    Sleep(500);
    Image1->Picture->LoadFromFile("adis puzzle logo.bmp");    // wenn weckgelassen
                                                              //  wird das
                                                              //Bild der Katze          
                                                              //  sichtbar
    }
    //---------------------------------------------------------------------------
    

    Wieso funktioniert das nicht ??
    Hoffe ihr versteht was ich meine.
    Wäre echt toll wenn mir jemand bei diesem Problem helfen könnte.

    Ich bedanke mich schon mal im Voraus.



  • Hallo

    Das Bild wird schon geladen, aber du siehst nichts davon, weil die GUI in einer Eventmethode nicht aktualisiert wird. Das Aktualisieren vor dem Sleep must du erzwingen

    Image1->Picture->LoadFromFile("Katze.bmp");
    Application->ProcessMessages(); // Aktualisierung erzwingen.
    Sleep(500);
    Image1->Picture->LoadFromFile("adis puzzle logo.bmp");
    

    Eine andere und auch saubere Möglichkeit wäre die Verwendung eines TTimers.

    Und noch eine Anmerkung : Sleep läßt nicht den Compiler warten, der Compiler ist nur das Programm das deinen Quellcode in ausführbaren Maschinencode umwandelt. Das Sleep läßt deinen Maschinencode zur Laufzeit warten, wenn der Compiler schon nicht mehr aktiv ist.

    bis bald
    akari



  • Hallo,

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
    Image1->Picture->LoadFromFile("Katze.bmp");
    Sleep(500);
    Image1->Picture=NULL; //---Bild löschen
    Application->ProcessMessages(); //----Window-Messages weiterverarbeiten u.a. das Neuzeichnen
    Image1->Picture->LoadFromFile("adis puzzle logo.bmp");   
    Application->ProcessMessages();                                                        
    }
    

    Probiere das Mal und sag Bescheid. Habe es nicht ausprobiert, aber so müsste es funktionieren.

    Gruß
    Hawk



  • Upps Akari war schneller 😃



  • Vielen vielen Dank an beide für die hilfreichen Antworten und das auch noch zu später Stunde.

    @ akari ja ich wollte es zuerst eh noch ändern ( das mit dem Sleep ) war jedoch dann zu faul 😃 .



  • Application->ProcessMessages ist gefährlich, würde ich so nicht benutzen. Ein Timer tut´s auch:

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
       Image1->Picture->LoadFromFile("Katze.bmp");
       TimerRestoreImage->Interval = 500;
       TimerRestoreImage->Enabled = true;
    }
    
    void __fastcall TForm1::OnTimerRestoreImage( TObject* Sender )
    {
       TimerRestoreImage->Enabled = false;
       Image1->Picture->LoadFromFile("dis puzzle logo.bmp");
    }
    

Anmelden zum Antworten