Просматривая код других Delphi программистов, я постоянно вижу одни и те же ошибки. Самое ужасное, что я вижу такое и в очень дорогостоящих проектах, где, казалось бы должны работать профи. Давайте я немного расскажу о них, чтобы в последствии ВЫ писали код правильно.
Начнем с того, что по умолчанию все формы в Delphi создаются сразу же при загрузке программы и болтаются в памяти до ее закрытия. Если форм мало (2-3), то это не страшно, и для небольших утилит я даже не заостряю на этом внимание. Но если проект начинает обрастать большим количеством форм, это серьезно отражается на производительности. Простой пример. Мне попалась программа, в которой использовалось ~150 форм. Все они создавались автоматически. У многих были процедуры инициализации и финализации. Загрузка exe до момента показа главной формы занимала почти минуту (!!!). При этом в постоянной работе использовались только 3 (!) формы. Убрав инициализацию форм при запуске я выиграл во времени эту самую минуту, которая так раздражала заказчика. При этом существенно упал объем потребляемой памяти.
Теперь я расскажу как увидеть эту ошибку. Зайдите в Project->Options->Forms. В левом списке (Auto-create forms) находятся формы, которые будут создаваться автоматом. В правом списке (Available forms) формы, которые будут прилинкованы к проекту, но не созданы автоматом. Вам всего лишь надо перекинуть в правый список те формы, которые будут использовать редко.
Теперь о том, как такие формы использовать. Например у нас есть форма настроек. Настройки открывают крайне редко, и те 1-2 секунды, которые уйдут на создание формы роли не сыграют. Например у нас есть пункт меню, который открывает окно формы ввода настроек. Вот такой код выполнит создание и показ формы:
procedure TfrmMain.ItemOptionsClick(Sender: TObject); var frmOptions: TfrmOptions; // Наша форма begin frmOptions := TfrmOptions.Create(frmMain); // Создаем форму frmOptions.ShowModal; // Показываем и ждем результат frmOptions.Free; // Уничтожаем форму end;
Как можно заметить для показа формы я использовал ShowModal. ShowModal создает модальную форму, которая должна вернуть в основную форму статус, с которым она закрылась. Т.е. при вызове ShowModal код будет ждать закрытия формы, а основная будет неактивна, что и требуется в 99.99% случаев. Но почему то начинающие программисты (и не только) использую самопальные кривые способы синхронизации форм (а то и вообще не используют) посредством метода Show. Что приводит к глюкобагам пользовательского интерфейса. Есть одна особенность при работе формы в режиме ShowModal. Если в режиме Show для закрытия формы достаточно вызвать Close, то для модальной формы, свойству ModalResult нужно присвоить статус закрытия формы. Все статусы начинаются с префикса mr (modal result). Вот пример закрытия модальной формы для сообщения основной формы, что пользователь сохраняет настройки:
procedure TfrmOpions.btnApplyClick(Sender: TObject); begin ModalResult := mrOk; end;
После этого форма сразу же закроется сама. Обработать статус закрытия формы можно так:
procedure TfrmMain.ItemOptionsClick(Sender: TObject); var
frmOptions: TfrmOptions; // Наша форма begin
frmOptions := TfrmOptions.Create(frmMain); // Создаем форму
frmOptions.ShowModal; // Показываем и ждем результат if frmOptions.ModalResult = mrOk then begin // Тут сохраняем новые настройки end;
frmOptions.Free; // Уничтожаем форму end;
На этом всё. Надеюсь, что мои советы кому то будут полезны.