Передача параметров в delphi TFrame - PullRequest
3 голосов
/ 05 марта 2009

Чтобы избежать синглетонов и глобальных переменных, я хотел бы иметь возможность передавать параметры в компонент TFrame. Однако, поскольку TFrame обычно включается в форму во время разработки, можно использовать только конструктор по умолчанию.

Родительская форма может, конечно, устанавливать некоторые свойства в обратном вызове OnCreate после создания TFrame. Однако это не гарантирует, что свойство не будет забыто, а зависимости не так ясны, как при использовании конструктора.

Хороший способ был бы, если бы была возможность зарегистрировать фабрику для создания компонентов во время чтения файла dfm. Затем необходимые параметры могут быть переданы в конструктор TFrame при создании на заводе. Есть ли способ сделать это?

Или у кого-нибудь есть лучшее решение о том, как передавать параметры в TFrame?

Ответы [ 5 ]

4 голосов
/ 05 марта 2009

Все компоненты, включая потомков TFrame, должны иметь возможность конструироваться с использованием конструктора, унаследованного от TComponent. В противном случае они не могут быть использованы должным образом во время разработки. Если для вас приемлемо ограничение времени разработки, вы можете переопределить этот конструктор и вызвать исключение. Это предотвратит размещение компонента на форме во время разработки. Просто предоставьте некоторый другой конструктор, который требует других параметров.

Из-за требований времени разработки все компоненты должны иметь возможность существовать, при этом некоторые или все их свойства по-прежнему имеют значения по умолчанию. Это не означает, что компоненты должны делать полезные вещи, пока они находятся в этом состоянии, но они должны быть в состоянии оставаться в этом состоянии до бесконечности. Например, все должно быть в порядке, чтобы поместить компонент в форму, сохранить форму и закрыть Delphi с намерением возобновить проектирование формы позднее. Компонент должен позволять сохранять и восстанавливать себя, даже если все его свойства еще не настроены для конечного использования.

Мой предпочтительный вариант - применять правила компонента только во время выполнения. Убедитесь, что все свойства установлены в разумные значения, прежде чем разрешить их использование. Вы можете использовать утверждения для обеспечения правильного использования ваших компонентов. Потребители ваших классов будут учиться очень быстро, если они не закончили настраивать ваши компоненты в своих формах.

1 голос
/ 06 марта 2009

Обычно я добавляю открытую, не виртуальную процедуру «Инициализация» или (Инициализация для американцев), которая требует предоставления всех параметров. Затем будут установлены свойства.

Сделайте свойства защищенными или приватными, если это возможно, поэтому их можно установить только путем вызова Initialise (AFoo, ABar: integer).

Затем в TFormXXX.FormCreate или TformXXX.Create введите:

inherited;
Initialise(foo, bar);
0 голосов
/ 02 мая 2010

а) кадр может создаваться динамически, когда требуется, и уничтожаться, когда он не нужен.

b) присвоить фрейму открытое свойство либо с типом данных параметра, либо со структурой данных и передать значения в форму через свойство.

Пример:
TAddress - класс для хранения обычных элементов адреса.
TAddressFra - рамка с визуальным управлением для отображения адреса

  • заполнить экземпляр TAddress значениями
  • создать экземпляр TAddressFra
  • назначить свойство TAddressFra.address с экземпляром TAddress
  • используйте процедуру setAddress(o_address : TAddress), чтобы присвоить значения атрибутов TAddress соответствующим визуальным компонентам на TAddressFra
0 голосов
/ 05 марта 2009

Если фабрика может предоставить необходимые параметры, почему бы вам просто не переопределить конструктор по умолчанию для вашего фрейма и запросить параметры у фабричного класса?

Я обычно делаю свой собственный конструктор. В любом случае, я не люблю создавать рамки во время разработки.

0 голосов
/ 05 марта 2009

не могли бы вы создать / зарегистрировать свой собственный компонент tFrame и Поместите это в форму - его создание может передать что угодно.

...