Class TCustomTreeViewEx (unit TreeVwEx) |
Inherits from
TCustomTreeView
constructor Create(AOwner: TComponent);
- TCustomTreeViewEx ----------------------------------------------------------
procedure Delete;
procedure DeleteNode(Node: TTreeNode);
destructor Destroy;
procedure Insert(AsChild: Boolean);
function IsRootNode(Node: TTreeNode): Boolean;
IsRootNode is true if the node has no parent:
if (FDisableCount = 0) and (Selected <> nil) then
Selected.
function IsSingleRootNode(Node: TTreeNode): Boolean;
IsSingleRootNode is true if the node is the only one without parent: This function was improved by Zlatko Ivankovic: THANKS!
function MoveNode(Source, Destination: TTreeNode;
Mode: TNodeAttachMode): Boolean;
htNowhere, htOnIndent,
function CanDelete(Node: TTreeNode): Boolean;
Original IsSingleRootNode:
Look at this, and you will see how elegant the above
solution from Zlatko Ivankovic is:
function TCustomTreeViewEx.
function CanEdit(Node: TTreeNode): Boolean;
function DoDelete(Node: TTreeNode): Boolean;
procedure DoStartDrag(var DragObject: TDragObject);
Allow PopupMenu if CNNotify was called with NM_RCLICK:
function DragAllowed(Node: TTreeNode): Boolean;
procedure DragCanceled;
DestinationNode is a candidate to get the new parent of the dragged node
procedure DragDrop(Source: TObject; X, Y: Integer);
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
procedure Expand(Node: TTreeNode);
function GetDeleteQuestion(Node: TTreeNode): string;
function GetDragImages: TCustomImageList;
This is why I have copied this part from TCustomTreeView:
// SetDragImage(0, 2, 2);
By calling SetDragImage, the original procedure sets the
ImageList.
procedure InternalDeleteNode(Node: TTreeNode;
AskForDeleteAll: Boolean; var DeleteAll, Canceled: Boolean;
IsRecursiveCall: Boolean);
procedure KeyDown(var Key: Word; Shift: TShiftState);
procedure KillAllTimer;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
procedure MouseMove(Shift: TShiftState; X, Y: Integer);
maybe it becomes a doubleclick, wait a little bit:
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
function ShowDeletePrompt(Node: TTreeNode;
var DeleteAll: Boolean; ShowDeleteAllButton: Boolean): Boolean;
procedure WndProc(var Message: TMessage);
Message.
procedure CMDrag(var Message: TCMDrag);
with WMMouse do
begin
Msg := WM_MOUSEMOVE;
Keys := 0;
Result := 0;
Pos.
procedure CNNotify(var Message: TWMNotify);
no PopupMenu anyway
procedure DoDragOver(Source: TDragObject; X, Y: Integer;
PossibleDrop: Boolean);
if PossibleDrop and FDontAcceptLastPossibleDropTarget then Selected.
procedure DoScroll(Node: TTreeNode; MouseX, MouseY: Integer);
case
function MultipleRootsAllowed: Boolean;
procedure WMChar(var Message: TWMKeyDown);
bugfix part 2:
procedure WMRButtonUp(var Message: TWMRButtonUp);
make changes of the tree invisible
procedure WMTimer(var Msg: TWMTimer);
, htOnIcon, htOnIndent, htOnRight
property Align :
property BorderStyle :
property Color :
property Ctl3D :
property DragCursor :
property DragImageShow : TTVDragImageShow
DragImageShow:
tvdisDefault: Show a dragimage if the Images property is not nil
tvdisAlways: Show a dragimage even if Images is nil (text only)
tvdisNever: No dragimage anyway
property DragMode :
property Enabled :
property Font :
property HideSelection :
property IgnoreWMChars : TIgnoreWMChars
property Images :
property Indent :
property Items :
property Options : TTreeViewExOptions
possible published:
property ParentColor :
property ParentCtl3D :
property ParentFont :
property ParentShowHint :
property PopupMenu :
property ReadOnly :
property RSelected : TTreeNode
The last node that was clicked with the right mouse-button:
property ShowButtons :
possible published, inherited from TCustomTreeView:
property ShowHint :
property ShowLines :
property ShowRoot :
property SortType :
property StateImages :
property TabOrder :
property TabStop :
property Visible :
event OnChange :
event OnChanging :
event OnClick :
event OnCollapsed :
event OnCollapsing :
event OnCompare :
event OnDblClick :
event OnDeleting : TTVDeletingEvent
Called before the deleting of a node starts:
event OnDeletion :
event OnDragDrop :
event OnDragging : TTVDraggingEvent
possible published: } { Called before the dragging of a node starts:
event OnDragOver :
event OnEdited :
event OnEditing :
event OnEndDrag :
event OnEnter :
event OnExit :
event OnExpanded :
event OnExpanding :
event OnGetImageIndex :
event OnGetSelectedIndex :
event OnKeyDown :
event OnKeyPress :
event OnKeyUp :
event OnMouseDown :
event OnMouseMove :
event OnMouseSelect : TNotifyEvent
event OnMouseUp :
event OnStartDrag :
FDisableCount : Integer;
FRSelected : TTreeNode;
FDelRootID : LongInt;
FDontAcceptLastPossibleDropTarget : Boolean;
FDragImage : TImageList;
FDragImageShow : TTVDragImageShow;
FDragScrollTickCount : Integer;
FIgnoreWMChars : TIgnoreWMChars;
FLastPossibleDropTarget : TTreeNode;
FLMouseDownTickCount : Integer;
FMouseSelectTimer : Longint;
FOnDeleting : TTVDeletingEvent;
FOnDragging : TTVDraggingEvent;
FOnMouseSelect : TNotifyEvent;
FOptions : TTreeViewExOptions;
FScrollTimer : Longint;
FState : TTreeViewExStates;
constructor Create(AOwner: TComponent);
TCustomTreeViewEx ----------------------------------------------------------
procedure Delete;
procedure DeleteNode(Node: TTreeNode);
destructor Destroy;
procedure Insert(AsChild: Boolean);
function IsRootNode(Node: TTreeNode): Boolean;
IsRootNode is true if the node has no parent:
if (FDisableCount = 0) and (Selected <> nil) then
Selected.MakeVisible;
function IsSingleRootNode(Node: TTreeNode): Boolean;
IsSingleRootNode is true if the node is the only one without parent:
This function was improved by Zlatko Ivankovic: THANKS!
function MoveNode(Source, Destination: TTreeNode;
Mode: TNodeAttachMode): Boolean;
htNowhere, htOnIndent,
function CanDelete(Node: TTreeNode): Boolean;
Original IsSingleRootNode:
Look at this, and you will see how elegant the above
solution from Zlatko Ivankovic is:
function TCustomTreeViewEx.IsSingleRootNode(Node: TTreeNode): Boolean;
var
i: Integer;
begin
Result := false;
if not IsRootNode(Node) then
exit;
for i := 0 to Items.Count - 1 do
if (Items[i] <> Node) and IsRootNode(Items[i]) then
exit; { found another root }
Result := true;
end;
function CanEdit(Node: TTreeNode): Boolean;
function DoDelete(Node: TTreeNode): Boolean;
procedure DoStartDrag(var DragObject: TDragObject);
Allow PopupMenu if CNNotify was called with NM_RCLICK:
function DragAllowed(Node: TTreeNode): Boolean;
procedure DragCanceled;
DestinationNode is a candidate to get the new parent of the dragged node
procedure DragDrop(Source: TObject; X, Y: Integer);
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
procedure Expand(Node: TTreeNode);
function GetDeleteQuestion(Node: TTreeNode): string;
function GetDragImages: TCustomImageList;
This is why I have copied this part from TCustomTreeView:
// SetDragImage(0, 2, 2);
By calling SetDragImage, the original procedure sets the
ImageList.Dragging property to true. If no real drag happens
(no mouse move), the ImageList will call ShowCursor(True)
without a call of ShowCursor(False) before - so the cursor
remains visible while dragging. This is a bug of TCustomImageList
(in Delphi 2.0, I don't know if in D3 too), but it is not
possible to overwrite TCustomImageList to make it bugfree.
procedure InternalDeleteNode(Node: TTreeNode;
AskForDeleteAll: Boolean; var DeleteAll, Canceled: Boolean;
IsRecursiveCall: Boolean);
procedure KeyDown(var Key: Word; Shift: TShiftState);
procedure KillAllTimer;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
procedure MouseMove(Shift: TShiftState; X, Y: Integer);
maybe it becomes a doubleclick, wait a little bit:
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
function ShowDeletePrompt(Node: TTreeNode;
var DeleteAll: Boolean; ShowDeleteAllButton: Boolean): Boolean;
procedure WndProc(var Message: TMessage);
Message.Result := 1;
procedure CMDrag(var Message: TCMDrag);
with WMMouse do
begin
Msg := WM_MOUSEMOVE;
Keys := 0;
Result := 0;
Pos.X := MouseX;
Pos.Y := MouseY;
end;
LastDragSource.MouseMsg(WMMouse); private >:-(
procedure CNNotify(var Message: TWMNotify);
no PopupMenu anyway
procedure DoDragOver(Source: TDragObject; X, Y: Integer;
PossibleDrop: Boolean);
if PossibleDrop and FDontAcceptLastPossibleDropTarget then Selected.DropTarget := true;
procedure DoScroll(Node: TTreeNode; MouseX, MouseY: Integer);
case
function MultipleRootsAllowed: Boolean;
procedure WMChar(var Message: TWMKeyDown);
bugfix part 2:
procedure WMRButtonUp(var Message: TWMRButtonUp);
make changes of the tree invisible
procedure WMTimer(var Msg: TWMTimer);
, htOnIcon, htOnIndent, htOnRight
property Align :
property BorderStyle :
property Color :
property Ctl3D :
property DragCursor :
property DragImageShow : TTVDragImageShow
DragImageShow:
tvdisDefault: Show a dragimage if the Images property is not nil
tvdisAlways: Show a dragimage even if Images is nil (text only)
tvdisNever: No dragimage anyway
property DragMode :
property Enabled :
property Font :
property HideSelection :
property IgnoreWMChars : TIgnoreWMChars
property Images :
property Indent :
property Items :
property Options : TTreeViewExOptions
possible published:
property ParentColor :
property ParentCtl3D :
property ParentFont :
property ParentShowHint :
property PopupMenu :
property ReadOnly :
property RSelected : TTreeNode
The last node that was clicked with the right mouse-button:
property ShowButtons :
possible published, inherited from TCustomTreeView:
property ShowHint :
property ShowLines :
property ShowRoot :
property SortType :
property StateImages :
property TabOrder :
property TabStop :
property Visible :
event OnChange :
event OnChanging :
event OnClick :
event OnCollapsed :
event OnCollapsing :
event OnCompare :
event OnDblClick :
event OnDeleting : TTVDeletingEvent
Called before the deleting of a node starts:
event OnDeletion :
event OnDragDrop :
event OnDragging : TTVDraggingEvent
possible published: } { Called before the dragging of a node starts:
event OnDragOver :
event OnEdited :
event OnEditing :
event OnEndDrag :
event OnEnter :
event OnExit :
event OnExpanded :
event OnExpanding :
event OnGetImageIndex :
event OnGetSelectedIndex :
event OnKeyDown :
event OnKeyPress :
event OnKeyUp :
event OnMouseDown :
event OnMouseMove :
event OnMouseSelect : TNotifyEvent
event OnMouseUp :
event OnStartDrag :
FDisableCount : Integer;
FRSelected : TTreeNode;
FDelRootID : LongInt;
FDontAcceptLastPossibleDropTarget : Boolean;
FDragImage : TImageList;
FDragImageShow : TTVDragImageShow;
FDragScrollTickCount : Integer;
FIgnoreWMChars : TIgnoreWMChars;
FLastPossibleDropTarget : TTreeNode;
FLMouseDownTickCount : Integer;
FMouseSelectTimer : Longint;
FOnDeleting : TTVDeletingEvent;
FOnDragging : TTVDraggingEvent;
FOnMouseSelect : TNotifyEvent;
FOptions : TTreeViewExOptions;
FScrollTimer : Longint;
FState : TTreeViewExStates;