由于Delphi自带的TTreeView里并没有复选框的功能。因此,必须重新设计控件。
在设计时因TTreeView里有一个StateIndex和StateImages,而纵观TTreeView的代码可以知道它只是发布了一下TCustomTreeView定义并实现好的属性和方法而已。因此我们也选择TCustomTreeView为TCheckTree控件的祖先类。
重要的实现技术为:
procedure TCheckTree.WMPaint( var Msg: TWMPaint );
var
I: Integer;
begin
for I := 0 to Items.Count - 1 do
begin
if not(Items[ I ].StateIndex in [Ord(csUnknown)..Ord(csPartiallyChecked)]) then
Items[ I ].StateIndex := Ord(csUnchecked) //这里我修改了
end;
inherited;
end;
function TCheckTree.GetItemState( Node:TTreeNode ): TCheckCheckState;
begin
Result := TCheckCheckState( Node.StateIndex );
end;
procedure TCheckTree.SetItemState( Node:TTreeNode; Value: TCheckCheckState );
begin
if TCheckCheckState( Node.StateIndex ) <> Value then
ChangeNodeCheckState( Node, Value );
end;
procedure TCheckTree.StateChange( Node: TTreeNode; NewState: TCheckCheckState );
begin
if Assigned( FOnStateChange ) then
FOnStateChange( Self, Node, NewState );
end;上面说的这些是在哪修改,具体实施办法,刚开始学,谢谢各位了!!!
在设计时因TTreeView里有一个StateIndex和StateImages,而纵观TTreeView的代码可以知道它只是发布了一下TCustomTreeView定义并实现好的属性和方法而已。因此我们也选择TCustomTreeView为TCheckTree控件的祖先类。
重要的实现技术为:
procedure TCheckTree.WMPaint( var Msg: TWMPaint );
var
I: Integer;
begin
for I := 0 to Items.Count - 1 do
begin
if not(Items[ I ].StateIndex in [Ord(csUnknown)..Ord(csPartiallyChecked)]) then
Items[ I ].StateIndex := Ord(csUnchecked) //这里我修改了
end;
inherited;
end;
function TCheckTree.GetItemState( Node:TTreeNode ): TCheckCheckState;
begin
Result := TCheckCheckState( Node.StateIndex );
end;
procedure TCheckTree.SetItemState( Node:TTreeNode; Value: TCheckCheckState );
begin
if TCheckCheckState( Node.StateIndex ) <> Value then
ChangeNodeCheckState( Node, Value );
end;
procedure TCheckTree.StateChange( Node: TTreeNode; NewState: TCheckCheckState );
begin
if Assigned( FOnStateChange ) then
FOnStateChange( Self, Node, NewState );
end;上面说的这些是在哪修改,具体实施办法,刚开始学,谢谢各位了!!!
并在public内加property ItemState: TCheckCheckState read GetItemState write SetItemState
刚学,比较菜,谢谢了