ListView - Position der Checkbox ändern



  • Hi,

    weiss jemand wie man die Position der Checkbox bei einer ListView im Report Modus ändern kann? Ich will die an einer anderen Position haben anstatt im ersten Feld.

    Bisher habe ich es so gelöst, dass ich die Checkbox selber erstelle und in das Listview packe und die Position (Left/Top) ändere, nur geht das auch anders und ggf. sogar einfacher?

    Danke!



  • Hallo,

    also es gibt keine einfache Möglichkeit. Ich habe es bei meinem Programm so gemacht, dass ich alles im OwnerDraw-Modus selbst gezeichnet habe - und eben auch die CheckBoxen. Und dann kannst du bestimmen an welcher Position du die CheckBoxen setzen willst.
    Natürlich musst du dann noch die Mausposition über der CheckBox bestimmen und dann bei OnClick die CheckBox manuell checken...

    Gruß Hawk



  • Das mit Ondraw hab ich schon versucht, allerdings habe ich hier offensichtlich etwas falsch gemacht.

    Allerdings hatte ich den Effekt das das Listview ständig neu gezeichnet wurde wenn man eine Checkbox geklickt hat 😕



  • Zeig doch mal die OnDraw Prozedur....



  • void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
    	  TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
    {
    	if(!CheckBox1->Checked)
    		return;
    
    	TCheckBox* box = new TCheckBox(ListView1);
    	Item->Caption = "eintrag";
    
    	box->Parent = ListView1;
    	box->Left = Item->Left+140;
    	box->Top = Item->Top;
    }
    

    Der Code ist natürlich falsch, wenn ich wüsste wie man es richtig macht hätte ich ja nicht gefragt 🙂



  • Also du versuchst eine CheckBox-Komponente in das ListView einzubauen. Ist möglich, verbraucht aber Ressourcen und von der Perfomance auch nicht gut.

    Versuch mal folgendes:

    1. Nimm eine ImageList und packe 2 kleine Icons (16x16) - eins mit dem Symbol einer gechekten und eines ungecheckten ChekBox

    2. setze die ListView auf den Modus OwnerDraw=True

    3. Benutze die OnCusomDrawItem Funktion und fülle diese mit Code...
    Ob ein Eintrag gechecked ist, kannst du ja das Property Item->Checked benutzen und setzen.

    4. Benutze die OnClick Prozedur der ListView um bei einem Click das Property Item->Checked auf true oder false zu setzen und dabei.

    Beispiel:

    //---Im OnCustomDrawItem
    ...
    
    TRect r=Item->DisplayRect(drBounds);
    
    //----Text der 1. Spalte Zeichnen
    
    Sender->Canvas->TextRect(&r, r.Left+2,r.Top+2 ,Item->Caption);
    
    //-----Symbol wird 100 Pixel weiter rechts gezeichnet
    if (Item->Checked) ImageList1->Draw(Sender->Canvas,r.Left+100,r.Top+2,0,true); //---Checked-Symbol anzeigen
    else ImageList1->Draw(Sender->Canvas,r.Left+100,r.Top+2,1,true);
    //---Unchecked-Symbol anzeigen
    

    Selbstverständlich ist der Quellcode nicht optimal. Man müsste auch die weiteren Spalten berechnen und zeichnen, aber somit sparst du viele Ressourcen - ich gebe zu, dass es einiges an Programmiertaufwand geben wird, aber das Zeichnen wird besser laufen, weil mal eben alles dann unter Kontrolle haben wird....

    Gruß Hawk



  • Danke für deinen Tipp, aber so ganz funktioniert das nicht wie ich es will.

    Aber ich habe mich jetzt doch dazu entschieden die Listview Checkbox zu benutzen.


Log in to reply