Приветствую Вас Гость | RSS

Reversing and Code

Четверг, 19.10.2017, 21:26
Главная » 2011 » Август » 6 » Управление формами
18:54
Управление формами
Просматривая код других 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;

На этом всё. Надеюсь, что мои советы кому то будут полезны.
Категория: Программирование в Delphi | Просмотров: 11133 | Добавил: PE_Kill | Теги: Оптимизация, формы, delphi | Рейтинг: 0.0/0
Всего комментариев: 1
1  
http://travel-cruise.ru/kruiz-iz-spb-po-evrope/ - Круиз из спб по европе

Имя *:
Email *:
Код *: