AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView Spalte mit checkbox VCL

Ein Thema von Rolandrevolvermann · begonnen am 3. Nov 2021 · letzter Beitrag vom 3. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2      
Rolandrevolvermann

Registriert seit: 17. Jan 2019
30 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 08:51
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

Geändert von Rolandrevolvermann ( 3. Nov 2021 um 09:02 Uhr) Grund: Rechtschreibung
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#2

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:00
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolandrevolvermann

Registriert seit: 17. Jan 2019
30 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:03
Ja, hatte falschen Code kopiert. Habe es gerade korrigiert.
  Mit Zitat antworten Zitat
Rolandrevolvermann

Registriert seit: 17. Jan 2019
30 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:12
Angezeigt wird diese Objektinstanz aber nie, auch nicht wenn es eine TCheckBox ist.
Das habe ich auch festgestellt

Hilfreich wäre ein Tipp WIE die Checkbox dargestellt wird
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#5

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:23
TListView hat ein Property CheckBoxes. Damit kann man aber eben nur eine Checkbox in der ersten Spalte anzeigen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolandrevolvermann

Registriert seit: 17. Jan 2019
30 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:28
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.
  Mit Zitat antworten Zitat
Rolandrevolvermann

Registriert seit: 17. Jan 2019
30 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:36
PS: Könnte man evtl. als Workaround ein Bild in eine Spalte geben und über Klick Event das Bild wechseln?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#8

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 09:42
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 11:14
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

Geändert von venice2 ( 3. Nov 2021 um 22:00 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#10

AW: ListView Spalte mit checkbox VCL

  Alt 3. Nov 2021, 14:22
Einfaches Beispiel.
So könnte man das machen unter VCL (Nicht mein Ding)

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

Geändert von venice2 (10. Nov 2021 um 17:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
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