Передача параметров в delphi TFrame
Чтобы избежать синглетонов и глобальных переменных, я хотел бы иметь возможность передавать параметры компоненту TFrame. Однако, поскольку TFrame обычно включается в форму во время разработки, можно использовать только конструктор по умолчанию.
Конечно, родительская форма может устанавливать некоторые свойства в обратном вызове OnCreate после создания TFrame. Однако это не гарантирует, что свойство не будет забыто, а зависимости не так ясны, как при использовании конструктора.
Хорошим способом было бы, если бы была возможность зарегистрировать фабрику для создания компонентов во время чтения файла dfm. Затем необходимые параметры могут быть переданы в конструктор TFrame при создании на заводе. Есть ли способ сделать это?
Или у кого-нибудь есть лучшее решение о том, как передать параметры в TFrame?
5 ответов
Все компоненты, в том числе потомки TFrame
необходимо иметь возможность конструировать с использованием конструктора, унаследованного от TComponent
, В противном случае они не могут быть использованы должным образом во время разработки. Если для вас приемлемо ограничение времени разработки, вы можете переопределить этот конструктор и вызвать исключение. Это предотвратит размещение компонента на форме во время разработки. Просто предоставьте некоторый другой конструктор, который требует других параметров.
Из-за требования времени разработки все компоненты должны иметь возможность существовать, при этом некоторые или все их свойства по-прежнему имеют значения по умолчанию. Это не означает, что компоненты должны делать полезные вещи, пока они находятся в этом состоянии, но они должны быть в состоянии оставаться в этом состоянии до бесконечности. Например, все должно быть в порядке, чтобы поместить компонент в форму, сохранить форму и закрыть Delphi с намерением возобновить проектирование формы позднее. Компонент должен позволять сохранять и восстанавливать себя, даже если все его свойства еще не настроены для конечного использования.
Мой предпочтительный вариант - применять правила компонента только во время выполнения. Убедитесь, что все свойства установлены в разумные значения, прежде чем разрешить их использование. Вы можете использовать утверждения для обеспечения правильного использования ваших компонентов. Потребители ваших классов будут учиться очень быстро, если они не закончили настраивать ваши компоненты в своих формах.
Обычно я добавляю открытую, не виртуальную процедуру "Инициализация" или (Инициализация для американцев), которая требует предоставления всех параметров. Это тогда установит свойства.
Сделайте свойства защищенными или частными, если это возможно, поэтому единственный способ, которым они могут быть установлены, - это вызвать Initialise(AFoo, ABar: integer).
Затем в TFormXXX.FormCreate или TformXXX.Create есть:
inherited;
Initialise(foo, bar);
Если фабрика может предоставить необходимые параметры, почему бы вам просто не переопределить конструктор по умолчанию для вашего фрейма и спросить у фабричного класса параметры?
Я обычно делаю свой собственный конструктор. В любом случае, я не люблю создавать рамки во время разработки.
А) кадр может быть создан динамически, когда это необходимо, и уничтожен, когда он не нужен.
b) дать фрейму открытое свойство с типом данных параметра или структурой данных и передать значения в форму через свойство.
Пример:TAddress
- класс для хранения обычных элементов адреса.TAddressFra
- рамка с визуальным управлением для отображения адреса
- заполнить экземпляр
TAddress
со значениями - создать экземпляр
TAddressFra
- назначить
TAddressFra.address
собственность сTAddress
пример - использовать процедуру
setAddress(o_address : TAddress)
назначить значенияTAddress
атрибуты соответствующих визуальных компонентов наTAddressFra
Можете ли вы создать / зарегистрировать свой собственный компонент tFrame и поместить его в форму - его создание может передать ему все, что угодно.