Lazarus(Delphi/FPC):未执行类helper中的构造函数

Lazarus(Delphi/FPC):未执行类helper中的构造函数,delphi,treeview,lazarus,freepascal,Delphi,Treeview,Lazarus,Freepascal,我试图找到一个通用的**解决方案,通过一些特性(例如每个节点的工具提示)来扩展内置的Treeview/TreeNode。因此,首先,我派生了一个TExtendedTreeNode=class(TTreeNode),并添加了一个相应的属性,该属性似乎工作正常-我可以为每个节点添加具有不同工具提示的TExtendedTreeNode 在下一步中,我想使用TTreeView.OnMouseMove事件显示相应的工具提示,但是以通用**方式扩展此功能的最佳解决方案是什么 我的想法是为TTreeView使

我试图找到一个通用的**解决方案,通过一些特性(例如每个节点的工具提示)来扩展内置的Treeview/TreeNode。因此,首先,我派生了一个
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的版本将支持它