![]() |
ListView Spalte mit checkbox VCL
Hallo zusammen,
ich stehe gerade auf dem Schlauch. Ich möchte in einer Spalte einer ListView dynamisch für jede Zeile eine checkbox einfügen. Leider klappt das nicht so wie ich mir das vorgestellt habe. Mein Gedanke war die checkbox zu erzeugen und dann in ein SubItem der ListView zu geben. Aber irgendwas habe ich vergessen, da die checkbox nicht angezeigt wird.
Code:
Kompiliert wird das, aber eben wie gesagt nicht angezeigt. Fehlt ein Update oder irgendetwas ind er Art?
mybox := Tcheckbox.create(self);
LItem.SubItems.AddObject('',mybox); Vielen Dank im Voraus und viele Grüße Roland |
AW: ListView Spalte mit checkbox VCL
Du bist sicher dass das compiliert?
SubItems ist eine TStrings Instanz und AddObject erwartet einen String und eine Objektinstanz als Parameter. Angezeigt wird diese Objektinstanz aber nie, auch nicht wenn es eine TCheckBox ist. |
AW: ListView Spalte mit checkbox VCL
Ja, hatte falschen Code kopiert. Habe es gerade korrigiert.
|
AW: ListView Spalte mit checkbox VCL
Zitat:
Hilfreich wäre ein Tipp WIE die Checkbox dargestellt wird :-D |
AW: ListView Spalte mit checkbox VCL
TListView hat ein Property CheckBoxes. Damit kann man aber eben nur eine Checkbox in der ersten Spalte anzeigen.
|
AW: ListView Spalte mit checkbox VCL
Zitat:
Hilft aber leider auch nicht bei meinem Problem, die checkbox dynamisch in eine bestimmte Spalte zu packen. |
AW: ListView Spalte mit checkbox VCL
PS: Könnte man evtl. als Workaround ein Bild in eine Spalte geben und über Klick Event das Bild wechseln?
|
AW: ListView Spalte mit checkbox VCL
Dann musst du das vermutlich über OwnerDraw selbst implementieren. Die Darstellung ließe sich vielleicht noch über entsprechende Images lösen, wenn die nicht schon für was anderes verwendet werden, aber das Umschalten des CheckState könnte schon etwas aufwändiger werden.
|
AW: ListView Spalte mit checkbox VCL
Zitat:
Aber für einen nicht versierten Programmierer ohne tiefere Kenntnisse über die WinApi fast nicht umsetzbar. Dazu kommt dann noch der Mix zwischen VCL\NonVCL Habe mich daran versucht.. funktioniert gut aber es war für einen NICHT Informatiker (Hobby Programmierer) gar nicht so einfach das halbwegs zufriedenstellend umzusetzen. Als Anregung. Mein ListView basiert auf Interface und wird auf diese weise initialisiert. Und anschließend alles selbst gezeichnet. (In einer DLL)
Delphi-Quellcode:
Aber es sollte dich niemand davon abhalten es einfach zu versuchen.
LVPlayList := CTRL_ListViewCreate;
LVPlayList.SelectedImg := SKAERO_FOLDER + 'ListView\ListSelect.png'; LVPlayList.HeaderArrowImg := SKAERO_FOLDER + 'ListView\HeaderArrow.png'; LVPlayList.VTrack := SKAERO_FOLDER + 'ListView\VTrack.png'; LVPlayList.VThumb := SKAERO_FOLDER + 'ListView\VThumb.png'; LVPlayList.VBtnUp := SKAERO_FOLDER + 'ListView\VBtnUp.png'; LVPlayList.VBtnDown := SKAERO_FOLDER + 'ListView\VBtnDown.png'; LVPlayList.HTrack := SKAERO_FOLDER + 'ListView\HTrack.png'; LVPlayList.HBtnRight := SKAERO_FOLDER + 'ListView\HBtnRight.png'; LVPlayList.HThumb := SKAERO_FOLDER + 'ListView\HThumb.png'; LVPlayList.HBtnLeft := SKAERO_FOLDER + 'ListView\HBtnLeft.png'; LVPlayList.Sizer := SKAERO_FOLDER + 'ListView\Sizer.png'; LVPlayList.ArrowImgStateMax := 2; LVPlayList.Left := 19; LVPlayList.Top := 65; LVPlayList.Width := MainWidth - 242; LVPlayList.Height := MainHeight - 106; LVPlayList.DlgItemID := ID_PLAYLIST; LVPlayList.ItemHeight := 23; LVPlayList.HeaderHeight := 20; LVPlayList.CreateWindow(hMain); LVPlayList.SetFont(14, PWideChar(SKAERO_TEXTFONT), FontStyleBoldItalic, SKAERO_ACTIVECAPTION, SKAERO_INACTIVECAPTION, True, -1); LVPlayList.InsertColumn(LVPlayList.Handle, 0, 'Nr.', 50, False, sortInt); LVPlayList.InsertColumn(LVPlayList.Handle, 1, 'Time', 55, False, sortString); LVPlayList.InsertColumn(LVPlayList.Handle, 2, 'Title', 250, True, sortString); LVPlayList.InsertColumn(LVPlayList.Handle, 3, 'Artist', 250, False, sortString); LVPlayList.InsertColumn(LVPlayList.Handle, 4, 'Album', 70, False, sortString); LVPlayList.InsertColumn(LVPlayList.Handle, 5, 'Path', 250, False, sortString); SKAERO_SetAnchorMode(LVPlayList.Handle, ANCHOR_HEIGHT_WIDTH); SKAERO_SetZorder(LVPlayList.Handle, HWND_TOP); Viel glück dabei. EDIT: Zitat:
|
AW: ListView Spalte mit checkbox VCL
Einfaches Beispiel.
So könnte man das machen unter VCL (Nicht mein Ding) :lol: Siehe SetLVSubImages insbesondere auf Column und Index achten.
Delphi-Quellcode:
Edit:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Winapi.CommCtrl, Vcl.StdCtrls, System.ImageList, Vcl.ImgList; type TForm1 = class(TForm) ListView1: TListView; Button1: TButton; ImageList1: TImageList; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } Checked: BOOL; procedure SetLVSubImages(LV: TListView; Index, Column: Integer; Image: Integer; SubImagesOn: Bool); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Checked := Not Checked; if Checked then SetLVSubImages(ListView1, 3, 2, 1, True) else SetLVSubImages(ListView1, 3, 2, 0, True) end; procedure TForm1.FormCreate(Sender: TObject); var IntI: Integer; begin for IntI := 0 to 2 do ListView1.Column[IntI].Width := 100; end; procedure TForm1.SetLVSubImages(LV: TListView; Index, Column, Image: Integer; SubImagesOn: Bool); var lvStyle: DWORD; LV_Item: TLVItem; begin lvStyle := SendMessage(LV.Handle, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); If SubImagesOn Then lvStyle := lvStyle or LVS_EX_SUBITEMIMAGES else lvStyle := lvStyle and Not LVS_EX_SUBITEMIMAGES; SendMessage(LV.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lvStyle); If SubImagesOn Then begin LV_Item.mask := LVIF_IMAGE; LV_Item.iSubItem := Column; LV_Item.iItem := Index - 1; LV_Item.iImage := Image; end; SendMessage(LV.Handle, LVM_SETITEM, (Index - 1), Integer(@LV_Item)); LV.Refresh; end; end. Mehrere..
Delphi-Quellcode:
ImageListe auf die Form klatschen diese dem ListView zuweisen und zwei Icon in Checkbox Design einfügen.
if Checked then
begin SetLVSubImages(ListView1, 2, 1, 1, True); SetLVSubImages(ListView1, 2, 2, 1, True); SetLVSubImages(ListView1, 3, 2, 1, True); end else begin SetLVSubImages(ListView1, 2, 1, 0, True); SetLVSubImages(ListView1, 2, 2, 0, True); SetLVSubImages(ListView1, 3, 2, 0, True); end; Icon 0 Unchecked Icon 1 Checked. Dann mit den Button ein /ausschalten. Siehe Anhang |
AW: ListView Spalte mit checkbox VCL
Die Winapi ist da gar nicht vonnöten. Das mit den Subimages macht das VCL-Control schon von allein. Das Image für die jeweilige Spalte wird dann über TListItem.SubItemImage oder im Event TListView.OnGetSubItemImage bestimmt.
|
AW: ListView Spalte mit checkbox VCL
Zitat:
Welchen Weg man einschlägt dürfte doch egal sein. :wink: So lernt er noch was im Hintergrund sich so alles abspielt die VCL macht nichts anderes. EDIT: Aber wenn es nicht gewünscht ist kann ich es gerne wieder löschen. |
AW: ListView Spalte mit checkbox VCL
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz