TCustomTreeView 中没有onclick属性?(100分)

B

book523

Unregistered / Unconfirmed
GUEST, unregistred user!
找了半天,TCustomTreeView 中没有onclick属性?TtreeView 的onclick属性不知
从而来的?我现在做的一个树控件要求在onclick事件中加一些自己的代码?
应该怎么办?重写click事件肯定不行,因为TCustomTreeView 根本没有click过程!
 
TControl = class(TComponent)
property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;



TCustomTreeView -> TWinControl -> TControl
 
OnClick和Click是在TControl实际就已经有的了。到了TCustomTreeView时,只要把它发布就行了
 
但现在我要在里面加些代码,怎么办?
截获mouse消息?
 
你只不过要改写Click事件

重载TreeView的CreateParams:
type
TCheckBoxTreeView = class(TCustomTreeView)
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Click;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;
 
教你一个无赖的方法。
先写一个方法
Procedure Form1.CTVClick(Sender);
begin
Showmessage('a');
end;

....
TTreeView(CustomTreeView1).OnClick:=Form1.CtvClick;
 
解决了,散发!!!!!1
1!!!!!!!!!!!!!!!!!!!!!!!!!
 
顶部