позволить C ++ Builder / Delphi создавать TForms при запуске или создавать вручную? - PullRequest
6 голосов
/ 10 ноября 2010

Когда TForm создается в Builder (или Delphi), код добавляется в main для создания этих форм при запуске приложения:

Application->CreateForm( __classid( TxForm), &xForm );

это облегчает задачу, но разумно ли, когда приложения имеют 10, 20, 50, 100 форм? Я предполагаю, что это может захватить все виды памяти и системных дескрипторов. Форма всегда может быть создана на лету, когда это необходимо, удалив ее с помощью диалогового окна Project-> Options-> Forms и:

std::auto_ptr< TxForm > myForm( new TxForm( this ));

myForm->ShowModal();

Таким образом, вопрос в том, что лучше: позволить C ++ Builder делать это по-своему или вручную создавать форму при необходимости?

Ответы [ 5 ]

5 голосов
/ 11 ноября 2010

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

Использование автоматически созданных форм и модулей данных поощряет использование глобальных переменных, которые IDE объявляет для ссылки на эти объекты.Вам они не нужны.

Автоматическое создание только вашей основной формы.Когда вам нужно что-то еще, создайте его самостоятельно, используя типичный способ создания объектов: вызовите конструктор и сохраните ссылки на объекты в локальных переменных или полях других ваших объектов, а не на глобальные переменные, предоставленные IDE, которые следует удалить.Не беспокойтесь о CreateForm. Я написал статью, объясняющую почему.

5 голосов
/ 10 ноября 2010

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

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

2 голосов
/ 11 ноября 2010

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

2 голосов
/ 10 ноября 2010

Формы, которые созданы, но еще не видны, занимают память и влияют на время запуска, но не должны использовать какие-либо системные дескрипторы, поскольку такие вещи, как дескрипторы окна, не выделяются до тех пор, пока окно фактически не отображается.

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

Как документация VCL объясняет , delete, что форма напрямую (или косвенно, используя запас std::auto_ptr) может вызвать ошибки памяти, так как форма может содержать необработанные сообщения.Чтобы избежать этой проблемы, я написал два класса интеллектуальных указателей, которые заботятся о вызове Release вместо delete.Вы можете скачать их с http://gist.github.com/671452.

0 голосов
/ 11 ноября 2010

Если приложение не является просто ОЧЕНЬ МАЛЫМ испытательным стендом или POC создать только основную форму (и / или глобальный модуль данных, если он свой стиль / дизайн) и создайте все остальные вручную.

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

...