德尔福:我怎么知道我的财产编辑器正在编辑?
我有一个属性编辑器(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方法。
在您的编辑方法的实现中,请按照下列步骤操作:
回答
它隐藏起来,没有记录,但我发现如何。 我正在编辑的财产,我编辑:
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
函数,例如SetOrdValue
或SetIntfValue
。 对于整个属性编辑,IDE不会调用SetValue
。 相反,它会调用Edit
,并且您希望自己调用GetOrdValue
或GetIntfValue
(例如),因为编辑器已经知道它旨在编辑的属性类型。
请记住,属性编辑器通常可以同时编辑多个属性。 所有这些属性的名称都是相同的,但它们所属组件的类型可能会有所不同,因此它们的获取者和设置者也可能会有所不同。 调用你的属性编辑器的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