10. februar 2009 - 22:08Der 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)?
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
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)
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;
Nå, nu kom jeg til at tage alle points ... opretter lige et nyt spm ...
Synes godt om
Ny brugerNybegynder
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.