Как установить значение свойства объекта компонента по умолчанию?Delphi 2009: Значение по умолчанию объекта Component Object
компоненты Код класс:
unit CustomClass;
interface
uses
Classes;
type
TCustomClass = class;
TConfiguration = class;
TCustomClass = class (TComponent)
private
FConfiguration: TConfiguration;
procedure SetConfiguration(const Value: TConfiguration);
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TConfiguration = class (TPersistent)
private
FDelay: Integer;
FSize: Integer;
procedure SetDelay(const Value: Integer);
procedure SetSize(const Value: Integer);
published
property Delay: Integer read FDelay write SetDelay;
property Size: Integer read FSize write SetSize;
public
procedure Assign(Source: TPersistent); override;
end;
implementation
{ TCustomClass }
constructor TCustomClass.Create(AOwner: TComponent);
begin
inherited;
Configuration.FileName:= 'FileName';
Configuration.Size := 10;
end;
destructor TCustomClass.Destroy;
begin
Configuration.Free;
inherited;
end;
procedure TCustomClass.SetConfiguration(const Value: TConfiguration);
begin
FConfiguration.Assign(Value);
end;
{ TConfiguration }
procedure TConfiguration.Assign(Source: TPersistent);
begin
inherited;
Delay := (Source as TConfiguration).Delay;
Size := (Source as TConfiguration).Size;
end;
procedure TConfiguration.SetDelay(const Value: Integer);
begin
FDelay := Value;
end;
procedure TConfiguration.SetSize(const Value: Integer);
begin
FSize := Value;
end;
end.
В моем IDE будет отображаться как свойство объекта было изменено (жирным синим).
Я думал, что в создании по умолчанию и хранимые функции по свойствам класса TConfiguration, например, так:
TConfiguration
interface
private
function FileNameStored: Boolean;
published
property FileName: string read FFileName write SetFileName stored FileNameStored;
property Size: Integer read FSize write SetSize default 10;
implementation
function TConfiguration.FileNameStored: Boolean;
begin
Result := FileName <> 'FileName';
end;
окрашивает свойства TConfiguration в нормальных синий, но не свойство конфигурации TCustomClass, и я не хочу устанавливать его значения по умолчанию, находится на TCustomClass, так как TConfiguration может быть использован в других компонентах.
Тогда я подумал:
TCustomClass
interface
private
function ConfigurationStored: Boolean;
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration stored ConfigurationStored;
implementation
function TCustomClass.ConfigurationStored: Boolean;
begin
Result := Configuration.FileName <> 'FileName' and
Configuration.Size <> 10;
end;
Но это только устанавливает цвет конфигурации TCustomClass свойства в обычных синих, а не его свойства.
ОТВЕТ
Как @RemyLebeau указал (в первом и последнем ответе), были ошибки в коде. В этом компоненте и в этом случае я решил не устанавливать значения по умолчанию для свойств.
Вы намеревались отбросить объект конфигурации на форму, а также удалить пользовательский класс в форму и затем подключить их? Или вы хотите, чтобы объект конфигурации был свойством, принадлежащим настраиваемому классу, и его не нужно вручную создавать и назначать? –
Тогда вы действительно упустили некоторые очевидные вещи, как указывает Реми. Он показывает, что вам нужно явно создавать (в вашем конструкторе классов) и бесплатно (в деструкторе класса) все типы объектов TO, которые принадлежат (являются неотъемлемой частью) вашего объекта. У вас был базовый класс правильно, так что это хорошо. Вы можете добавить OnChange: TNotificationEvent в свой объект конфигурации. Таким образом, он может вызвать основной класс и заставить его что-то делать, когда кто-то пишет свойство конфигурации. –
@WarrenP Да. Я исправил его, но, как заметил @NGLN, не имеет смысла исправлять его по этому вопросу, так как он делает ответ ненужным.«OnChange: TNotificationEvent» действительно хороший совет, мне понравилось, так как я могу изменить значение «хранимых» свойств, если они являются частной переменной класса. Благодарю. –