Aktion ausführen wenn fertig gezeichnet



  • Hallo Leute

    ich habe ein Problem, dass ich eine größere Datenmenge laden muss und vorher noch etwas gezeichnet haben will (z.B. einen Hintergrund der darstellt dass etwas geladen wird).

    Dies hab ich momentan im OnPaint Event einer PaintBox ( Anmerkung: der Ladeprozess wird natürlich nur beim ersten OnPaintEvent aufgerufen 😉 )

    int N = 5;
       int Width = Form1->ScrollBox1->ClientWidth;
       Form1->PaintBox1->Width = Width;
       int Height = Form1->PaintBox1->Height;
    
       AnsiString text = "Daten werden geladen...";
       // Hintergrund wird gezeichnet
       int Nwi = (Height / N + 1);
       for (int i = 0; i < N; i++)
       {
          Form1->PaintBox1->Canvas->Brush->...
          Form1->PaintBox1->Canvas->FillRect(...);
       }
    
       // Daten werden geladen
       kursdatenbank.LoadFromFile("D://Programme//Charttechnik//kursdaten1.txt");
    

    Das Problem ist, dass nur ein kleiner Teil gezeichnet wird und der Rest dann erst wenn die Daten fertig geladen sind.

    Wie kann ich dafür sorgen, dass erst geladen wird, wenn meine FillRects auch wirklich alle komplett sichtbar ausgeführt wurden. (PS: intern sind die Pixels bereits gesetzt, werden nur nicht angezeigt - habe das bereits gecheckt: mit einer While-Schleife solange nichts getan bis der Pixel rechts unten die gewünschte Farbe hat - hat aber keine Verbesserung gebracht)

    danke im voraus und gruß

    Tobi



  • Also im OnPaint sollte prinzipiell kein Ladevorgang ausgelöst werden.

    - Setz doch in der Form ein Flag, wenn geladen wird und zurück bei Beenden.
    - Starte den Ladevorgang in einer eigenen Funktion!
    - In der Funktion kannst Du das Flag gut setzen/ rücksetzen
    - In OnPain wird nur das Flag getestet und entsprechend gezeichnet oder nicht

    !!!
    In der Ladefunktion sollte am Anfang (nach Setzen des Flag) ein Refresh() auf die Paintbox erfolgen und am Ende (nach dem Rücksetzen ein Invalidate()

    Gruss
    Frank



  • Hallo

    Eventuell solltest du den Ladevorgang auch in einen Thread auslagern, um dein Programm nicht dabei "einfrieren" zu lassen.

    bis bald
    akari


Anmelden zum Antworten