const
TVS_CHECKBOXES=$00000100;
procedure SetComCtrlStyle(WinCtrl:TWinControl;Value:Integer;UseStyle:Boolean);
var
Style:Integer;
begin
if WinCtrl.HandleAllocated then
begin
Style:=GetWindowLong(WinCtrl.Handle,GWL_STYLE);
if not UseStyle then
Style:=Style and not Value
else Style:=Style or Value;
SetWindowLong(WinCtrl.Handle,GWL_STYLE,Style);
end;
end;procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
SetComCtrlStyle(TreeView1,TVS_CHECKBOXES,True);
end;
TVS_CHECKBOXES=$00000100;
procedure SetComCtrlStyle(WinCtrl:TWinControl;Value:Integer;UseStyle:Boolean);
var
Style:Integer;
begin
if WinCtrl.HandleAllocated then
begin
Style:=GetWindowLong(WinCtrl.Handle,GWL_STYLE);
if not UseStyle then
Style:=Style and not Value
else Style:=Style or Value;
SetWindowLong(WinCtrl.Handle,GWL_STYLE,Style);
end;
end;procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
SetComCtrlStyle(TreeView1,TVS_CHECKBOXES,True);
end;
var
i: Integer;
SL : TStringList;
function GetTreeNodeChecked(Node: TTreeNode): Boolean;
var
vItem : TTVItem;
begin
vItem.mask := TVIF_HANDLE or TVIF_STATE;
vItem.hItem := Node.ItemId;
vItem.stateMask := TVIS_STATEIMAGEMASK;
TreeView_GetItem(Node.TreeView.Handle, vItem);
Result := Boolean((vItem.state shr 12)-1);
end;
function GetCheckedText(vNode: TTreeNode): Boolean;
var
Node: TTreeNode;
Begin
Result := False;
if vNode.HasChildren then
begin
Node := vNode.GetFirstChild;//有子節點,則忽略此節點,遍歷子節點
while Node <> nil do
begin
GetCheckedText;
Node := vNode.GetNextChild(Node);
end;
end
else
begin
Result := True;
if GetTreeNodeChecked(vNode) then//選中狀態
SL.Add(vNode.Text);
end;
end;
begin
sl := TStringList.Create;
for i:=0 to TreeView1.Items.Count-1 do
begin
GetCheckedText(TreeView1.Items[i]);
end;
end;代碼未經測試,請參考
unit CheckTreeview;interfaceuses
Windows, Messages, SysUtils, Classes, Controls,Commctrl,ComCtrls;
const
TVIS_CHECKED = $2000;
type
TCheckTreeview = class(TTreeView)
private
{ Private declarations }
protected
{ Protected declarations }
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
function IsChecked(Node :TTreeNode) :Boolean;
procedure SetChecked(Node :TTreeNode; Checked :Boolean);
published
{ Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Standard', [TCheckTreeview]);
end;{ TCheckTreeview }procedure TCheckTreeview.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
end;function TCheckTreeview.IsChecked(Node: TTreeNode): Boolean;
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 TCheckTreeview.SetChecked(Node: TTreeNode; Checked: Boolean);
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;
end.