Delphi-PRAXiS
Seite 2 von 3     12 3      

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 CheckBoxen disablen (https://www.delphipraxis.net/28959-listview-checkboxen-disablen.html)

Nothine 2. Sep 2004 12:07

Re: ListView CheckBoxen disablen
 
erstell dir doch n eigenes panel oder ähnliches das eine dynamische liste von checkboxen verwaltet, das geht halbwegs schnell und sollte auch nich das problem darstellen...

mirage228 2. Sep 2004 12:08

Re: ListView CheckBoxen disablen
 
Zitat:

Zitat von Helmi
mmmh
shit

muss ich mir was anderes einfallen lassen

Du könntest versuchen mit FindWindowEx oder EnumChildWindows versuchen, die CheckBox zu finden und dann per API diese zu disablen.

mfG
mirage228

Helmi 2. Sep 2004 12:09

Re: ListView CheckBoxen disablen
 
und wie macht mann das mirage228??

mirage228 2. Sep 2004 12:18

Re: ListView CheckBoxen disablen
 
Zitat:

Zitat von Helmi
und wie macht mann das mirage228??

Hier im Forum findest du unmengen an Codes, wie man Kindfenster (in dem Fall die Checkboxes) eines Fensters (hier der ListView) findest.
Wenn Du erstmal das Handle hast, kannst du mit Entsprechenden API Funktion den Stil WS_ENABLED von der Checkbox "wegnehmen".

mfG
mirage228

Robert_G 2. Sep 2004 15:07

Re: ListView CheckBoxen disablen
 
Ich glaube es gibt hier keinen Grund sich den Code mit hässlichen API Befehlen oder FindWindow zu versaubeuteln. ;)

Ich habe gerade keine Delphi zur Hand, ich denke aber mal, dass es auch in Delphi einen Event á la TListView.ItemCheck gibt. ;)
Dort könntest du einfach ein Verändern des Wertes verhindern.

Da ich jetzt nicht weiß wie es in Delphi aussieht, habe ich's mal in C# geschrieben:
Code:
     void lvTestItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
     {
       // Irgendeine Liste, in der die Indizes der Items stehen,
       // deren CheckBoxes nicht geändert werden dürfen
       ArrayList Indices2BeDisabled = new ArrayList();

       Indices2BeDisabled.AddRange(new int[3] { 1, 3, 5 });
 
       if (Indices2BeDisabled.Contains(e.Index) )
         e.NewValue = e.CurrentValue;
     }

Helmi 2. Sep 2004 15:13

Re: ListView CheckBoxen disablen
 
C kann ich ned entziffern :-(

Robert_G 2. Sep 2004 18:33

Re: ListView CheckBoxen disablen
 
Zitat:

Zitat von Helmi
C kann ich ned entziffern :-(

Na komm schon, das war doch noch sehr simpel... ;)


Nachdem ich mich vor ein D7 geschwungen hatte, musst ich feststellen: :shock: Da gibt's ja keinerlei Implementierung zum Abfangen eines Klicks auf die Checkboxes! :evil:

Auch ein Blick in die Soßen der VCL brachte da nichts "hübsches" hervor"
Zum Bleistift gibt es noch nicht mal einen HitTest für die CheckBoxes!
Zitat:

Zitat von VCL
Delphi-Quellcode:
  THitTest = (htAbove, htBelow, htNowhere, htOnItem, htOnButton, htOnIcon,
    htOnIndent, htOnLabel, htOnRight, htOnStateIcon, htToLeft, htToRight);

Da aber die CheckBoxes wie ein StateIcon funktionieren, können wir das verwenden.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    ...
  private Indices2BeDisabled: set of 0..255;
  ...
  end;
...
procedure TfrmDoSomething;
begin
  ...
  Indices2BeDisabled := [1, 3, 5];
  ...
end;

procedure TfrmTest.lvTestChanging(Sender: TObject; Item: TListItem;
  Change: TItemChange; var AllowChange: Boolean);
begin
  AllowChange := not (TListView(Item.ListView).Checkboxes and
                      (ctState = Change ) and // StateIcon == CheckBox *g*
                      (Item.Index in Indices2BeDisabled));

end;
Damit könntest du festlegen bei welchen Items der User die CheckBox nicht setzen darf.

Nachtrag: Da der Typ SET nur 255 Elemente enthalten darf, würden damit auch nur 255 disabled Items möglich sein.

Helmi 2. Sep 2004 20:54

Re: ListView CheckBoxen disablen
 
hallo Robert,

danke für deinen Code
des muss ich mir mal zu Gemüte führen...

aber wegen deines "Problems" mit dem Klick auf die CheckBox...
ich hab da was bei unseren Schweizer Freunden gesehen

Schweizer ListView

mfg
Helmi

Robert_G 2. Sep 2004 21:04

Re: ListView CheckBoxen disablen
 
Zitat:

Zitat von Helmi
aber wegen deines "Problems" mit dem Klick auf die CheckBox...
ich hab da was bei unseren Schweizer Freunden gesehen.

Wenn du alle CheckBoxes deaktivieren willst würde doch das hier im OnChange reichen das reichen.
Delphi-Quellcode:
  AllowChange := not (TListView(Item.ListView).Checkboxes and (ctState = Change ));
So ersparst du dem Programm die unötigen Aufrufe von GetItemAt & GetHitTest. ;)


Willst du aber, wie ich annnahm, nur bestimmte CheckBoxes deaktivieren willst kommst du mit meinem vorherigen Post besser weg.
Für Items.Count > 255 müsstest du ein array of boolean statt dem set nehmen.

Helmi 2. Sep 2004 21:09

Re: ListView CheckBoxen disablen
 
:love: ne ne -

entweder alle oder gar keine :-)

kannst du mir da vielleicht mal kurz ein kleines beispiel-Projekt machen?
(*megaliebguck*) :love:

mfg
Helmi


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 Uhr.
Seite 2 von 3     12 3      

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