读书人

TreeView中嵌入CheckBox 怎么使CheckB

发布时间: 2012-02-28 13:06:35 作者: rapoo

TreeView中嵌入CheckBox 如何使CheckBox Enable为False
下面的代码实现TreeView中嵌入CheckBox,但如何使Checkbox的Enable变为False,即单击时无效,我只想用它查看已经选择的状态

function TreeNodeGetChecked(mTreeNode: TTreeNode): Boolean;
var
vTVItem: TTVItem;
begin
Result := True;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
if TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then
Result := (vTVItem.State and IndexToStateImageMask(2)) > 0; //0: None 1: False 2: True
end; { TreeNodeGetChecked }

function TreeNodeSetChecked(mTreeNode: TTreeNode; mChecked: Boolean): Boolean;
var
vTVItem: TTVItem;
begin
Result := False;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem);
if not TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then Exit;
vTVItem.stateMask := TVIS_STATEIMAGEMASK;
vTVItem.state := IndexToStateImageMask(Succ(Ord(mChecked)));
Result := TreeView_SetItem(mTreeNode.TreeView.Handle, vTVItem);
end; { TreeNodeSetChecked }

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure pSelect(mTreeNode: TTreeNode; mChecked: Boolean);
var
I: Integer;
begin
TreeNodeSetChecked(mTreeNode, mChecked);
for I := 0 to mTreeNode.Count - 1 do pSelect(mTreeNode[I], mChecked);
end;

procedure pSelectYes(mTreeNode: TTreeNode);
begin
while Assigned(mTreeNode.Parent) and


not TreeNodeGetChecked(mTreeNode.Parent) do begin
TreeNodeSetChecked(mTreeNode.Parent, True);
mTreeNode := mTreeNode.Parent;
end;
end;

procedure pSelectNo(mTreeNode: TTreeNode);
var
I: Integer;
begin
if Assigned(mTreeNode.Parent) and TreeNodeGetChecked(mTreeNode.Parent) then begin
for I := 0 to mTreeNode.Parent.Count - 1 do
if TreeNodeGetChecked(mTreeNode.Parent[I]) then Exit;
TreeNodeSetChecked(mTreeNode.Parent, False);
pSelectNo(mTreeNode.Parent);
end;
end;

var
vTreeNode: TTreeNode;
begin
//Edit1.Text := DateTimeToSTr(Now);
if not (htOnStateIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
TreeNodeSetChecked(vTreeNode, TreeNodeGetChecked(vTreeNode));
if not TreeNodeGetChecked(vTreeNode) then
pSelectNo(vTreeNode)
else pSelectYes(vTreeNode);
end;

[解决办法]
[code=Delphi(Pascal)][/code]
function TreeNodeGetChecked(mTreeNode: TTreeNode): Boolean;
var
vTVItem: TTVItem;
begin
Result := True;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
if TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then
Result := (vTVItem.State and IndexToStateImageMask(2)) > 0; //0: None 1: False 2: True


end; { TreeNodeGetChecked }

function TreeNodeSetChecked(mTreeNode: TTreeNode; mChecked: Boolean): Boolean;
var
vTVItem: TTVItem;
begin
Result := False;
if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
vTVItem.mask := TVIF_STATE;
vTVItem.hItem := mTreeNode.ItemId;
TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem);
if not TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then Exit;
vTVItem.stateMask := TVIS_STATEIMAGEMASK;
vTVItem.state := IndexToStateImageMask(Succ(Ord(mChecked)));
Result := TreeView_SetItem(mTreeNode.TreeView.Handle, vTVItem);
end; { TreeNodeSetChecked }

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure pSelect(mTreeNode: TTreeNode; mChecked: Boolean);
var
I: Integer;
begin
TreeNodeSetChecked(mTreeNode, mChecked);
for I := 0 to mTreeNode.Count - 1 do pSelect(mTreeNode[I], mChecked);
end;

procedure pSelectYes(mTreeNode: TTreeNode);
begin
while Assigned(mTreeNode.Parent) and
not TreeNodeGetChecked(mTreeNode.Parent) do begin
TreeNodeSetChecked(mTreeNode.Parent, True);
mTreeNode := mTreeNode.Parent;
end;
end;

procedure pSelectNo(mTreeNode: TTreeNode);
var
I: Integer;
begin
if Assigned(mTreeNode.Parent) and TreeNodeGetChecked(mTreeNode.Parent) then begin
for I := 0 to mTreeNode.Parent.Count - 1 do
if TreeNodeGetChecked(mTreeNode.Parent[I]) then Exit;
TreeNodeSetChecked(mTreeNode.Parent, False);
pSelectNo(mTreeNode.Parent);
end;
end;

var
vTreeNode: TTreeNode;
begin
//Edit1.Text := DateTimeToSTr(Now);
if not (htOnStateIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
TreeNodeSetChecked(vTreeNode, TreeNodeGetChecked(vTreeNode));
if not TreeNodeGetChecked(vTreeNode) then
pSelectNo(vTreeNode)
else pSelectYes(vTreeNode);
end;
[解决办法]

Delphi(Pascal) code
function       TreeNodeGetChecked(mTreeNode:       TTreeNode):       Boolean; var     vTVItem:       TTVItem; begin     Result       :=       True;     if       not       Assigned(mTreeNode)       or       not       Assigned(mTreeNode.TreeView)       then       Exit;     vTVItem.mask   :=   TVIF_STATE;     vTVItem.hItem   :=   mTreeNode.ItemId;     if   TreeView_GetItem(mTreeNode.TreeView.Handle,     vTVItem)   then         Result   :=   (vTVItem.State   and   IndexToStateImageMask(2))   >   0;       //0:       None       1:       False       2:       True end;       {       TreeNodeGetChecked       } function       TreeNodeSetChecked(mTreeNode:       TTreeNode;       mChecked:       Boolean):       Boolean; var     vTVItem:   TTVItem; begin     Result   :=   False;     if   not   Assigned(mTreeNode)   or   not   Assigned(mTreeNode.TreeView)   then   Exit;         vTVItem.mask   :=   TVIF_STATE;         vTVItem.hItem   :=   mTreeNode.ItemId;         TreeView_GetItem(mTreeNode.TreeView.Handle,       vTVItem);         if   not   TreeView_GetItem(mTreeNode.TreeView.Handle,       vTVItem)       then       Exit;         vTVItem.stateMask       :=       TVIS_STATEIMAGEMASK;         vTVItem.state       :=       IndexToStateImageMask(Succ(Ord(mChecked)));         Result       :=       TreeView_SetItem(mTreeNode.TreeView.Handle,       vTVItem);     end;       {       TreeNodeSetChecked       } procedure   TForm1.TreeView1MouseDown(Sender:   TObject;   Button:   TMouseButton;     Shift:   TShiftState;   X,   Y:   Integer);     procedure       pSelect(mTreeNode:       TTreeNode;       mChecked:       Boolean);     var             I:       Integer;     begin             TreeNodeSetChecked(mTreeNode,       mChecked);             for       I       :=       0       to       mTreeNode.Count       -       1       do       pSelect(mTreeNode[I],       mChecked);     end;     procedure       pSelectYes(mTreeNode:       TTreeNode);     begin             while       Assigned(mTreeNode.Parent)       and                     not       TreeNodeGetChecked(mTreeNode.Parent)       do       begin                     TreeNodeSetChecked(mTreeNode.Parent,       True);                     mTreeNode       :=       mTreeNode.Parent;             end;     end;     procedure       pSelectNo(mTreeNode:       TTreeNode);     var             I:       Integer;     begin             if       Assigned(mTreeNode.Parent)       and       TreeNodeGetChecked(mTreeNode.Parent)       then       begin                     for       I       :=       0       to       mTreeNode.Parent.Count       -       1       do                             if       TreeNodeGetChecked(mTreeNode.Parent[I])       then       Exit;                     TreeNodeSetChecked(mTreeNode.Parent,       False);                     pSelectNo(mTreeNode.Parent);             end;     end;     var             vTreeNode:       TTreeNode;     begin         //Edit1.Text   :=   DateTimeToSTr(Now);             if       not       (htOnStateIcon       in       TTreeView(Sender).GetHitTestInfoAt(X,       Y))       then       Exit;             vTreeNode       :=       TTreeView(Sender).GetNodeAt(X,       Y);             TreeNodeSetChecked(vTreeNode,     TreeNodeGetChecked(vTreeNode));             if       not       TreeNodeGetChecked(vTreeNode)       then                     pSelectNo(vTreeNode)             else       pSelectYes(vTreeNode);     end; 

读书人网 >.NET

热点推荐