Назначьте TForm переменной Delphi для использования в других единицах - PullRequest
0 голосов
/ 21 июня 2019

У меня есть приложение с тремя формами (одна для телефона, планшета и рабочего стола), которые имеют одинаковый компонент, и все компоненты имеют одинаковое имя в каждой форме.При запуске приложения создается только одна форма в зависимости от экранного решения.

Затем у меня есть модуль, который вызывается из модуля форм, и мне нужно отобразить результат в вызывающей форме / модуле

Прямо сейчас я должен сделать это:

If assigned(mobileform1) do
   mobileform1.Memo1.Text := MyText
else if assigned(mobileform2) do
   mobileform1.Memo1.Text := MyText
else if assigned(desktopform) do
   mobileform1.Memo1.Text := MyText;

Есть ли способ назначить созданную форму переменной и просто иметь одну строку?

CreatedForm.Memo1.Text := MyText;

Я пыталсяприсвоить ее переменной TForm, но я не могу ее использовать или не знаю как.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 21 июня 2019

Согласно комментариям, правильное решение вашей проблемы - использовать базовую форму .

А пока это должно дать вам быстрое решение вашей проблемы:

  (CreatedForm . FindComponent ( 'Memo1' ) as tMemo)
     . Text := 'I love peanut butter sandwiches.';

Почему не работает ссылка на CreatedForm.Memo1? Рассмотрим следующий код:

type
  tMyBaseClass = class
    X : double;
  end;

  tClassA = class ( tMyBaseClass )
    Y : integer;
    Z : string;
  end;

  tClassB = class ( tMyBaseClass )
    Y : array[1..100]of integer;
    Z : string;
  end;

var
  J : tClassA;
  K : tMyBaseClass;
begin
  J := tClassA . Create;
  J . X := 3.14;
  J . Y := 4;
  J . Z := 'Hello';

  K := J;
  K . X := 2.71828;
  K . Y := 7;       // Does not compile
  K . Z := 'There'; // Does not compile

Мы начнем с определения базового класса tMyBaseClass и определим два разных типа классов, которые являются производными от tMyBaseClass, tClassA и tClassB. J объявлен как тип tClassA. Компилятор знает, что J относится к экземпляру объекта tClassA, и поэтому вы можете получить доступ к J.X, J.Y и J.Z. Но K имеет тип tMyBaseClass. Вы можете ссылаться на K.X, потому что он определен в базовом классе, но вы не можете получить доступ к K.Y или K.Z, потому что это поля tClassA, и компилятор не может знать, что K ссылаясь на экземпляр tClassA.

Это, по сути, то, что происходит в вашем коде. Базовый класс tForm, и вы определили классы tMobileForm и tDesktopForm, которые оба являются производными от tForm. Каждая из этих форм имеет поле с именем Memo1. У вас есть CreatedForm типа tForm. Вы не можете получить доступ к CreatedForm.Memo1, потому что класс tForm не имеет поля с именем Memo1.

Одним из решений является перемещение поля Memo1 в базовый класс. Таким образом, вы могли бы иметь

type
  tSharedForm = class ( tForm )
    Memo1 : tMemo;
  end;

  tDesktopForm = class ( tSharedForm )
    SomeOtherControl : tPanel;
  end;

  tMobileForm = class ( tSharedForm )
    SomeOtherControl : tComboBox;
  end;

Если затем вы объявите CreatedForm типа tSharedForm, то вы можете получить доступ к CreatedForm.Memo1, поскольку он теперь находится в базовом классе.

Это то, что базовая форма сделает для вас.

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