首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

TreeView中嵌入CheckBox 怎么使CheckBox Enable为False

2012-02-28 
TreeView中嵌入CheckBox 如何使CheckBox Enable为False下面的代码实现TreeView中嵌入CheckBox,但如何使Che

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; 

热点排行