ListView Frage



  • Hallo.

    Ich zeichne in der OnCustomDraw Methode von meinem ListView etwas.
    Wenn ich das Programm starte gebe ich dem ListView gleich einen Eintrag den er vormakrieren soll.

    ListView->Selected = ListView->Items->Item[row];
    

    Er sagt mir auch in OnSelectItem das der Eintrag markiert wurde, aber das ListView wird grafisch von OnCustomDraw nicht verändert, nur wenn ich per Maus in das ListView reinklickere, zeichnet er den ausgewählten Eintrag endlich andersfarbig.

    Also Programmstart

    bool Init ()
    {
     // SelectRow = true;
     // Leere LisView und fülle es mit Daten anschliessend setze row
     ListView->Selected = ListView->Items->Item[row];
     return true;
    }
    
    void __fastcall TFrame1::ListView1CustomDrawItem(
          TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
          bool &DefaultDraw)
    {
        if (Item->Selected)
        {
            ListView1->Canvas->Brush->Color = 0x00C56A31;
            ListView1->Canvas->Font->Color = clWhite;
        }
    }
    

    Ich bekomme ich es hin, das er schon bei Programmstart den ausgewählten Eintrag markiert? Wäre toll wenn das jemand wüsste.



  • wie kann ein Eintrag bei Programmstart schon ausgewählt sein, oder verstehe ich das falsch ?
    setze ListView->ItemIndex , um einen Eintrag zu markieren/auszuwählen



  • ListView hat kein ItemIndex, du meinst sicherlich ListBox, die hier aber nicht gemeint ist und es geht darum das bei Programmstart bereits eine Auswahl zu sehen ist. Damit die "Markierung" auch bleibt wenn Fokus weg ist, wird die Markierung dauerthaft mittels CustomDraw dargestellt.



  • Schau Dir mal die Eigenschaft Selected an.

    //Edit: Wieso hat ListView kein ItemIndex?



  • TListView hat die Eigenschaft ItemIndex. Das Setzen funktioniert darüber auch einwandfrei.

    Zum Thema Markierung erhalten, bei Fokuswechsel:
    Dafür reicht es dann allerdings HideSelection auf false zu setzen.



  • @Rostfrei[]
    Siehe mein Startbeitrag 🤡

    ListView->Selected = ListView->Items->Item[row];
    

    Ich weiss nicht wie ihr es hinbekommt, aber bei mir meint der Compiler zu ListView1->ItemIndex = 2 "ItemIndex ist kein Element von TListView".

    @Joe_M.
    Ja, aber es wird grau. Mit CustomDraw bleibt die Markierung in der Farbe.

    Mein Problem besteht aber immernoch. Wenn ich das Programm starte, möchte ich gleich eine Zeile selektiert haben. Wie oben beschrieben klappt das aber leider nicht. 😞



  • Du hast nicht zufällig die CLX-Variante von TListView genommen? Da gibt es wirklich kein ItemIndex.



  • WIN32 Tab und dort das TListView in TFrame gelegt. Wo ich CLX herbekomme weiss ich nichtmal (BCB5) 🙄

    In

    __fastcall TMyInput::TMyInput(TComponent* Owner)
    

    schreibe ich

    ListView1->Selected = ListView1->Items->Item[0];
    

    Aber

    void __fastcall TMyInput::ListView1CustomDrawItem(
          TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
          bool &DefaultDraw)
    {
        if (Item->Selected)
        {
            ShowMessage("hello");
        }
    }
    

    Spuckt bei Programmstart keine MessageBox aus.
    Auch ListView1->Repaint() oder ListView1->Refresh() oder ListView1->Update() bewirkt nichts. Hilfe 😕 ^^"



  • Hast du mal einen Breakpoint in CustomDrawItem gesetzt? Geh doch mal mit den Debugger durch und schau, ob die Funktion aufgerufen wird. Normalerweise sollte ein Repaint() das schon bewirken.
    Übrigens: ItemIndex gibt es beim BCB5 noch nicht (und CLX auch nicht). 🙂



  • Wenn ich das ShowMessage aus der if() rausnehme und direkt in die Funktion plaziere wird es nicht aufgerufen. Repaint bewirkt wie gesagt leider nichts. Ich kann doch auch die Funktion ListView1CustomDrawItem() so aufrufen .. aber wie müssen da die Parameter lauten? 🤡



  • Braunstein schrieb:

    ItemIndex gibt es beim BCB5 noch nicht

    ahh wußte ich nicht, ich benutze BCB6.



  • Versuchs mal so

    void __fastcall TMyInput::ListView1CustomDrawItem(
          TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
          bool &DefaultDraw)
    {
        if (State.Contains(cdsSelected))
        {
            ShowMessage("hello");
        }
    }
    


  • In der Hauptfunktion füge ich in das ListView Einträge hinzu:

    ListView1->Tag=1;
        ListView1->Items->Clear();
        ListView1->Items->BeginUpdate();
        TListItem *ListItem;
    	for (int i=0;i<10;i++)
    	{
            ListItem = ListView1->Items->Add();
            ListItem->Caption = "bla";
            ListItem->SubItems->Add("xxx");
            ListItem->SubItems->Add("yyy");
    	}
        ListView1->Items->EndUpdate();
        ListView1->Tag=0;
    

    Wie man sieht setze ich am Anfang den ListView Tag auf 1 und am Ende zurück auf 0

    void __fastcall TMyInput::ListView1CustomDrawItem(
          TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
          bool &DefaultDraw)
    {
        if ((ListView1->Tag==0) && (State.Contains(cdsSelected)))
        //if (Item->Selected)
        {
            ListView1->Canvas->Brush->Color = 0x00C56A31;
            ListView1->Canvas->Font->Color = clWhite;
    ShowMessage("");
        }
    }
    

    Wenn er jetzt am Anfang die Einträge hinzufügt sollte er ja eigentlich nicht in die IF kommen, macht er aber! Darum setzte ich ich den Tag auf 1 um das zu verhindern, jedoch brachte das garnichts! Wenn ich das Programm starte sehe ich die Form und die MessageBox und pro Klick auf das "OK" fügt er einen Eintrag in das ListView hinzu und eine neue MessageBox erscheint, bis eben alle Einträge hinzugefügt wurden.

    Jetzt bin ich etwas paff. Eigentlich wollte ich am Ende des hinzufügens einen Wert selektieren und dieser sollte dann markiert werden, was das jetzt hier macht ist nicht nachvollziehbar -.-



  • Hallo,
    kann mir jemand sagen wie ich in so einem ListItem statt einem einfachen String
    ListItem->SubItems->Add("xxx");
    eine Checkbox unterbringen kann?
    Mir fällt dazu echt nichts ein.
    Hoffe auf eure Hilfe. Dank im Voraus.

    Gruss
    uragan24



  • Hallo,

    entweder du schaust im Forum mal nen paar Stunden zurück (da wurde das Thema bereits behandelt) oder du schaust hier: http://www.bytesandmore.de/rad/cpp/snipp/sc02038.php

    Ansonsten gibt es soweit ich weiß die Eigenschaft "Checkboxes" im TListView

    mfg, Micha



  • hi.
    Die Eigenschaft Checkbox in ListView möchte ich nicht verwenden da ich das
    Ganze variabel (Checkbox, Combobox, Radiobutton) gestalten möchte.
    Das Beispiel bringt mich ehrlich gesagt auch nicht viel weiter da es für ein TStringGrid ausgelegt ist...

    Trotzdem Danke für deine Mühe.
    Vielleicht weiss ja noch jemand wie ich das lösen könnte??

    Gruss
    uragan24



  • Hallo

    Du kommst nicht umhin aufwendug mit Inclace-Editoren zu arbeiten. Schau dir dieses Beispiel für TStringGrid an, das läßt sich sicher auch für TListView umsetzen.

    bis bald
    akari


Log in to reply