Delphi: доступ к свойствам переменной Field напрямую - PullRequest
0 голосов
/ 28 июня 2018

У меня есть класс, который содержит другой класс. Возможно ли в Delphi прямой доступ к свойствам класса-члена?

TNameValue = class
private
  FSubName: string;
  FSubValue: Integer;
public
  property SubName: string read FSubName write FSubName;
  property SubValue: Integer read FSubValue write FSubValue;
end;

TParentclass = class(TSomeotherclass)
  FNameValue: TNameValue;
public
  property NameValue: TNameValue read FNameValue write FNameValue;
end;

procedure TForm.Buttonclick();
begin
  Parentclass := TParentclass.Create();
  // here i would need to directly access the Property of the member class.
  Showmessage(Parentclass.Subname);
end;

Я знаю, что могу создать свойства для всех свойств подкласса, к которому я хочу получить доступ, но у меня есть этот класс в нескольких других классах, и я не хочу менять код везде, когда меняется подкласс.

Есть ли способ определить свойство для непосредственной публикации его свойств? Я знаю, что могу получить к нему доступ, используя Parentclass.NameValue.Subname, но я хочу использовать его без дополнительного шага NameValue.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Delphi не распознает это автоматически. Но вы можете помочь.

constructor TParentClass.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  fSubClass := TSubClass.Create(Self);
  fSubClass.SetSubComponent(True);
end;

как это вы создаете составной компонент компонент, содержащий другой компонент

изменено отсюда:

unit uSubClass;

uses Classes;

type 
  TSubClass = class(TObject)
  private
    fProp: string;
  protected
    procedure SetProp(const aValue: string);
    function GetProp: string;
  public
    property Prop: string read GetProp write SetProp;
  end;

var SingleSubClass: TSubclass;

implmentation

procedure SetProp(const aValue: string);
begin
  fProp := aValue; 
end;

function GetProp: string;
begin
  Result := fProp;
end;

initialization
  SingleSubClass := TSubClass.Create;
finalization
  SingleSubClass.Free;
end;

что SingleSubClass теперь является глобальной переменной и может быть доступен в другом объекте.

procedure TForm123.Button1Click(Sender: TObject);
begin
  ShowMessage(SingleSubClass.Prop);
end;

если вы хотите, чтобы другие объекты были уведомлены об изменениях в нем, вам необходимо добавить в него шаблон наблюдателя и зарегистрировать все заинтересованные объекты для изменений https://sourcemaking.com/design_patterns/observer/delphi

0 голосов
/ 28 июня 2018

Есть ли способ определить свойство для непосредственной публикации его свойств?

Нет, это невозможно, так как для этого вам понадобится множественное наследование, а Delphi его не поддерживает. Либо переделайте свой дизайн класса, либо попробуйте реализовать необходимые свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...