【问题标题】:Writing Property Editors - I need some guidance编写属性编辑器 - 我需要一些指导
【发布时间】:2012-12-23 17:39:08
【问题描述】:

概述

我正在创建一个从 TCustomTreeView 派生的组件,我想添加一个在对象检查器中显示下拉列表 (paValueList?) 的属性。此列表必须基于附加到我的控件的另一个列表(TStrings)动态填充,例如它可以是来自 TComboBox、TListBox 或来自 TStringList 等的字符串。

虽然我遇到了一些问题,但我真的可以得到一些指导和建议。


代码布局

我已缩短代码以使其更易于阅读,但布局与我所拥有的基本相同。

我已将我的组件包分成两个(同一个项目组),Package1 包含组件代码(例如,我的组件源自 TCustomTreeView),Package2 包含注册程序和设计器单元(designide.dcp、DesignIntf​​、设计编辑器等)。

Package2 是我认为我需要添加属性编辑器的地方,该编辑器将用于从Package1 中的 TCustomTreeView 派生的组件。

包1

unit MyTreeViewUnit;

implementation

uses
  ...
  Classes,
  SysUtils;

type
  TMyTreeView = class(TCustomTreeView)
  private
    FSomeList: TStringList; // property editor should be filled using this list
    procedure SetSomeList(const Value: TStringList);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property SomeList: TStringList read FSomeList write SetSomeList;
  end;

  ....

包2

unit MyTreeViewPropUnit;

implementation

uses
  DesignIntf,
  DesignEditors,
  Classes;

type
  TMyTreeViewProperty = class(TStringProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetValues(Proc: TGetStrProc); override;
    procedure Edit; override;
  end;

implementation

uses
  MyTreeViewUnit;  

function TMyTreeViewProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paValueList]; ?
end;

procedure TMyTreeViewProperty.GetValues(Proc: TGetStrProc);
begin
  inherited;
  // These cannot be added here!!
  // This list should be populated based on SomeList found in Package1 - MyTreeViewUnit.pas
  Proc('Item1');
  Proc('Item2');
end;

procedure TMyTreeViewProperty.Edit;
begin
  inherited;
  // ?
end;

unit MyCompsRegister;

interface

uses
  Classes;

procedure Register;

implementation

uses
  MyTreeViewUnit;
  MyTreeViewPropUnit;  

procedure Register;
begin
  RegisterComponents('MyTree', TMyTreeView);
  RegisterPropertyEditor(TypeInfo(String), TMyTreeView 'Test', TMyTreeView); // does not seem to add to object inspector for the component TMyTreeView
end;

end.

问题

  1. 第一个问题是我不知道我所做的是否是正确的方法,我的组件已安装并且我可以毫无问题地使用它,尽管我的属性编辑器“测试”没有出现!

  2. 第二个问题是 GetValues 的填充方式。在线查看一些文章使我对迄今为止在填充属性编辑器等方面的内容有了基本的了解。尽管出于我的需要,无法以这种方式添加,在此示例中,我需要 GetValues 来填充基于在第一个单元中分配给 SomeList 的字符串(正如我之前所说的,FSomeList 可以是 TListBox)。

  3. 这与问题 2 相关,即如何让我的属性编辑器(在工作时)与我的树视图进行通信,以便我可以相应地填充它?

如果有人能给我一些指点,或者更好地指导我写一篇关于编写属性编辑器的好文章/指南,我将不胜感激。我在 Delphi.about、DelphiDabbler 等上阅读的内容对我来说并不容易理解和遵循(我很容易感到困惑和陷入困境)。

非常感谢!

【问题讨论】:

  • 如果你有 DevExpress Vertical Grid 控件,你会发现它包含一个非常好的属性编辑器组件。我开始写我自己的一个,然后我意识到我已经有了一个非常好的版本。你可以在这里找到更多信息:devexpress.com/Products/VCL/ExVerticalGrid
  • 您已为名为@9​​87654330@ 的TMyTreeView 字符串属性注册了属性编辑器,但TMyTreeView 在您发布的代码中没有Test 属性。您希望属性编辑器准确地编辑什么?
  • 我也注意到了,应该是'SomeList' 而不是'Test'
  • @KenWhite 阅读了我对 Cosmin Prund 的回答的评论,你会再次发现,像往常一样,我被一个问题困住了太久,并且对我手头的任务变得更加困惑。我真的需要学会停止跳入事物,而是坐下来,花时间了解信息和文档指南等。我似乎说服自己一切都会很容易做到,到那时我已经太迟了深层次的困惑和沮丧。我似乎无法始终保持清醒的头脑,看到并理解我所做的一切,但我会继续努力!

标签: delphi custom-controls delphi-xe


【解决方案1】:

这对于评论来说太长了,我想包含一些代码,所以这里是一个答案。首先,你的问题非常广泛。你需要停下来,这样你就可以提出中肯的问题。我实际上开始回答你的第 2 题,并且在放弃之前我写了一些无法阅读的东西!

您应该从不需要属性编辑器的代码开始,即正常的运行时代码。属性编辑器不能集中您的自定义控件的开发,因为属性编辑器仅在设计时使用以加快速度。如果要保持属性编辑器所做的更改,则它们将保存到对象检查器中以任何方式可见的已发布属性 (*1),而这些属性又会保存到 DFM 文件中。在创建表单时和设计时重新打开表单时(例如:如果您关闭 IDE 并重新打开它),相同的过程会在运行时恢复。由于一切都需要进入 Object Inspector,您可以跳过花哨的属性编辑器并让您的控件正常工作!

是什么促使我这么说:

procedure TMyTreeViewProperty.GetValues(Proc: TGetStrProc);
begin
  inherited;
  // These cannot be added here!!
  // This list should be populated based on SomeList found in Package1 - MyTreeViewUnit.pas
  Proc('Item1');
  Proc('Item2');
end;

该评论告诉我你还没有弄清楚如何将你的组件链接到不同的组件!这实际上是一个微不足道的步骤,一旦你开始工作,你就可以这样做:

procedure TMyTreeViewProperty.GetValues(Proc: TGetStrProc);
var s: string;
begin
  if Assigned(FLinkedCombo) then
    for s in FLinkedCombo.Items do
      Proc(s); // Beware, written in Browser!
end;

即使是微不足道的问题,如果没有该部分,如上所述的问题的答案将是不完整的,并且该部分包括关于TComponent.FreeNotificationTComponent.RemoveFreeNotificationTComponent.Notification 的长谈!

一旦您完成了大部分工作,您就可以开始使用您可能想要创建的任何属性编辑器。这项工作也将作为一个普通项目完成:您的目标是创建一个能够编辑您的属性或组件的简单表单(例如TMyComponentsEditor)。完成该工作后,您可能会问:如何让这个工作编辑器在 DesignTime 中用作属性或组件编辑器

*1) 当然,组件编辑器可以做涉及多个组件的花哨的东西;它还可以使用替代方法(即:不依赖简单的已发布属性)来持久化内容。

【讨论】:

  • 您好,很抱歉回复晚了。我想在写这个问题的时候,我的心态很混乱,所以我写的问题并不像我希望的那样清楚。在尝试实施并猜测去哪里之前,我需要花一些时间阅读更多关于属性编辑器的信息。至于与其他组件的链接,我想通了,我需要的是读取一个声明为变量字段但超出类范围的控件。我会接受这一点,因为您提供了一些有用的提示和信息。如果我被卡住了,我会带着更清楚的问题回来。再次感谢:)
猜你喜欢
  • 2021-09-11
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多