【发布时间】:2016-07-03 17:26:43
【问题描述】:
我正在尝试找到一个通用** 解决方案,通过某些功能(例如每个节点的工具提示)来扩展内置 Treeview/TreeNode。所以首先我派生了一个TExtendedTreeNode = class(TTreeNode) 并添加了一个似乎工作正常的相应属性 - 我可以为每个节点添加具有不同工具提示的 TExtendedTreeNodes。
对于下一步,我想使用 TTreeView.OnMouseMove 事件来显示相应的 ToolTip,但是以通用**方式扩展此功能的最佳解决方案是什么?
我的想法是使用class helper for TTreeView:
type
TTreeViewExtension = class helper for TTreeView
private
procedure ShowNodeToolTips(Sender: TObject; Shift: TShiftState; X, Y: Integer);
public
constructor Create(AnOwner: TComponent);
end;
...
constructor TTreeViewExtension.Create(AnOwner: TComponent);
begin
inherited Create(AnOwner);
ShowMessage('TTreeViewExtension.Create');
self.OnMouseMove := @self.ShowNodeToolTips;
end;
代码编译时没有警告或错误,但在我的表单中创建树视图时不会执行此构造函数。
是的,我在表单单元和扩展单元中都使用了advancedrecords in objfpc mode - 为了使用类助手:
{$mode objfpc}{$H+}
{$modeswitch advancedrecords+}
** “通用”的意思是,我想至少将 Lazarus IDE 中的集成控件用于 TreeView 控件,但使用扩展功能而无需编写两次代码。
【问题讨论】:
-
创建 TTreeView 的后代并覆盖其受保护的方法
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; -
是的,如果可以以向前的方式完成,请不要滥用类助手之类的巴洛克式结构。我不确定类助手是否允许覆盖方法。班级助手是一个拐杖,而不是瑞士军队。
-
@Marco:我不了解 FPC,但在 Delphi 中,类助手不能覆盖虚拟或动态方法,原因很明显。事实上,它们是一个拐杖,最初是为了让 TObject 和其他一些类与相应的 C# 类兼容。它们现在被使用得更多了,但它们仍然是一个拐杖。
-
对,在FPC里好像完全一样。
标签: delphi treeview lazarus freepascal