Обращение к методам и полям формы из только что созданного объекта

aford
Дата: 21.06.2019 12:43:34
У меня есть динамически создаваемая форма, пусть будет
Unit2

...

type
  TFrm2 = class(TForm)
public
  SomeProc;

...

procedure OpenFrm2;
var
  Frm2: TFrm2;
begin
  Frm2:= TFrm2.Create(Application);
  try
    Frm2.Showmodal;
  finally
    Frm2.Free;
  end;
end;

Вызываю ее из 1-й формы простым OpenFrm2 (все лишнее убрал, код максимально упростил)
В этом же юните, где определена TFrm2 (или в другом, не важно), определен класс
  TMyclass = class
  private
    FSomeField: string;
  public
    constructor Create(AOwner: TObject);
    Destructor Destroy; override;
  end;

Создаю объект этого из юнита, где определен TFrm2:
var
  Myclass: TMyclass;
begin
  Myclass:= TMyclass.Create(Self); // т.е. передаю в качестве владельца форму Frm2, правильно?
end; 

Так вот вопрос, как из созданного объекта обратиться к методам (процедурам) TFrm2?
(Self as TFrm2).SomeProc - вообще не то, но мысль, думаю, довел.
Направьте, плз, где смотреть, куда читать или если не сложно - лучше пример.
Спасибо!
Мимопроходящий
Дата: 21.06.2019 12:49:19

ЯНХНП

Posted via ActualForum NNTP Server 1.5

zinpub
Дата: 21.06.2019 12:53:34
(Owner as TFrm2).SomeProc
aford
Дата: 21.06.2019 13:20:03
zinpub,
автор
(Owner as TFrm2).SomeProc
не работает, подчеркивает и говорит "Undeclared identifier 'Owner')
RWolf
Дата: 21.06.2019 13:26:33
Owner — свойство TComponent, так что нужно либо TMyclass наследовать от TComponent, либо сохранять аргумент конструктора (AOwner) как поле объекта.
aford
Дата: 21.06.2019 13:30:53
RWolf
либо сохранять аргумент конструктора (AOwner) как поле объекта.

Только что так и сделал. Спасибо за разъяснения!
_Vasilisk_
Дата: 21.06.2019 13:35:24
aford
Только что так и сделал
А почему бы не сделать так?

  TMyclass = class
  private
    FSomeField: string;
  public
    constructor Create(AOwner: TFrm2);
    Destructor Destroy; override;
  end;
aford
Дата: 21.06.2019 14:00:44
_Vasilisk_, можно и так, не принципиально, напрямую или через TObject как у меня, разве что придется присваивать потом в OnCreate
FOwner:= (AOwner as TFrm2)

Я вообще все это затеял, чтобы написатть юнит с объектом для программы с формой и для службы. Только надо чтобы он еще и лог выводил, и тому и тому. Вот сижу думаю как лучше сделать
Мимопроходящий
Дата: 21.06.2019 14:09:05

лучше всё таки наследоваться от TComponent, как уже сказали выше,
а не создавать объект с нуля.

Posted via ActualForum NNTP Server 1.5

aford
Дата: 21.06.2019 14:53:11
Мимопроходящий, точно, тогда поле FOwner не надо создавать.
А потом так
procedure TMyClass.AddLog(pPriority: Boolean; pStr: String);
begin
  if Owner is TFrm1 then // лог в программу
    (Owner as TFrm1).AddLog(pPriority, pStr)
end;

Только как сделать запись лога в службу, там же Owner другой будет. Можно конечно и так

  if Owner is TSrv1 then 
    (Owner as TSrv1).AddLog(pPriority, pStr)


Но тогда придется в uses прописывать и тот модуль и тот, что как-то нелогично, может объявить какой-то перехватчик сообщений объекта в программе и службе, или .. ну это уже другой вопрос. Всем спасибо!