Avatar billede hr__hallandsen Nybegynder
10. februar 2009 - 22:08 Der er 8 kommentarer og
1 løsning

TreeView med checkbokse

Hej

Jeg anvender følgende kode til at implementere et TreeView med checkbokse:

--------

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(TreeView1.Handle, GWL_STYLE,
  GetWindowLong(TreeView1.Handle, GWL_STYLE) OR TVS_CHECKBOXES);
  TreeView1.FullExpand;
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (TreeView1.RightClickSelect) or (Button = mbLeft) then
    if TreeView1.GetNodeAt(X, Y) <> nil then
      TreeView1.Selected :=  TreeView1.GetNodeAt(X, Y);
end;

--------

Jeg er dog stødt ind i følgende to problemer:

  - Hvordan checker/unchecker man en checkbox og finder ud af, om den er checked/unchecked?
  - Hvordan sætter man checkboksen i "firkant-mode" (= den tilstand, hvor checkboksen hverken er      checked/unchecked)?

H. Hallandsen
Avatar billede mbsnet Nybegynder
11. februar 2009 - 00:56 #1
//Læse/skrive checked state:

function nodeIsChecked(aNode:tTreeNode):boolean;
var tv:tTvItem;
begin
with aNode,tv do begin mask:=TVIF_STATE;hItem:=itemId;
  treeView_getItem(treeView.handle,tv);
  result:=(state and TVIS_CHECKED)=TVIS_CHECKED
end
end;

procedure nodeSetChecked(aNode:tTreeNode;const aState:boolean);
var tv:tTvItem;
begin fillChar(tv,sizeOf(tv),0);
with aNode,tv do begin hItem:=itemId;mask:=TVIF_STATE;
  stateMask:=TVIS_STATEIMAGEMASK;
  if aState then state:=TVIS_CHECKED else state:=TVIS_CHECKED shr 1;
  treeView_setItem(treeView.handle,tv)
end
end;

//men... se også...:
//http://delphi.about.com/od/vclusing/l/aa092104a.htm
Avatar billede mbsnet Nybegynder
11. februar 2009 - 00:59 #2
Ovenover de to funktioner, indsættes:

const
TVIS_CHECKED = $2000;
Avatar billede hr__hallandsen Nybegynder
17. februar 2009 - 13:37 #3
Tak, jeg har nu følgende kode:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CommCtrl, ComCtrls;

const
  TVIS_CHECKED = $2000;

function TForm1.nodeIsChecked(aNode:tTreeNode):boolean;
var tv:tTvItem;
begin
with aNode,tv do begin mask:=TVIF_STATE;hItem:=itemId;
  treeView_getItem(treeView.handle,tv);
  result:=(state and TVIS_CHECKED)=TVIS_CHECKED
end
end;

procedure TForm1.nodeSetChecked(aNode:tTreeNode;const aState:boolean);
var tv:tTvItem;
begin fillChar(tv,sizeOf(tv),0);
with aNode,tv do begin hItem:=itemId;mask:=TVIF_STATE;
  stateMask:=TVIS_STATEIMAGEMASK;
  if aState then state:=TVIS_CHECKED else state:=TVIS_CHECKED shr 1;
  treeView_setItem(treeView.handle,tv)
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(TreeView1.Handle, GWL_STYLE,
  GetWindowLong(TreeView1.Handle, GWL_STYLE) OR TVS_CHECKBOXES);
  TreeView1.FullExpand;
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (TreeView1.RightClickSelect) or (Button = mbLeft) then
    if TreeView1.GetNodeAt(X, Y) <> nil then
    begin
      TreeView1.Selected :=  TreeView1.GetNodeAt(X, Y);
      nodeSetChecked(TreeView1.GetNodeAt(X, Y), not nodeIsChecked(TreeView1.GetNodeAt(X, Y)));
    end;
end;

Nogen ide om, hvordan man kan fylde checkboksen helt ud for at vise at underliggende checkbokse både er checkede og uncheckede?

Har det, det kan lade sig gøre (i hvert fald under Vista)
Avatar billede hr__hallandsen Nybegynder
17. februar 2009 - 13:38 #4
Har det = har set
Avatar billede hr__hallandsen Nybegynder
17. februar 2009 - 14:08 #5
Lige en sidste ting

Når man klikker på fold ud/fold ind-knappen eller selve checkboksen skal nodeSetChecked ikke kaldes. Hvordan forhindrer jeg det?
Avatar billede mbsnet Nybegynder
18. februar 2009 - 08:07 #6
Hej.

For at deaktivere afkrydningsfelterne (grayed out), tror jeg ikke du kommer uden om, at gøre noget i stil med det link jeg sendte (hvor man selv vælger ikonerne, som vises i listen)..

Til det sidste (fold-ind/ud), kan du prøve med min test-kode..

//implementation...

const
TVIS_CHECKED = $2000;

function getNodeState(aNode:tTreeNode):boolean;
var tv:tTvItem;
begin
with aNode,tv do begin mask:=TVIF_STATE;hItem:=itemId;
  treeView_getItem(treeView.handle,tv);
  result:=(state and TVIS_CHECKED)=TVIS_CHECKED
end
end;

procedure setNodeState(aNode:tTreeNode;const aState:boolean);
var tv:tTvItem;
begin fillChar(tv,sizeOf(tv),0);
with aNode,tv do begin hItem:=itemId;mask:=TVIF_STATE;
  stateMask:=TVIS_STATEIMAGEMASK;
  if aState then state:=TVIS_CHECKED else state:=TVIS_CHECKED shr 1;
  treeView_setItem(treeView.handle,tv)
end
end;

function toggleNodeState(aNode:tTreeNode):boolean;
begin
result:=not getNodeState(aNode);
setNodeState(aNode,result);
end;

//------------------------------
//TForm1:

var
node1:tTreeNode;//flyt evt til "private" under formen

procedure TForm1.FormCreate(Sender: TObject);
begin
with treeView1,items do begin
  setWindowLong(handle,GWL_STYLE,getWindowLong(handle,GWL_STYLE) or TVS_CHECKBOXES);
  node1:=add(nil,'1');        //Add new node
  setNodeState(node1,true);  //Set state to checked
  addChild(node1,'1.1');      //Add child node into "node1"
  addChild(node1,'1.2');      //Add child node into "node1"
  add(nil,'2');              //Add new node
  fullExpand;
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if toggleNodeState then caption:='yes' else caption:='no'
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var hasSelection:boolean;
begin
with treeView1 do begin hasSelection:=selected<>nil;
  if hasSelection then caption:=selected.text else caption:=''
end
end;
Avatar billede hr__hallandsen Nybegynder
18. februar 2009 - 23:14 #7
Checkboksen skal ikke disables. Den skal være fyldt ud, så man kan se at kun nogle af subnode-checkboksene er checkede.
Avatar billede hr__hallandsen Nybegynder
14. maj 2009 - 21:23 #8
Læg et svar ... du får point for spm 1
Avatar billede hr__hallandsen Nybegynder
14. maj 2009 - 21:25 #9
Nå, nu kom jeg til at tage alle points ... opretter lige et nyt spm ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester