Lazarus(Delphi/FPC):未执行类helper中的构造函数
我试图找到一个通用的**解决方案,通过一些特性(例如每个节点的工具提示)来扩展内置的Treeview/TreeNode。因此,首先,我派生了一个Lazarus(Delphi/FPC):未执行类helper中的构造函数,delphi,treeview,lazarus,freepascal,Delphi,Treeview,Lazarus,Freepascal,我试图找到一个通用的**解决方案,通过一些特性(例如每个节点的工具提示)来扩展内置的Treeview/TreeNode。因此,首先,我派生了一个TExtendedTreeNode=class(TTreeNode),并添加了一个相应的属性,该属性似乎工作正常-我可以为每个节点添加具有不同工具提示的TExtendedTreeNode 在下一步中,我想使用TTreeView.OnMouseMove事件显示相应的工具提示,但是以通用**方式扩展此功能的最佳解决方案是什么 我的想法是为TTreeView使
TExtendedTreeNode=class(TTreeNode)
,并添加了一个相应的属性,该属性似乎工作正常-我可以为每个节点添加具有不同工具提示的TExtendedTreeNode
在下一步中,我想使用TTreeView.OnMouseMove事件显示相应的工具提示,但是以通用**方式扩展此功能的最佳解决方案是什么
我的想法是为TTreeView使用类帮助程序:
type
TTreeViewExtension = class helper for TTreeView
private
procedure ShowNodeToolTips(Sender: TObject; Shift: TShiftState; X, Y: Integer);
public
constructor Create(AnOwner: TComponent);
end;
编译代码时没有警告或错误,但在我的表单中创建treeview时不会执行此构造函数
是的,我在objfpc模式中使用了advancedrecords
,在我的表单单元和扩展单元中都使用了advancedrecords
,以便使用类助手:
{$mode objfpc}{$H+}
{$modeswitch advancedrecords+}
**“通用”意味着,我希望至少在TreeView控件中使用Lazarus IDE中的集成控件,但使用扩展功能时不必编写两次代码。为什么不使用已经可用的OnHint
事件来显示这些工具提示。t treeview.OnHint
事件已返回对鼠标光标下的树节点的引用,因此从该节点读取自定义提示(工具提示)时不会有任何问题
如果提示可以在一行文本中显示,则只需更改此事件方法中公开的Hint
变量的值即可
通过将事件方法返回的节点
常量类型转换到TExtendedTreeNode
类,您可以轻松地从扩展树节点
读取此类值。
不要忘记检查所讨论的节点是否确实属于正确的类
procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode;
var Hint: string);
begin
//Check to see if the node beneath the cursor is the extended node
if Node is TExtendedTreeNode then
//if it is change the hint text to the custom hint stored in the
//node itself
Hint := TExtendedTreeNode(Node).CustomHint
//Else change the hint to empty string so no hintbox will be shown
else Hint := '';
end;
如果您不想显示任何提示文本并以不同的方式显示信息,只需将hint
值设置为空字符串即可
procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode;
var Hint: string);
begin
//Set Hint to empty string in order to not show any hint box
Hint := '';
//Do some other code instead if you like
MessageBeep(0);
end;
为什么不使用已经可用的OnHint
事件来显示这些工具提示呢。t treeview.OnHint
事件已返回对鼠标光标下的树节点的引用,因此从该节点读取自定义提示(工具提示)时不会有任何问题
如果提示可以在一行文本中显示,则只需更改此事件方法中公开的Hint
变量的值即可
通过将事件方法返回的节点
常量类型转换到TExtendedTreeNode
类,您可以轻松地从扩展树节点
读取此类值。
不要忘记检查所讨论的节点是否确实属于正确的类
procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode;
var Hint: string);
begin
//Check to see if the node beneath the cursor is the extended node
if Node is TExtendedTreeNode then
//if it is change the hint text to the custom hint stored in the
//node itself
Hint := TExtendedTreeNode(Node).CustomHint
//Else change the hint to empty string so no hintbox will be shown
else Hint := '';
end;
如果您不想显示任何提示文本并以不同的方式显示信息,只需将hint
值设置为空字符串即可
procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode;
var Hint: string);
begin
//Set Hint to empty string in order to not show any hint box
Hint := '';
//Do some other code instead if you like
MessageBeep(0);
end;
改为创建TTreeView的子体,并重写其受保护的方法
过程MouseMove(Shift:TShiftState;X,Y:Integer);覆盖代码>是的,不要滥用巴洛克式的构造,比如类助手,如果它可以向前完成的话。我不确定类助手是否允许重写方法。类助手是一个支柱,不是瑞士军队的好帮手。@Marco:我不知道FPC,但在Delphi中,类助手不能覆盖虚拟或动态方法,原因很明显。事实上,它们是一根拐杖,最初的目的是使TObject和其他一些类与相应的C#类兼容。它们现在已经被使用了很多,但它们仍然是一根拐杖。对,在FPC中似乎完全相同。改为创建TTreeView的后代,并覆盖其受保护的方法procedure MouseMove(Shift:TShiftState;X,Y:Integer);覆盖代码>是的,不要滥用巴洛克式的构造,比如类助手,如果它可以向前完成的话。我不确定类助手是否允许重写方法。类助手是一个支柱,不是瑞士军队的好帮手。@Marco:我不知道FPC,但在Delphi中,类助手不能覆盖虚拟或动态方法,原因很明显。事实上,它们是一根拐杖,最初的目的是使TObject和其他一些类与相应的C#类兼容。它们现在被使用得更多,但它们仍然是一个支柱。对,在FPC中似乎完全相同。感谢您的建议,但这并不能解决我的主要问题,即在不编写额外代码的情况下,将其集成到IDE表单设计器在我的应用程序中创建的所有现有和未来的TreeView中。好啊也许我没有解释清楚-我的英语不是最好的。在这种情况下,我认为最好的解决方案是用附加代码扩展TTreeView组件,并用扩展的组件替换所有现有的TTreeView组件。看起来Lazarus没有TTreeView.OnHint事件-我猜它是在较新版本中创建的Delphi和Lazarus的版本将在以后的版本中支持它。。。只有一个TTreeview..OnShowHint事件-这比MouseMove好,因为它只在需要新提示时被调用,但我必须以与上面相同的方式确定当前节点。我刚刚开始开发一个IDE组件,它可以注册为表单设计器中的可视控件。现在我知道这至少是可能的,这确实是最好的解决方案。谢谢你的建议,但这并不能解决我的主要问题,即在不编写额外代码的情况下,将它集成到IDE表单设计器在我的应用程序中创建的所有现有和未来的TreeView中。好啊也许我没有解释清楚-我的英语不是最好的。在这种情况下,我认为最好的解决方案是用附加代码扩展TTreeView组件,并用扩展的组件替换所有现有的TTreeView组件。看起来Lazarus没有TTreeView.OnHint事件-我猜它是在较新版本中创建的Delphi和Lazarus的版本将支持它