gpt4 book ai didi

delphi - 如何对具有子属性的属性进行编码? (还原)

转载 作者:行者123 更新时间:2023-12-03 15:29:47 28 4
gpt4 key购买 nike

我确信我得到了一个很好的答案 my previous question因为我之前从那些发帖的人那里得到了很多关于其他问题的帮助。

但我显然做错了什么,因为当我复制示例代码时,对象检查器向我显示的 MyProp 属性是单个文本输入字段。我期望看到类似 Font 属性的内容,包括 Pitch、字体系列等,即我期望看到树结构,但没有看到 MyProp 属性的 Color、Height 或 Width 属性。

有什么想法吗?我再次准确地复制了该代码。

<小时/>

编辑:我忘了提及(在这个问题中)我正在使用 TMS scripter pro,它允许用户在运行时设计表单并提供自己的对象检查器,但这可能是从标准 Delphi 的东西派生出来的,我猜.

无论如何,看来我太笨了,无法编写 Delphi 代码,因为我根本无法让它工作。

<小时/>

编辑:TMS 向我保证,如果具有“子属性”的类是 TPresistent 的后代,那么它将出现在具有子属性的对象检查器中,就像字体、 anchor 等

当我使用此代码时,“警告”属性在对象检查器中显示为文本字段,并且没有子属性

unit IntegerEditBox;
// An edit box which only accepts integer values and warns if the value is not in a certain range

interface

uses
SysUtils, Classes, Controls, StdCtrls,
EditBox_BaseClass;

type

TWarning = Class(TPersistent)
private
FWarningBelowValue : Integer;
FWarningAboveValue : Integer;
FWarningEmailTo : String;
FWarningSmsTo : String;
published
property WarningBelowValue : Integer read FWarningBelowValue write FWarningBelowValue;
property WarningAboveValue : Integer read FWarningAboveValue write FWarningAboveValue;
property WarningEmailTo : String read FWarningEmailTo write FWarningEmailTo;
property WarningSmsTo : string read FWarningSmsTo write FWarningSmsTo;
end;


TIntegerEditBox = class(TEditBox_BaseClass)
private
FWarning : TWarning;
procedure WriteValue(const newValue : Integer);


protected
// The new property which w/e introduce in this class
FValue : Integer;

public { Public declarations }
Constructor Create(AOwner: TComponent); override; // This constructor uses defaults
property Text;

published { Published declarations - available in the Object Inspector at design-time }
property Hint;

// Now our own properties, which we are adding in this class
property Value : Integer read FValue write WriteValue;
property Warning : TWarning read FWarning write FWarning ;
end; // of class TIntegerEditBox()

procedure Register;

implementation

uses
Dialogs;

procedure Register;
begin
RegisterComponents('Standard', [TIntegerEditBox]);
end;

Constructor TIntegerEditBox.Create(AOwner: TComponent);
begin
inherited; // Call the parent Create method
Hint := 'Only accepts a number|Only accepts a number'; // Tooltip | status bar text
Mandatory := True;
Value := 0;
Text := IntToStr(Value);
end;

procedure TIntegerEditBox.WriteValue(const newValue : Integer);
begin
Text := IntToStr(newValue);
end;

end.

最佳答案

original versionthe demo code忽略创建属性对象的实例。

constructor TMyControl.Create(AOwner: TComponent)
begin
inherited;
FMyProp := TCustomType.Create;
end;

不要忘记在析构函数中释放它。

雷米对该答案的评论指出,该属性需要以不同的方式分配。该属性的 write 访问器不应直接写入该字段。相反,它应该有一个像这样工作的 setter 方法:

procedure TMyControl.SetMyProp(const Value: TCustomType);
begin
FMyProp.Assign(Value);
end;

这还强调了实现属性类的 Assign 方法的要求,否则您会收到奇怪的错误消息,例如“无法将 TCustomType 分配给 TCustomType”。一个简单的实现可以像这样:

procedure TCustomType.Assign(Source: TPersistent);
begin
if Source is TCustomType then begin
Color := TCustomType(Source).Color;
Height := TCustomType(Source).Height;
Width := TCustomType(Source).Width;
end else
inherited;
end;

关于delphi - 如何对具有子属性的属性进行编码? (还原),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810602/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com