ProgressBar selbst erstellen



  • Morris Szyslak schrieb:

    Also dass er Rect() in dem Kontext nicht will, ist klar, weil das ne lokale Variable (siehe Funktionskopf) ist. Meiner Meinung nach ziemlich ungeschickt vom BCB.

    Ok, da hätt' ich auch selber drauf kommen können, Danke. Man kann ja nichtmal mit dem Rect aus dem Funktionskopf arbeiten, weil es const ist. Ich hatte die Idee das const zu entfernen, leider wollte der BCB die Methode dann nicht mehr für StatusBar1->OnDrawPanel benutzen.

    Morris Szyslak schrieb:

    Vorschlag 1: Du könntest Rect umbenennen und dann Rect() benutzen, wie du's zuerst hattest.
    Vorschlag 2: Vielleicht gibts im BCB3 den Koordinaten-Konstruktor für TRect noch nicht? Probier mal so:

    TRect ProgBar;
    ProgBar.left=1;
    ProgBar.top=1;
    ProgBar.right=20;
    ProgBar.bottom=15;
    

    Beide Vorschläge funktionierten erstmal nicht. Ich habe das Rect aus dem Funktionskopf in Rechteck umbenannt, das lasse ich jetzt auch so. Der Compiler beschwert sich nun bei beiden aktuellen Vorschlägen von dir nicht, keine Fehler, keine Warnungen. Es war jedoch auch keine Veränderung in Panel5 zu sehen. Daher habe ich jedes Mal Ausschau gehalten, ob das blaue Rechteck vielleicht an anderer Stelle gezeichnet wird. Aber nichts zu entdecken (und dabei bin ich schon Kolumbus 😉 ).
    Dann hab ich mich nochmal einen Meter vom Bildschirm entfernt und plötzlich kam es mir: Man beachte die Positionierung des Textes in case 1 (siehe vollständige Funktion oben)! Daraus resultiert:

    // Vorschlag 2:
    TRect ProgBar;
    ProgBar.Left= Rechteck.Left + 2;
    ProgBar.Top= Rechteck.Top + 2;
    ProgBar.Right= Rechteck.Right - 100;
    ProgBar.Bottom= Rechteck.Bottom - 2;
    

    oder

    // Vorschlag 1:
    TRect ProgBar= Rect(Rechteck.Left + 1, Rechteck.Top + 1, Rechteck.Right - 150, Rechteck.Bottom - 1);
    

    Und siehe da, beide Varianten zeichnen einen wunderschönen blauen Balken auf Panel5 😃
    Nun mache ich mich daran den Balken je nach Fortschritt wachsen zu lassen und den Text daruf zu legen, da gibts bestimmt noch Fragen dann.

    Vielen vielen Dank bis hierher für die Anregungen und Ideen. Und ich gebe zu: Ja, die Hilfe hat mal wieder nicht gelogen 😉



  • Ich bin schwer begeistert: Der Balken "wandert" zwar noch nicht, aber das wird kein Problem denke ich. Dafür habe ich jetzt weißen Text auf dem Balken und schwarzen Text hinter dem Balken. Das ist noch statisch, macht aber trotzdem schon was her! 🙂
    Hier mal der Code:

    // Panel5 weiß färben: 
    pCanvas->Brush->Color= clWhite;
    pCanvas->FillRect(Rechteck);
    // schwarzer Text auf dem Panel:
    pCanvas->TextOut(Rechteck.Left + 75, Rechteck.Top + 1, "Fortschritt schreitet fort...");
    // blaues Rechteck (ProgBar) auf dem Panel zeichnen:
    TRect ProgBar= Rect(Rechteck.Left + 1, Rechteck.Top + 1, Rechteck.Right - 150, Rechteck.Bottom - 1);
    pCanvas->Brush->Color= clBlue;
    pCanvas->FillRect(ProgBar);
    // weißen Text auf ProgBar zeichnen, der am Ende von ProgBar abgeschnitten wird:
    TRect TxtRect= Rect(0, 0, Rechteck.Right - 150, Rechteck.Bottom - 1);
    pCanvas->Font->Color= clWhite;
    pCanvas->TextRect(TxtRect, Rechteck.Left + 75, Rechteck.Top + 1, "Fortschritt schreitet fort...");
    // Schriftfarbe wieder auf schwarz setzen
    pCanvas->Font->Color= clBlack;
    


  • So, nun wandert der Balken auch, je nach Fortschritt! Einfach dufte! 😃

    Da gibt es nur noch ein kleines Problem(chen), das nicht mit einem Becherchen zu lösen ist:
    Manchmal ist beim Fortschreiten des ProgressBar etwas wie ein weißer Blitz zu sehen. Ich nehme an es liegt daran, dass zuerst der weiße Hintergrund und der schwarze Text neu gezeichnet werden. Wenn dann (warum auch immer) eine vom Auge wahrnehmbare Zeit vergeht bis der blaue Balken und der weiße Text gezeichnet werden, sieht das aus wie ein weißes flackern.
    Ich habe versucht den weißen Hintergrund und den schwarzen Text nur zu Begin zeichnen zu lassen und später nur den blauen Balken und weißen Text zu aktualisieren, aber dann verschwindet bei der 1. Aktualisierung der Hintergrund!
    Also muss ich den Hintergrund immer mit zeichnen lassen. 😞

    Irgendwelche Ideen, was ich gegen das "flackern" machen kann?



  • Ich glaube, die Eigenschaft DoubleBuffered gab es beim BCB3 noch nicht, oder?
    Ansonsten zeichne erst auf ein Bitmap und kopiere es dann auf den Panel (d.h. Doppelpufferung von Hand).



  • ~DoubleBuffered schrieb:

    Ich glaube, die Eigenschaft DoubleBuffered gab es beim BCB3 noch nicht, oder?

    Leider tatsächlich nichts gefunden, also nix DoubleBuffered.

    ~DoubleBuffered schrieb:

    Ansonsten zeichne erst auf ein Bitmap und kopiere es dann auf den Panel (d.h. Doppelpufferung von Hand).

    Klingt gut, werde ich versuchen. Dankeschön 🙂

    Immernoch zum Thema ProgressBar: Ich wollte den Text etwas fülliger haben und dachte mir, ich setzt einfach die Schrift auf Fett. In der Hilfe steht, die Schrift mit der TCanvas zeichnet ist in ein TFont-Objekt gekapselt (ich hoffe ich drücke das richtig aus). TFont-Objekte haben eine Eigenschaft Style, die laut Hilfe zB. Fettschrift ermöglicht. Also habe ich ganz mutig Folgendes zu meinem Code hinzugefügt (pFont ist ein Zeiger auf das entsprechende Objekt):

    pFont->Style= fsBold;
    

    Ergebnis:

    [C++Fehler] Fernbedienung.cpp(681): Cannot convert 'Graphics::TFontStyle' to 'System::SetGraphics::TFontStyle,0,3'.

    Dann kam mir das mit dem "Set" komisch vor, da auch in der Hilfe sowas stand. Folglich hab ich ein wenig im Forum gelesen und bin auf Folgendes gekommen:

    pFont->Style << fsBold;
    

    Ergebnis: Der Compiler meckert nicht, aber die Schrift ist auch nicht fett... 😞

    (1) Ist es von der Schriftart abhängig, ob fett möglich ist?
    (ich habe "Arial", "Courier" und "Comic Sans MS" getestet, keine wurde fett)
    (2) Ist der Code mit dem ich die Fettschrift setzen will falsch? Wenn ja, wie gehts richtig?



  • Hallo

    Wie es auch in der FAQ steht : Bei Set-Eigenschaften klappt der einfache <<-Operator nicht. Du must es nochmal zuweisen

    pFont->Style = pFont->Style << fsBold;
    

    bis bald
    akari



  • Hey, Danke akari 🙂 Hab es auch grad hier gefunden, also sry für die voreilige Frage 🙄

    Edit: Warum ist das so? 😕



  • Hallo

    Weil die Eigenschaften vortäuschen direkt mit echten Variablen zu agieren, aber in Wirklichkeit sind es nur Kopien. Der <<-Operator wird also nur auf eine temporäre Kopie angewendet, die sofort wieder verworfen wird wenn sie nicht noch extra einem L-Value zugewiesen wird, in dem Fall die Eigenschaft selber.

    Weder Set noch der <<-Operator sind also dafür schuldig, hier triit derselbe Effekt auf

    Label1->Caption += "Hallo";
    

    bis bald
    akari



  • Ich hasse "vortäuschen" 😉
    Danke für die Erklärung, leuchtet ein! Rechts die temporäre Kopie, die zu links zugewiesen und dann verworfen wird:

    Label1->Caption= Label1->Caption + "Hallo";
    

    Sauber!



  • Und weiter gehts:
    Ich hab mich jetzt mal ans Bitmap gemacht (Stichwort: DoubleBuffering). Einfach mal drauflos-erstellt / -gezeichnet und dann per SaveToFile abgespeichert. Es existiert sogar hinterher die Datei und der Compiler meckert auch nicht rum, aber: die Datei ist leer!
    Nun ist die Frage: Was habe ich falsch gemacht? Hier mal der Code mit Erklärung, was ich mir da gedacht habe:

    void __fastcall TFormFernbedienung::BtnTestProgBarClick(TObject *Sender)
    {
        // die Laufvariable für den ProgressBar auf einen mittleren Wert gesetzt:
        usSub= 125;
    
        // ein Bitmap erstellt und Zeiger zum Zeichnen angelegt:
        Graphics::TBitmap *pBuffBmp1= new Graphics::TBitmap();
        TCanvas *pBmp1Canvas= pBuffBmp1->Canvas;
        TFont *pBmp1Font= pBuffBmp1->Canvas->Font;
    
        // Schriftformatierung (schwarz & fett):
        pBmp1Font->Color= clBlack;
        pBmp1Font->Style= pBmp1Font->Style << fsBold;
    
        // weiß gefülltes Hintergrund-Rechteck gezeichnet (Breite: 294, Höhe: 19):
        TRect REck= Rect(0, 0, 294, 19);
        pBmp1Canvas->Brush->Color= clWhite;
        pBmp1Canvas->FillRect(REck);
    
        // Hintergrundtext gezeichnet:
        pBmp1Canvas->TextOut(REck.Left + 60, REck.Top + 1, "Fortschritt schreitet fort...");
    
        // blau gefülltes ProgressBar-Rechteck gezeichnet (Breite: 169, Höhe: 19):
        TRect ProgBar2= Rect(REck.Left, REck.Top, REck.Right - usSub, REck.Bottom);
        pBmp1Canvas->Brush->Color= clNavy;
        pBmp1Canvas->FillRect(ProgBar2);
    
        // Text-Rechteck mit weißem Text auf blaues ProgressBar-Rechteck gezeichnet:
        TRect Bmp1TxtRect= Rect(0, 0, REck.Right - usSub, REck.Bottom - 1);
        pBmp1Canvas->Font->Color= clWhite;
        pBmp1Canvas->TextRect(Bmp1TxtRect, REck.Left + 60, REck.Top + 1, "Fortschritt schreitet fort...");
    
        // fertiges Bild gespeichert:
        pBuffBmp1->SaveToFile("BufferBitmap.bmp");
    
        // TBitmap-Objekt gelöscht:
        delete pBuffBmp1;
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    Du weist dem neu erstellen TBitmap nirgends eine Größe in Pixel zu, also hat es auch keine Pixel die du mit den Canvas-Methoden bearbeiten kannst.

    bis bald
    akari



  • Ohne Zeichenfläche, keine Zeichnung... Ich sollte mehr schlafen 🙄
    Vielen Dank! 🙂

    Jetzt muss ich nur noch das Bitmap auf das Panel "kleben", aber das sollte zu schaffen sein!



  • Edit: Sry, Doppelpost...



  • Edit: Dreifachpost??? 😕 Was ist hier los???

    Edit2: Dann nehm ich das hier gleich zum Posten. Ich hab das Ganze jetzt mal mit

    Image1->Picture->LoadFromFile("BufferBitmap.bmp");
    Application->ProcessMessages();
    Sleep(100);
    

    in einer Schleife (für die Laufvariable) getestet, ohne es auf das Panel zu tun... Es "blitzt" leider immernoch 😮
    War der ganze Bitmap-Kram jetzt umsonst? 😞

    Edit3: Ergänzungen


Anmelden zum Antworten