谁能告诉我这是为什么 ?
我写了一个有checkbox的TreeView,不知道为什么它不管没有item的时候,都有水平的滚动条,这是为什么?
unit CheckBoxTreeView;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
type
TCheckBoxTreeView = class(TTreeView)
private
FOldState: Boolean;
FOnNodeChecked: TNotifyEvent;
FOnNodeUnChecked: TNotifyEvent;
{ Private declarations }
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Change(Node: TTreeNode); override;
procedure Click; override;
{ Protected declarations }
public
function IsNodeChecked(Node: TTreeNode): Boolean;
procedure SetNodeChecked(Node: TTreeNode; Checked: Boolean);
{ Public declarations }
published
property Align;
property Anchors;
property AutoExpand;
property BevelEdges;
property BevelInner;
property BevelOuter;
property BevelKind default bkNone;
property BevelWidth;
property BiDiMode;
property BorderStyle;
property BorderWidth;
property ChangeDelay;
property Color;
property Ctl3D;
property Constraints;
property DragKind;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property HideSelection;
property HotTrack;
property Images;
property Indent;
property MultiSelect;
property MultiSelectStyle;
property ParentBiDiMode;
property ParentColor default False;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property RightClickSelect;
property RowSelect;
property ShowButtons;
property ShowHint;
property ShowLines;
property ShowRoot;
property SortType;
property StateImages;
property TabOrder;
property TabStop default True;
property ToolTips;
property Visible;
property OnAddition;
property OnAdvancedCustomDraw;
property OnAdvancedCustomDrawItem;
property OnChange;
property OnChanging;
property OnClick;
property OnCollapsed;
property OnCollapsing;
property OnCompare;
property OnContextPopup;
property OnCreateNodeClass;
property OnCustomDraw;
property OnCustomDrawItem;
property OnDblClick;
property OnDeletion;
property OnDragDrop;
property OnDragOver;
property OnEdited;
property OnEditing;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnExpanding;
property OnExpanded;
property OnGetImageIndex;
property OnGetSelectedIndex;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
{ Items must be published after OnGetImageIndex and OnGetSelectedIndex }
property Items;
{ Published declarations }
property OnNodeChecked: TNotifyEvent read FOnNodeChecked write FOnNodeChecked;
property OnNodeUnChecked: TNotifyEvent read FOnNodeUnChecked write FOnNodeUnChecked;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TCheckBoxTreeView]);
end;
{ TCheckBoxTreeView }
procedure TCheckBoxTreeView.Change(Node: TTreeNode);
begin
inherited Change(Node);
FOldState := IsNodeChecked(Node);
end;
procedure TCheckBoxTreeView.Click;
var
NewState: Boolean;
begin
inherited Click;
NewState := IsNodeChecked(Self.Selected);
if NewState = FOldState then Exit;
if (NewState) and Assigned(FOnNodeChecked) then FOnNodeChecked(self)
else if (not NewState) and Assigned(FOnNodeUnChecked) then
FOnNodeUnChecked(self);
end;
procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=Params.Style or TVS_CHECKBOXES;
end;
function TCheckBoxTreeView.IsNodeChecked(Node: TTreeNode): Boolean;
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
Result := False;
if Node = nil then Exit;
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;
procedure TCheckBoxTreeView.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;
end.