德尔福:我怎么知道我的财产编辑器正在编辑?

我有一个属性编辑器(TPropertyEditor的后代),用于编辑属性。

当编辑我的财产时,我如何知道我正在编辑什么对象的属性? 如果我要编辑一个属性,我必须知道我正在编辑的属性。

我一直在拉我的头发,筛选Delphi帮助,在线帮助,以及TPropertyEditor和后代源代码,我无法找到答案。

我期望的是:

TPropertyEditor = class(...)
public
    procedure Initialize(TheObject: TObject; ThePropertyName: string);
end;

据我所知,我的财产编辑是创建的,我会被告知“编辑”,我只需要知道他们希望我编辑的财产。


从帮助:

编辑整个财产

您可以选择提供一个对话框,用户可以在其中直观编辑属性。 属性编辑器最常见的用途是属于它们自己的类。 一个例子是Font属性,用户可以打开一个字体对话框来一次选择字体的所有属性。

要提供整个属性编辑器对话框,请覆盖属性编辑器类的Edit方法。

编辑方法使用与编写GetValue和SetValue方法相同的Get和Set方法。 实际上,Edit方法同时调用Get方法和Set方法。 由于编辑器是特定于类型的,因此通常不需要将属性值转换为字符串。 编辑通常会处理“检索到的”值。

当用户单击属性旁边的“...”按钮或双击值列时,Object Inspector将调用属性编辑器的Edit方法。

在您的编辑方法的实现中,请按照下列步骤操作:

  • 构建您用于该属性的编辑器。
  • 读取当前值并使用Get方法将其分配给该属性。
  • 当用户选择一个新值时,使用Set方法将该值赋给该属性。
  • 销毁编辑器。
  • 回答

    它隐藏起来,没有记录,但我发现如何。 我正在编辑的财产,我编辑:

    TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));
    

    现在我有了价值,我可以编辑它。 如果我想用其他对象替换属性:

    SetOrdValue(Longint(TheNewValue));
    

    完整的代码:

    创建一个从TClassProperty下降的属性编辑器:

    TMyPropertyEditor = class(TClassProperty)
    public
       procedure Edit; override;
       function GetAttributes: TPropertyAttributes; override;
    end;
    

    首先是家务管理,告诉德尔福的对象检查员,我的财产编辑将显示一个对话框,这将使一个“......”出现在财产旁边:

    function TMyPropertyEditor.GetAttributes: TPropertyAttributes;
    begin
       //We show a dialog, make Object Inspector show "..."
       Result := [paDialog];
    end;
    

    接下来是实际工作。 当用户点击“...”按钮时,对象检查器会调用我的Edit方法。 我错过的诀窍是我打电话给我的GetOrdValue方法。 即使我的属性不是一个序数,你仍然使用它,只是将结果转换为对象:

    procedure TMyPropertyEditor.Edit;
    var
       OldThing: TMyPersistentThing;
       NewThing: TMyPersistentThing;
    begin
       //Call the property's getter, and return the "object" i'm editing:
       OldThing:= TMyPersistentThing(Pointer(GetOrdValue));
    
       //now that i have the thing i'm editing, do stuff to "edit" it
       DoSomeEditing(OldThing);
    
    
       //i don't have to, but if i want to replace the property with a new object
       //i can call the setter:
       NewThing := SomeVariant(OldThing);
       SetOrdValue(Longint(NewThing));
    end;
    

    如果我理解你的问题,你想知道你应该如何真正找到你需要编辑的价值,特别是如果有问题的对象包含不止一个。 答案是IDE会为您设置,并且在调用Edit之前,属性编辑器会“预加载”。 TPropertyEditor带有一堆GetValue方法,您的编辑功能可以使用这些方法来检索该值。 或者,如果它不是这些类型之一(例如,如果它是来自TPersistent的对象),则可以调用GetOrdValue并将结果转换为TPersistent。

    此外,您可能希望查看JVCL的JvDsgnEditors单元中的TJvPersistentPropertyEditor以用作基类。 它为您提供了一些功能。

    顺便说一句,如果你真的需要它,你可以使用GetName方法,它会给你属性的名称,但你通常不应该。 如果你从TPropertyEditor本身以外的东西继承,请小心,因为GetName是虚拟的 ,可以被覆盖。


    一个属性编辑器保存关于它在私人FPropList变量中编辑哪些对象和属性的信息。 IDE通过调用你的编辑器的SetPropEntry方法来填补这个问题。 然后通常应该调用TPropertyEditor的各种方法来查找属性的值。

    对于你被要求编辑哪个属性并不是很重要。 你的属性编辑器编辑特定类型的属性。 对于就地编辑,编辑器提供了一个SetValue的实现,它将Object Inspector中的字符串转换为属性的正确类型的值,然后调用相应的Set函数,例如SetOrdValueSetIntfValue 。 对于整个属性编辑,IDE不会调用SetValue 。 相反,它会调用Edit ,并且您希望自己调用GetOrdValueGetIntfValue (例如),因为编辑器已经知道它旨在编辑的属性类型。

    请记住,属性编辑器通常可以同时编辑多个属性。 所有这些属性的名称都是相同的,但它们所属组件的类型可能会有所不同,因此它们的获取者和设置者也可能会有所不同。 调用你的属性编辑器的GetName方法来找出名字。 要获取这些对象,请为每个从0到PropCount - 1的索引调用GetComponent 。(请注意,这些Get函数中没有范围检查。)您还可以通过调用HasInstance来检查特定对象是否在列表中。 GetPropInfo方法会告诉你第一个属性的PPropInfo指针,但我认为这不一定等于所有其他属性的指针。 除此之外,您不能直接访问PPropInfo数据,但是再次,它确实不重要。 如果你认为你的编辑需要这些,你可能会做错事; 发布有关您的基础任务的更具体信息的新问题。


    财产编辑只关心(并注册)财产的类型 ,而不是具体财产本身。

    链接地址: http://www.djcxy.com/p/63131.html

    上一篇: Delphi: How do i know what my property editor is editing?

    下一篇: Problem with setting Browsing Path in Delphi option page