2009-03-05 3 views
2

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

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

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

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

+0

Можете ли вы объяснить, откуда эти параметры? Если у вас есть фабрика, создающая эти TFrames, как она знает, какие параметры использовать? –

ответ

3

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

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

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

+0

Я думаю, что это «способ Delphi» сделать это. Я пытался отделить создание объекта от логики приложения с помощью заводов (см. Http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/) – ajob

0

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

+0

Пользовательские конструкторы не вызываются во время потоковой передачи. Вызывается только конструктор Create (TComponent), потому что это тот, который унаследован от TComponent. –

0

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

Обычно я создаю свой собственный конструктор. Мне все равно не нравится создавать кадры во время разработки.

+0

«а как фабричный класс»? Это предложение не анализируется. –

+0

Woops. Наверное, я забыл скомпилировать и запустить unittests, прежде чем я зарегистрировался ... – Vegar

1

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

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

Затем в TFormXXX.FormCreate или TformXXX.Создание, есть:

inherited; 
Initialise(foo, bar); 
0

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

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

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

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