Autor Beitrag
Tendl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Do 30.10.03 16:36 
Sorry,
ich finde es einfach nicht. Welches Event zeigt mir bei einem Treeview mit
Checkboxen eine Änderung in der Checkbox an?

Danke
Thomas
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 03.11.03 10:46 
Meisnt du vielleicht die tListView? Eine tTreeView kann doch keine CheckBoxen anzeigen, oder?

Gruß
Tino
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 03.11.03 11:38 
PSDK (Tree-View Control Window Styles) hat folgendes geschrieben:
TVS_CHECKBOXES
Version 4.70. Enables check boxes for items in a tree-view control. A check box is displayed only if an image is associated with the item. When set to this style, the control effectively uses DrawFrameControl to create and set a state image list containing two images. State image 1 is the unchecked box and state image 2 is the checked box. Setting the state image to zero removes the check box altogether. For more information, see Working with state image indexes.
Version 5.80. Displays a check box even if no image is associated with the item.


Once a tree-view control is created with this style, the style cannot be removed. Instead, you must destroy the control and create a new one in its place. Destroying the tree-view control does not destroy the check box state image list. You must destroy it explicitly. Get the handle to the state image list by sending the tree-view control a TVM_GETIMAGELIST message. Then destroy the image list with ImageList_Destroy.


If you want to use this style, you must set the TVS_CHECKBOXES style with SetWindowLong after you create the treeview control, and before you populate the tree. Otherwise, the checkboxes might appear unchecked, depending on timing issues.

hier nachzulesen
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 03.11.03 11:47 
Aha... Danke für die Info!

Gruß
Tino
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Di 04.11.03 09:14 
Titel: Schwache Lösung mit OnClick
Meine weiteren Versuche haben ergeben, daß das einzige verwendbare Ereignis OnClick ist. Leider gibt es keine Möglichkeit(?) herauszufinden, ob sich der Click auf die Checkbox bezogen hat oder nur den Treenode selektiert oder expandiert hat. Bei meinem aktuellen Projekt ist das nicht so tragisch, hätte mich einfach nur interessiert wie es elegant funktioniert.
Wenn noch jemand etwas einfällt wäre das super.

Viel Spaß
Thomas
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 04.11.03 09:43 
Titel: Re: Schwache Lösung mit OnClick
Tendl hat folgendes geschrieben:
Leider gibt es keine Möglichkeit(?) herauszufinden, ob sich der Click auf die Checkbox bezogen hat oder nur den Treenode selektiert oder expandiert hat.

Vielleicht hilft da die Methode GetHitTestInfoAt weiter?

Gruß
Tino
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.11.03 16:01 
Würde ich auch vorschlagen. Ich habe ähnliches bei einer List-View gemacht. Die hat auch nicht reagiert, als ich munter in die Checkboxen reinklickte. Das war dann die Lösung ("OnMouseDown"):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TYAAMForm.lv1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ht : THitTests;
  li : TListItem;
begin
  // Checkbox angeklickt?
  ht := lv1.GetHitTestInfoAt(X,Y);
  li := lv1.GetItemAt(X,Y);

  // der "Hit" muss auf dem "StateIcon" gewesen
  // sein (quasi die Checkbox)
  if(htOnStateIcon in ht) and
  // und es sollte auch ein Item ausgewählt
  // worden sein
    (li <> nil) then
  begin
    // in dem Fall dann "li.Checked" prüfen
    // und irgendwas damit anstellen
    if(li.Checked) Do_Something;
  end;
end;

Wie gesagt, das gilt für die List-View. Aber ich denke, man kann´s mehr oder weniger auch für den TV übernehmen.

Gruß.


Zuletzt bearbeitet von MathiasSimmack am Mi 05.11.03 14:50, insgesamt 1-mal bearbeitet
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Mi 05.11.03 10:50 
Eure Vorschläge klingen ziemlich gut, werde sie heute noch ausprobieren
und ggf. ein Code-Sample posten.

Danke
Thomas
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Mi 05.11.03 11:03 
Hallo Mathias,
was ist genau die globale Variable toc. Wo werden selcted und selected.data vorbelegt?

Danke
Thomas
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.11.03 14:49 
Ach so, ja. "toc" ist der Name meines Tree-View gewesen, und "toc.Selected.Data" bezieht sich auf ein im Knoten gespeichertes Objekt. Kannst du im Prinzip ignorieren, da es in dem Fall (in meinem Programm) um zusätzliche Sachen ging, die ich aber aus dem geposteten Beispiel entfernt habe, weil sie nichts mit deinem Problem zu tun haben.
Habe auch den o.g. Code entsprechend bereinigt. ;)

"lv1" ist der Name meiner List-View. An dem Punkt müsstest du ansetzen und probieren, ob sich das für den Tree-View umbauen lässt.

Gruß.
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Fr 07.11.03 13:02 
Hier also der entsprechende Code für den Treeview:

Die Procedure wird mit dem Ereignis OnMouseDown aufgerufen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.analyse_treecheckbox(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ht: THitTests;
  node: TTreenode;
  checked: Boolean;

begin
  // Find Node
  node := form1.TreeView1.GetNodeAt(X, Y);
  if node = nil then exit;
  checked := form1.TreeView1.GetChecked(node);
  // Checkbox angeklickt?
  ht := form1.TreeView1.GetHitTestInfoAt(X, Y);
  // der "Hit" muss auf dem "StateIcon" gewesen
  // sein (quasi die Checkbox)
  if (htOnStateIcon in ht) then
  begin
    if not checked then
      showmessage('Uncheck Click auf Checkbox')
    else
      showmessage('Check Click auf Checkbox');
  end;
end;

Nochmals vielen Dank für die tolle Hilfe
Thomas

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.