http://search.csdn.net/Expert/topic/2137/2137712.xml?temp=.6334497------------------zt自上面的连接//参考如下代码~~ 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; Template:integer; 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.Button1Click(Sender: TObject); begin TreeNodeSetChecked(TreeView1.Selected, True); end;procedure TForm1.Button2Click(Sender: TObject); begin TreeNodeSetChecked(TreeView1.Selected, False); end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if htOnStateIcon in TreeView1.GetHitTestInfoAt(X, Y) then Caption := BoolToStr(TreeNodeGetChecked(TreeView1.GetNodeAt(X, Y)), True) //TODO -oZswang -c事件 : 触发点击选择框 else Caption := ''; end;procedure TForm1.Button3Click(Sender: TObject); var I: Integer; begin Memo1.Clear; for I := 0 to TreeView1.Items.Count - 1 do if TreeNodeGetChecked(TreeView1.Items[I]) then Memo1.Lines.Add(TreeView1.Items[I].Text); end;
1stClass 4000 在www.51delphi.com有下载
TdxTreeView控件能满足你的要求
TCheckTreeNode = class(TTreeNode) private FChecked: Boolean; procedure SetChecked(const Value: Boolean); public property Checked: Boolean read FChecked write SetChecked; end; TCheckTreeView = class(TTreeView) protected procedure CreateWnd; override; procedure CreateCheckNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); end;procedure TCheckTreeNode.SetChecked(const Value: Boolean); function TreeNodeSetChecked(mTreeNode: TCheckTreeNode; mChecked: Boolean): Boolean; var vTVItem: TTVItem; begin Result := False; if not Assigned(mTreeNode) then Exit; FillChar(vTVItem, SizeOf(vTVItem), 0); with vTVItem do begin hItem := mTreeNode.ItemId; mask := TVIF_STATE; StateMask := TVIS_STATEIMAGEMASK; State := IndexToStateImageMask(Succ(Ord(mChecked))); Result := TreeView_SetItem(mTreeNode.Handle, vTVItem); end; end; procedure pSelect(mTreeNode: TCheckTreeNode; mChecked: Boolean); var I: Integer; begin for I := 0 to mTreeNode.Count - 1 do TCheckTreeNode(mTreeNode[I]).Checked := mChecked; end; procedure pSelectYes(mTreeNode: TCheckTreeNode); begin if Assigned(mTreeNode.Parent) then if not TCheckTreeNode(mTreeNode.Parent).Checked then begin TreeNodeSetChecked(TCheckTreeNode(mTreeNode.Parent), True); TCheckTreeNode(mTreeNode.Parent).FChecked := True; end; end; procedure pSelectNo(mTreeNode: TCheckTreeNode); var I: Integer; begin if Assigned(mTreeNode.Parent) and TCheckTreeNode(mTreeNode.Parent).Checked then begin for I := 0 to mTreeNode.Parent.Count - 1 do if TCheckTreeNode(mTreeNode.Parent[I]).Checked then Exit; TCheckTreeNode(mTreeNode.Parent).Checked := False; end; end; begin FChecked := Value; TreeNodeSetChecked(Self, Value); pSelect(Self, Value); if Value then pSelectYes(Self) else pSelectNo(Self); end;procedure TCheckTreeView.CreateWnd; begin inherited CreateWnd; SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or TVS_CHECKBOXES); end;procedure TCheckTreeView.CreateCheckNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); begin NodeClass := TCheckTreeNode; 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;
Template:integer;
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.Button1Click(Sender: TObject);
begin
TreeNodeSetChecked(TreeView1.Selected, True);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
TreeNodeSetChecked(TreeView1.Selected, False);
end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if htOnStateIcon in TreeView1.GetHitTestInfoAt(X, Y) then
Caption := BoolToStr(TreeNodeGetChecked(TreeView1.GetNodeAt(X, Y)), True)
//TODO -oZswang -c事件 : 触发点击选择框
else Caption := '';
end;procedure TForm1.Button3Click(Sender: TObject);
var
I: Integer;
begin
Memo1.Clear;
for I := 0 to TreeView1.Items.Count - 1 do
if TreeNodeGetChecked(TreeView1.Items[I]) then
Memo1.Lines.Add(TreeView1.Items[I].Text);
end;
private
FChecked: Boolean;
procedure SetChecked(const Value: Boolean);
public
property Checked: Boolean read FChecked write SetChecked;
end; TCheckTreeView = class(TTreeView)
protected
procedure CreateWnd; override;
procedure CreateCheckNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
end;procedure TCheckTreeNode.SetChecked(const Value: Boolean);
function TreeNodeSetChecked(mTreeNode: TCheckTreeNode; mChecked: Boolean): Boolean;
var
vTVItem: TTVItem;
begin
Result := False;
if not Assigned(mTreeNode) then Exit; FillChar(vTVItem, SizeOf(vTVItem), 0);
with vTVItem do
begin
hItem := mTreeNode.ItemId;
mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
State := IndexToStateImageMask(Succ(Ord(mChecked)));
Result := TreeView_SetItem(mTreeNode.Handle, vTVItem);
end;
end; procedure pSelect(mTreeNode: TCheckTreeNode; mChecked: Boolean);
var
I: Integer;
begin
for I := 0 to mTreeNode.Count - 1 do
TCheckTreeNode(mTreeNode[I]).Checked := mChecked;
end; procedure pSelectYes(mTreeNode: TCheckTreeNode);
begin
if Assigned(mTreeNode.Parent) then
if not TCheckTreeNode(mTreeNode.Parent).Checked then
begin
TreeNodeSetChecked(TCheckTreeNode(mTreeNode.Parent), True);
TCheckTreeNode(mTreeNode.Parent).FChecked := True;
end;
end; procedure pSelectNo(mTreeNode: TCheckTreeNode);
var
I: Integer;
begin
if Assigned(mTreeNode.Parent) and TCheckTreeNode(mTreeNode.Parent).Checked then
begin
for I := 0 to mTreeNode.Parent.Count - 1 do
if TCheckTreeNode(mTreeNode.Parent[I]).Checked then Exit;
TCheckTreeNode(mTreeNode.Parent).Checked := False;
end;
end;
begin
FChecked := Value;
TreeNodeSetChecked(Self, Value);
pSelect(Self, Value);
if Value
then pSelectYes(Self)
else pSelectNo(Self);
end;procedure TCheckTreeView.CreateWnd;
begin
inherited CreateWnd;
SetWindowLong(Handle, GWL_STYLE,
GetWindowLong(Handle, GWL_STYLE) or TVS_CHECKBOXES);
end;procedure TCheckTreeView.CreateCheckNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass := TCheckTreeNode;
end;