我有一个用于编辑属性的属性编辑器(TPropertyEditor 的后代)。
当需要编辑我的属性时,我怎么知道我正在编辑什么对象的哪个属性?如果我要编辑一个属性,我必须知道我正在编辑什么属性。
我一直在努力筛选 Delphi 帮助、在线帮助以及 TPropertyEditor 和后代源代码,但我找不到答案。
我期待的是:
TPropertyEditor = class(...)
public
procedure Initialize(TheObject: TObject; ThePropertyName: string);
end;
据我所知,我的属性编辑器已创建,我将被告知“编辑”,我只需要猜测他们希望我编辑的属性。
从帮助:
整体编辑属性
您可以选择提供一个对话框,用户可以在其中直观地编辑属性。属性编辑器最常见的用途是用于本身就是类的属性。一个例子是字体属性,用户可以打开一个字体对话框来一次选择字体的所有属性。
要提供整体属性编辑器对话框,请覆盖属性编辑器类的 Edit方法。
编辑方法使用与编写 GetValue和SetValue方法相同的 Get 和 Set方法。实际上,Edit方法同时调用 Get 方法和 Set 方法。因为编辑器是特定类型的,所以通常不需要将属性值转换为字符串。编辑器通常处理“检索到的”值。</p>
当用户单击属性旁边的“...”按钮或双击值列时,对象检查器会调用属性编辑器的Edit 方法。
在Edit方法的实现中,请执行以下步骤:
- 构建您用于属性的编辑器。
- 读取当前值并使用 Get 方法将其分配给属性。
- 当用户选择一个新值时,使用 Set 方法将该值分配给属性。
- 销毁编辑器。
回答
它被隐藏起来,没有记录,但我发现了如何。我正在编辑的属性:
TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));
现在我有了值,我可以编辑它。如果我想用其他对象替换该属性:
SetOrdValue(Longint(TheNewValue));
完整代码:
创建一个继承自TClassProperty的属性编辑器:
TMyPropertyEditor = class(TClassProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
end;
首先是家务,告诉Delphi的对象检查器我的属性编辑器会显示一个对话框,这会使属性旁边出现一个“...”:
function TMyPropertyEditor.GetAttributes: TPropertyAttributes;
begin
//We show a dialog, make Object Inspector show "..."
Result := [paDialog];
end;
接下来是实际工作。当用户单击“...”按钮时,对象检查器会调用我的Edit方法。我缺少的技巧是我调用了我的GetOrdValue方法。即使我的属性不是ordinal,您仍然可以使用它,并将生成的东西转换为对象:
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;