怎样用少量的代码(简单的方法)让每一个节点存在一个复选框?
解决方案 »
- delphi用odac访问数据库!
- 想显示 版权所有©我的产品™ 却成了 版权所有?我的产品?
- 求和为什么会有这么大的误差?
- ◆◆【散分】祝 白雪公猪 生日快乐◆◆
- 如何将表中的某一个字段的所有值添加到ComboBox1中呢?
- 兄弟们,是死是活就看你们的拉!
- 请问TImageList.FileLoad的问题
- XE中字符串转换的问题
- 急如何解决安装LMD5。0时提示时间不对各位老大我急用呀!!!!!!!
- 关于关机和重启的问题!
- 我继承一个组件,当override它的一个方法时,想在这个方法中访问祖先的私有成员。请问如何办到呢?
- 关于组件问题,谁解决相送100分,并感激不尽!
(如果不使用第三方控件,要用Delphi自带的TreeView)
通过替换节点前的图片,我认为是比较简单的。
如果嫌麻烦的话就去Down一个控件,其实有些控件也是这样做的,界面上你是看不出来的. :)
**************
Manan Patel <[email protected]>
重载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;