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;