Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ListView Spalte mit checkbox VCL (https://www.delphipraxis.net/209159-listview-spalte-mit-checkbox-vcl.html)

Rolandrevolvermann 3. Nov 2021 08:51

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:
mybox := Tcheckbox.create(self);
LItem.SubItems.AddObject('',mybox);
Kompiliert wird das, aber eben wie gesagt nicht angezeigt. Fehlt ein Update oder irgendetwas ind er Art?

Vielen Dank im Voraus und viele Grüße
Roland

Uwe Raabe 3. Nov 2021 09:00

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.

Rolandrevolvermann 3. Nov 2021 09:03

AW: ListView Spalte mit checkbox VCL
 
Ja, hatte falschen Code kopiert. Habe es gerade korrigiert.

Rolandrevolvermann 3. Nov 2021 09:12

AW: ListView Spalte mit checkbox VCL
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1496999)
Angezeigt wird diese Objektinstanz aber nie, auch nicht wenn es eine TCheckBox ist.

Das habe ich auch festgestellt :thumb:

Hilfreich wäre ein Tipp WIE die Checkbox dargestellt wird :-D

Uwe Raabe 3. Nov 2021 09:23

AW: ListView Spalte mit checkbox VCL
 
TListView hat ein Property CheckBoxes. Damit kann man aber eben nur eine Checkbox in der ersten Spalte anzeigen.

Rolandrevolvermann 3. Nov 2021 09:28

AW: ListView Spalte mit checkbox VCL
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497004)
TListView hat ein Property CheckBoxes. Damit kann man aber eben nur eine Checkbox in der ersten Spalte anzeigen.

Ja, das habe ich auch bereits herausgefunden.


Hilft aber leider auch nicht bei meinem Problem, die checkbox dynamisch in eine bestimmte Spalte zu packen.

Rolandrevolvermann 3. Nov 2021 09:36

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?

Uwe Raabe 3. Nov 2021 09:42

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.

venice2 3. Nov 2021 11:14

AW: ListView Spalte mit checkbox VCL
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497011)
Dann musst du das vermutlich über OwnerDraw selbst implementieren.

Jep.

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:
  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);
Aber es sollte dich niemand davon abhalten es einfach zu versuchen.
Viel glück dabei.

EDIT:
Zitat:

PS: Könnte man evtl. als Workaround ein Bild in eine Spalte geben und über Klick Event das Bild wechseln?
Ja das geht wenn man sich der LVS_EX Styles bedient siehe LVS_EX_SUBITEMIMAGES

venice2 3. Nov 2021 14:22

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:
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.
Edit:
Mehrere..
Delphi-Quellcode:
  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;
ImageListe auf die Form klatschen diese dem ListView zuweisen und zwei Icon in Checkbox Design einfügen.
Icon 0 Unchecked
Icon 1 Checked.

Dann mit den Button ein /ausschalten.

Siehe Anhang


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz