本人寻求:checkbox与treeview的节点事件连接的控件(即点击checkbox时同时触发treeview的onclick事件,并可得知treeview的当前节点对象)
解决方案 »
- delphi中如何把dbgrid中的记录打印出来?
- 如何实现NT服务程序可视化
- IT技术联盟---Delphi招人,散分
- 怎样自定义shape控件的OnMouseUp函数
- 简体系统写的程序怎么才能在繁体系统正常显示字体!
- 如何判断一个字符是否为数字,请高手指教,急!!
- 不知哪位高手会DELPHI的脚本问题!
- Interface not supported?
- 有什么办法可以控制EDIT中只能输入英文和数字,不能输入中文
- 如何在菜单中已调用存在的*.chm帮助文档?
- 关于TreeView和CheckBox的问题?????????????
- 偶要在对一个txt文件操作之前检测它是否已被其他程序占用,请各位指点
下载 http://www.vclxx.org/DELPHI/D32FREE/CHECKTREE.ZIP
Windows, Messages, SysUtils, Classes, Controls, ComCtrls,CommCtrl;{权限树}
type
TuckDroitTreeView = class(TTreeView)
private
FCheckBoxReadOnly : Boolean;
FOldState : Boolean;
FOnCheckedChange : TTVChangedEvent;
function IsNodeChecked(Node :TTreeNode) :Boolean;
function CheckDroitString(const DroitStr: String): Boolean;
procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure SetChildren(Node: TTreeNode; Checked: Boolean);
procedure SetParant(Node: TTreeNode; Checked: Boolean);
function GetDroitString: String;
procedure SetDroitString(DroitStr: String);
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
function Checked(Node: TTreeNode): Boolean;
procedure SetChecked(Node: TTreeNode; Checked: Boolean);
published
property CheckBoxReadOnly: Boolean read FCheckBoxReadOnly write FCheckBoxReadOnly;
property OnCheckedChange: TTVChangedEvent read FOnCheckedChange write FOnCheckedChange;
property DroitString: String read GetDroitString write SetDroitString;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TuckDroitTreeView]);
end;
//-----------------------------------------------------------------------------------
function TuckDroitTreeView.CheckDroitString(const DroitStr: String): Boolean;
var
I : Integer;
begin
Result := False;
if DroitStr = '' then Exit;
for I :=1 to Length(DroitStr) do begin
if not( (DroitStr[I] = '0') or (DroitStr[I] = '1') ) then begin
Result := False;
Exit;
end;
end;
Result := True;
end;//-----------------------------------------------------------------------------------
function TuckDroitTreeView.Checked(Node: TTreeNode): Boolean;
begin
Result := IsNodeChecked(Node);
end;//-----------------------------------------------------------------------------------
constructor TuckDroitTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCheckBoxReadOnly := False;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
end;//-----------------------------------------------------------------------------------
function TuckDroitTreeView.GetDroitString: String;
var
I : Integer;
begin
Result := '';
if Self.Items.Count < 1 then Exit;
for I :=0 to Self.Items.Count - 1 do begin
if Self.Checked(Self.Items[I]) then Result := Result + '1'
else Result := Result + '0';
end;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.SetDroitString(DroitStr: String);
var
I, Len : Integer;
begin
if Self.Items.Count < 1 then Exit;
if not CheckDroitString(DroitStr) then Exit;
for I :=0 to Self.Items.Count - 1 do
Self.SetChecked(Self.Items[I], False);
Len := Length(DroitStr);
for I :=0 to Self.Items.Count - 1 do begin
if I + 1 <= Len then begin
Self.SetChecked(Self.Items[I], (DroitStr[I+1]='1'));
end;
end;
end;//-----------------------------------------------------------------------------------
function TuckDroitTreeView.IsNodeChecked(Node: TTreeNode): Boolean;
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.SetChecked(Node: TTreeNode; Checked: Boolean);
begin
if Node <> nil then
SetNodeChecked(Node, Checked);
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.SetChildren(Node: TTreeNode; Checked: Boolean);
var
TmpNode : TTreeNode;
begin
TmpNode := Node.GetFirstChild;
while TmpNode <> nil do begin
Self.SetChecked(TmpNode, Checked);
if TmpNode.HasChildren then SetChildren(TmpNode, Checked);
TmpNode := Node.GetNextChild(TmpNode);
end;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.SetNodeChecked(Node: TTreeNode; Checked: Boolean);
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
FillChar(TvItem, SizeOf(TvItem), 0);
with TvItem do begin
hItem := Node.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked then
TvItem.State :=TVIS_CHECKED
else
TvItem.State :=TVIS_CHECKED shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
end;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.SetParant(Node: TTreeNode; Checked: Boolean);
var
TmpNode : TTreeNode;
begin
TmpNode := Node.Parent;
while TmpNode <> nil do begin
Self.SetChecked(TmpNode, Checked);
TmpNode := TmpNode.Parent;
end;
end;//-----------------------------------------------------------------------------------
procedure TuckDroitTreeView.WMLButtonDown(var Message: TWMLButtonDown);
var
TmpNode : TTreeNode;
OldState, bChecked : Boolean;
begin
TmpNode := Self.GetNodeAt(Message.XPos, Message.YPos);
if TmpNode <> nil then OldState := IsNodeChecked(TmpNode); inherited; if TmpNode <> nil then begin
if FCheckBoxReadOnly then
SetNodeChecked(TmpNode, OldState);
FOldState := IsNodeChecked(TmpNode);
//----
if TmpNode.HasChildren then
SetChildren(TmpNode, Self.Checked(TmpNode));
if TmpNode.Parent <> nil then begin
bChecked := Self.Checked(TmpNode);
if bChecked then SetParant(TmpNode, bChecked);
end;
//----
if Assigned(OnCheckedChange) then
if FOldState <> OldState then
OnCheckedChange(Self, TmpNode);
end;
end;end.
uses CommCtrl;function TreeNodeGetChecked(mTreeNode: TTreeNode): 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;
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.FormCreate(Sender: TObject);
begin
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle, GWL_STYLE) or TVS_CHECKBOXES);
end;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
if not (htOnStateIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
pSelect(vTreeNode, TreeNodeGetChecked(vTreeNode));
if not TreeNodeGetChecked(vTreeNode) then
pSelectNo(vTreeNode)
else pSelectYes(vTreeNode);
end;