請高手幫忙:如何禁用TreeView的TreeNode

hanks_gao 2009-03-02 04:08:42
各位大俠:
TreeView的TreeNode沒有Enable或則Disable屬性或則方法,請問有沒有什麽方法可以將一個TreeNode禁用掉啊?我的Delphi的版本是D6.
另外:下面的網址里有C++的實現,但是小弟對C++不了解,所以各位大俠可以把它翻譯成Delphi語言嗎?

謝謝!

http://www.ccrun.com/article.asp?i=1015&d=r2tf61#
...全文
327 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdmh 2009-03-04
  • 打赏
  • 举报
回复
在这个类中CheckTreeView,公布一个属性即可,FChecked,和两个私有函数GetChecked,SetChecked,这两个函数分别实现IsChecked,SetChecked的功能

property Checked:Boolean read GetChecked write SetCheked;
hanks_gao 2009-03-04
  • 打赏
  • 举报
回复
自己頂一個!
hanks_gao 2009-03-04
  • 打赏
  • 举报
回复
首先再次感謝大家的回答,不好意思的是分不多,請多包涵!

另外這個功能如果各位有遇到實現的,麻煩告知一聲,謝謝!
bdmh 2009-03-03
  • 打赏
  • 举报
回复

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
var
check:Boolean;
begin
check := IsChecked(Node);
if Integer(node.Data) = 0 then
begin
SetChecked(Node,check);
AllowChange := False;
end
else
begin
SetChecked(Node,True);//用自己需要的处理
end;
end;
IsChecked,SetChecked取自TCheckTreeview
bdmh 2009-03-03
  • 打赏
  • 举报
回复

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
if Integer(node.Data) = 0 then
begin
SetChecked(Node,False);
AllowChange := False;
end
else
begin
SetChecked(Node,True);
end;
end;

hanks_gao 2009-03-03
  • 打赏
  • 举报
回复
首先謝謝各位的回復,可是現在的問題是我的這個TreeView帶有CheckBox。參考各位的代碼是可以反灰顯示,但是CheckBox還是可以選擇的。

我現在把代碼貼出來(網上找的),希望能請教一下各位高手:如何禁用一個TreeNode,達到不能對禁用的TreeNode進行操作的功能?

再次感謝各位!



unit CheckTreeview;

interface

uses
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;

implementation

procedure 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.
bdmh 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hewei001 的回复:]
var AllowChange: Boolean);
begin
if Node.Text='1234' then
AllowChange:=False
else
AllowChange:=True;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Text='1234' then
self.TreeView1.Canvas.Brush.Color:=clBtnFace
end;
正解
[/Quote]

用node.text判断不好,不具备普遍性,通用性
天鸽 2009-03-03
  • 打赏
  • 举报
回复
var AllowChange: Boolean);
begin
if Node.Text='1234' then
AllowChange:=False
else
AllowChange:=True;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Text='1234' then
self.TreeView1.Canvas.Brush.Color:=clBtnFace
end;
正解
hanks_gao 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bdmh 的回复:]
除非你把他改装成自己的checktreeview吧
[/Quote]

這樣也可以,相當于在CheckTreeView中添加功能進來,可是我比較菜,所以幫忙一下了!如果嫌分少的話,可以再加!
謝謝!謝謝!
bdmh 2009-03-03
  • 打赏
  • 举报
回复
除非你把他改装成自己的checktreeview吧
bdmh 2009-03-03
  • 打赏
  • 举报
回复
这种实现不能
hanks_gao 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bdmh 的回复:]
[/Quote]

比如CheckBox,我們可以設置它的check狀態,同時我們也可以設置其是否可用(Enabled),我想實現的也是類似這樣的一個效果,只是對象是一個TreeNode。請大家幫幫忙!謝謝!
bdmh 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hanks_gao 的回复:]
引用 10 楼 bdmh 的回复:
Delphi(Pascal) code
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
var
check:Boolean;
begin
check := IsChecked(Node);
if Integer(node.Data) = 0 then
begin
SetChecked(Node,check);
AllowChange := False;
end
else
begin
SetChecked(Node,True);//用自己需要的处理
end;

[/Quote]

treeview本身没有,你既然有IsChecked,SetChecked,为什么不用呢
hanks_gao 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bdmh 的回复:]
Delphi(Pascal) code
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
var
check:Boolean;
begin
check := IsChecked(Node);
if Integer(node.Data) = 0 then
begin
SetChecked(Node,check);
AllowChange := False;
end
else
begin
SetChecked(Node,True);//用自己需要的处理
end;
end;
IsChecked,SetChecked取自…
[/Quote]

IsChecked,SetChecked在TCheckTreeview中已經可以做到,是否有類似的IsEnabled,SetEnabled的方法可以將一個TreeNode禁用掉呢?
謝謝!
genispan 2009-03-02
  • 打赏
  • 举报
回复
错了 是1. 3
genispan 2009-03-02
  • 打赏
  • 举报
回复
1F和2F 已经可以了
lovelymelon 2009-03-02
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
if Node.Text='1234' then
AllowChange:=False
else
AllowChange:=True;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Text='1234' then
self.TreeView1.Canvas.Brush.Color:=clBtnFace
end;

可以实现某个节点底色为灰色,而且不能选择
mandarin 2009-03-02
  • 打赏
  • 举报
回复
c++的那个是 把禁用的一个标志设成0,DrawItem的时候判断一下设成灰色,并且屏蔽掉Changing事件,
与bdmh意思一样
bdmh 2009-03-02
  • 打赏
  • 举报
回复

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
if Integer(node.Data) = 0 then
AllowChange := False;
end;

你需要做的前期工作就是给不能用的node.Data赋值0,能用的赋值1

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧