这是我找来的一端代码,希望可以帮助你
重载TreeView的CreateParams:
type
TCheckBoxTreeView = class(TTreeView)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
{ TVS_CHECKBOXES declared in CommCtrl }
end;如果要Check这个CheckBox,可以用下面的代码:
function 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 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;
可以做成事件和封装成一个类:
private OldState :Boolean;procedure Change(Node: TTreeNode); override;
begin
inherited Change(Node);
OldState := IsNodeChecked(Node);
end;procedure Click; override;
var
NewState :Boolean;
begin
inherited Click;
NewState := IsNodeChecked(Self.Selected);
if NewState = OldState then Exit;
if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()
else if (not NewState) and Assigned(OnNodeUnChecked) then
OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
end;
重载TreeView的CreateParams:
type
TCheckBoxTreeView = class(TTreeView)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
{ TVS_CHECKBOXES declared in CommCtrl }
end;如果要Check这个CheckBox,可以用下面的代码:
function 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 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;
可以做成事件和封装成一个类:
private OldState :Boolean;procedure Change(Node: TTreeNode); override;
begin
inherited Change(Node);
OldState := IsNodeChecked(Node);
end;procedure Click; override;
var
NewState :Boolean;
begin
inherited Click;
NewState := IsNodeChecked(Self.Selected);
if NewState = OldState then Exit;
if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()
else if (not NewState) and Assigned(OnNodeUnChecked) then
OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
end;
解决方案 »
- FillRect(Canvas.Handle, LTextRect, Clblue);为什么 无效?大侠指点下
- 如何将oracle数据库中的时间字段里的值增加8个小时呢
- 帮助看这么一段代码(让窗口无焦点)怎么不行
- 救命。。。现在有两台机器一台是中文操作系统一台是日文操作系统,
- 在delphi中使用ado如何调用oracle的存储过程(菜鸟问题,不要见笑)
- qrexpr的显示不了统计数据
- 新手上路……
- 中國程序員隻會做數據庫,相信這個如此實用的東東沒幾個會。。。。。
- 如何通过PopupMenu动态创建TreeView?
- *** 问题求解 重分相赠 ***
- 问题:HBitmap转为TJpeg
- createoleobject的使用?
谢谢你的大力支持
如果我要选择某个checkbox好象不必向你那么麻烦
我遇到的问题是动态建树,树我可以建,就是节点前没有checkbox这个复选框
treeview1:TCheckBoxTreeView
或者你可以找到raize这个控件包的话,上面有这个控件
再次感谢
我用的是fctreeview
动态建树很简单 可以用 treeview1.Items.AddChild() 等建立起来,
复选框,我的办法是:
自己画两个图标,一个是方框,一个是方框加钩(选中),
建树时给每个节点指定 图标
node.ImageIndex :=0;
编辑onchange事件,改变选中节点的图标;
效果不错!
tempnode2,tempnode3:Ttreenode;
peno:^integer;
begin
treeview1.Items.Clear;
if not atstation.Active then
atstation.Open else
atstation.First;
while not atstation.Eof do
begin
tempNODE1:=treeview1.Items.Add(treeview1.selected,atstationsname.AsString);
tempnode1.ImageIndex:=13;
tempnode1.SelectedIndex:=13; getmem(peno,sizeof(peno));
peno^:=atstationsno.asinteger;
// peno:=@eno;
tempnode1.Data:=peno;
// tempnode1.EditText:=false;
aq1.close;
aq1.sql.clear;
aq1.sql.add('select kno,kname from eqkind where sno='+atstationsno.AsString+ ' order by kno');
aq1.Prepared;
aq1.open; while not aq1.eof do
begin
tempnode2:=treeview1.Items.AddChild(tempnode1,aq1.fields[1].asstring);
getmem(peno,sizeof(peno));
peno^:=aq1.Fields[0].asinteger;
tempnode2.Data:=peno; tempnode3:=treeview1.Items.AddChild(tempnode2,'A相');
getmem(peno,sizeof(peno)); //将编号存入data pointer
peno^:=aq1.Fields[0].asinteger*10+1;
tempnode3.Data:=peno;
tempnode3:=treeview1.Items.AddChild(tempnode2,'B相'); getmem(peno,sizeof(peno));
peno^:=aq1.Fields[0].asinteger*10+2;
tempnode3.Data:=peno;
tempnode3:=treeview1.Items.AddChild(tempnode2,'C相'); getmem(peno,sizeof(peno));
peno^:=aq1.Fields[0].asinteger*10+3;
tempnode3.Data:=peno;
aq1.next;
end; atstation.Next;
end;
aq1.close;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
IF node.ImageIndex=0 THEN
begin
node.ImageIndex:=1;
node.SelectedIndex:=1;
end;.........