Suche Komponente ähnlich der ListBox



  • Hi.

    Ich habe beliebig viele "Objekte" welche mit einem Benutzertext beschrieben sind.
    Jetzt möchte ich gern eine Auswahl anbieten wo die mehrzeiligen Texte gut auseinanderhaltbar aufgelistet werden. Kennt wer dafür eine gute schicke Komponente/Lösung?



  • Sowas in der Art meine ich http://www.tmssoftware.com/AdvCodeList.gif 🙂



  • Hallo

    Du kannst eine TListBox nehmen und die Items selber zeichnen.

    bis bald
    akari



  • Ja. http://www.codeguru.com/cpp/controls/controls/lists,treesandcombos/article.php/c2291/

    Habe dieses Beispiel gefunden, leider kein CBuilder Code.

    Soweit habe ich es schon güt gelöst.

    void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
          TRect &Rect, TOwnerDrawState State)
    {
        TRect ARect = Rect;
    
        ListBox1->Canvas->Brush->Color = clYellow;
        ListBox1->Canvas->FillRect(ARect);
    
        ListBox1->Canvas->Font->Color = clBlack;
        DrawText(ListBox1->Canvas->Handle, ListBox1->Items->Strings[Index].c_str(), - 1, &ARect, DT_WORDBREAK);
    
        ListBox1->Canvas->Brush->Style = bsClear;
        ListBox1->Canvas->Pen->Color = clBlack;
        ListBox1->Canvas->Rectangle(ARect);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control,
          int Index, int &Height)
    {
        Height = 50;    
    }
    

    Problem ist das ListBox1MeasureItem und sein Height. Ich möchte das natürlich Variable, aber wie bekomme ich die Höhe?



  • Hallo

    Indem du in dem Measure-Event die Höhe des zu Zeichnenden Textes bestimmst. Mit einer Canvas-Methode (siehe BCB-Hilfe) bekommst du heraus wie hoch ein Text im aktuellen Font ist. Das must du noch mit der Anzahl der Zeilen multiplizieren und den Abstand zwischen den Zeilen hinzuaddieren.

    Eventuell gibt es auch eine WinAPI-Funktion die die Höhe von mehrzeiligen Text gleich mitberechnet.

    bis bald
    akari



  • Na so einfach ist das nun nicht, ich weiss ja garnicht wieviele Zeilen das werden, das ja kein Font mit festen Zeichengrösse. Ich befürchte aber auch das zuviele Listeneinträge das dann aber auch sehr verlangsamt, jeden Eintrag dessen Höhe zu berechnen...



  • Hallo

    Wenn du im Paint-Event weißt was du zeichnen must dann weißt du im Measure-Event auch wie hoch das sein soll.
    Das dieses Vorgehen zu einer zusätzlichen Belastung führt die bei vielen Einträgen merkbar wird ist klar und auch nicht zu verhindern.

    bis bald
    akari



  • Ich glaube du berücksichtigst nicht das jedes Schriftzeichen eine andere Breite hat. Ich weiss eben dadruch nicht, wieviele Zeilen es werden. Ich müsste es quasi erstmal wo "zeichnen" mit WordBreak als Bedingung und selben Zeilenbreite, um dies zu ermitteln. Oder lieg ich da falsch?



  • Hallo

    Doch das habe ich berücksichtigt

    Mit einer Canvas-Methode (siehe BCB-Hilfe) bekommst du heraus wie hoch ein Text im aktuellen Font ist. Das must du noch mit der Anzahl der Zeilen multiplizieren und den Abstand zwischen den Zeilen hinzuaddieren.

    Eventuell gibt es auch eine WinAPI-Funktion die die Höhe von mehrzeiligen Text gleich mitberechnet.

    bis bald
    akari


Anmelden zum Antworten