Delphi-PRAXiS

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/)
-   -   Delphi ListView und Checkboxen. RowSelect ausführen. (https://www.delphipraxis.net/147654-listview-und-checkboxen-rowselect-ausfuehren.html)

Jens Hartmann 13. Feb 2010 09:55


ListView und Checkboxen. RowSelect ausführen.
 
Hallo zusammen,

ich steh mal wieder auf der Leitung. Es wird wahrscheinlich ein ganz simple Lösung für mein Problem geben. Allerdings schaffe ich es seid gestern nicht, beim Klick in einen Checkbox einer ListView, die komplette Zeile zu Selektieren.

Es soll egal sein, ob die Checkbox Checked oder Unchecked ist. Es soll einfach nur wie beim klick in die Listview die entsprechende Zeile selektiert werden.

Hier mal mein derzeitiger Code...
Delphi-Quellcode:
procedure TMailSendenForm.lvGroupChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
  if lvGroup.Selected <> nil then
    begin
      if Change = ctState then
        if Item.Checked then
          begin
            Item.Selected := true;
          end;
    end;
end;
Allerdings ist hier das Problem, das somit in der Listview immer alle Selektiert bleiben die mal über die Checkbox selektiert wurden. Da ich aber MultiSelect = false habe, kommte es natürlich zum Stack überlauf.Gibt es da nicht irgendeine einfache Möglichkeit.

Ich will eigendlich nur, das beim Klick in die Checkbox die gesamte Zeile Selektiert wird aber auch immer max. 1 Zeile selektiert sein darf.

Danke schon mal für die Anregung

Gruß Jens

Andreas L. 13. Feb 2010 10:10

Re: ListView und Checkboxen. RowSelect ausführen.
 
Zitat:

Zitat von Jens Hartmann
Es soll egal sein, ob die Checkbox Checked oder Unchecked ist.

Dann muss
Delphi-Quellcode:
if Item.Checked then
schon mal raus sonst wird die Zeile nur markiert wenn die CheckBox ausgewählt wurde.
Zitat:

Allerdings ist hier das Problem, das somit in der Listview immer alle Selektiert bleiben die mal über die Checkbox selektiert wurden.
Bevor du Selected auf True setzt musst du alle Markierungen aufheben. Glaub das geht mit ListView1.ClearSelection;

Jens Hartmann 13. Feb 2010 10:28

Re: ListView und Checkboxen. RowSelect ausführen.
 
Zitat:

Zitat von Andreas
Bevor du Selected auf True setzt musst du alle Markierungen aufheben. Glaub das geht mit ListView1.ClearSelection;

Danke, das geht schon mal. Das mit dem Checked ist mir auch soweit klar. Aber wie kann ich dann über die Checkbox selektieren.
Ich kann ja mit dem Befehl
Delphi-Quellcode:
Item.Selected
Nur festlegen, das ein selektieren möglich ist.

Hawkeye219 13. Feb 2010 11:34

Re: ListView und Checkboxen. RowSelect ausführen.
 
Hallo Jens,

ich bevorzuge eigentlich das VirtualTreeView, deshalb kann ich nicht garantieren, dass der folgende Code immer fehlerfrei funktioniert:

Delphi-Quellcode:
type
  TForm1 = class (TForm)
    [..]
  private
    FWasChecked: Boolean;
  end;

procedure TForm1.ListViewChanging (Sender: TObject; Item: TListItem; Change: TItemChange;
  var AllowChange: Boolean);
begin
  FWasChecked := Assigned(Item) and Item.Checked;
end;

procedure TForm1.ListViewChange (Sender: TObject; Item: TListItem; Change: TItemChange);
begin
  if (Assigned(Item) and (Item.Checked <> FWasChecked)) then
    begin
      ListView.ItemFocused := Item;
      ListView.Selected := Item;
    end;
end;
Gruß Hawkeye

Jens Hartmann 13. Feb 2010 13:48

Re: ListView und Checkboxen. RowSelect ausführen.
 
Danke Hawkeye219,

geht so. Ich habe allerdings noch ein..
Delphi-Quellcode:
if lvGroup.Focused <> false then
vor deine Funktion gepackt, da sonst beim Prgrammstart durch das OnCreate schon der letzte eintrag den Selected Zustand erhält. Mit der unten ergänzten Version funktioniert es nun so, wie ich will.

Delphi-Quellcode:
procedure TMailSendenForm.lvGroupChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
if lvGroup.Focused <> false then
  begin
    if (Assigned(Item) and (Item.Checked <> FWasChecked)) then
      begin
        lvGroup.ItemFocused := Item;
        lvGroup.Selected := Item;
      end;
  end;
end;

procedure TMailSendenForm.lvGroupChanging(Sender: TObject; Item: TListItem;
  Change: TItemChange; var AllowChange: Boolean);
begin
if lvGroup.Focused <> false then
  FWasChecked := Assigned(Item) and Item.Checked;
end;
Danke und Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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-2025 by Thomas Breitkreuz