В файле проекта убирайте всё, что не относится к созданию главной формы. Например, вот так:
Application.Initialize; Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2); // Application.CreateForm(TForm3, Form3); // Application.CreateForm(TForm4, Form4); // Application.CreateForm(TForm5, Form5); Application.Run;
А остальные формы создавайте только по мере необходимости. Например, так:
procedure TForm1.ShowAboutBox(); begin Application.CreateForm(TForm2, Form2); Form2.Show; end;
К тому же, редко используемые формы, такие как форма “О программе…” желательно вообще освобождать при закрытии методом Free и обнулять значением nil. Для чего – ясно. Стоит заметить, что в таких случаях, как вы наверное уже догадались, новая форма будет создаваться вновь и вновь, при каждом вызове метода ShowAboutBox. Я обычно в таких случаях просто затеняю ту кнопку или другой контрол, который вызывает метод (что конечно не совсем по правилам прилежного программирования), однако вы можете использовать примерно следующюю конструкцию:
if not Assigned(Form2) then Application.CreateForm(TForm2, Form2); Form2.Show;
Итак, обрисовывается полная картина использования таких форм. На примере нашей формы вывода информации о программе, привожу следующий код:
procedure TMainForm.AboutButtonClick(Sender: TObject); begin Self.ShowAboutBox; end; procedure TMainForm.ShowAboutBox; begin if not Assigned(AboutBox) then Application.CreateForm(TAboutBox, AboutBox); AboutBox.Show; end; procedure TAboutBox.FormClose(Sender: TObject; var Action: TCloseAction); begin Self.Free; AboutBox:=nil; end;
Если у вас есть достаточно большие проекты, которые используют множество форм создавая их автоматически, не ленитесь, перепишите их опираясь на данную статью. Это не займёт у вас много времени и Вы сразу заметите повышение скорости работы и уменьшение расхода оперативной памяти.
Вынужден с Вами не согласиться.
ОтветитьУдалитьУправление временем жизни объекта должно происходить в рамках одного контекста. В данном случае в методе TMainForm.ShowAboutBox.
Вызов метода Free и присваивание nil переменной вне метода TMainForm.ShowAboutBox делает использование объекта AboutBox менее понятным, к примеру, не до конца ясно, что вернет Assigned(AboutBox) в данный конкретный момент времени.
ИМХО, использование следующего кода является более предпочтительным:
procedure TMainForm.ShowAboutBox;
var
AboutBox: TAboutBox;
begin
AboutBox := TAboutBox.Create(Application);
try
AboutBox.Show;
finally
FreeAndNil(AboutBox);
end;
end;
Конструкция:
ОтветитьУдалитьtry
AboutBox.Show;
finally
FreeAndNil(AboutBox);
end;
посмотреть на форму AboutBox не даст - AboutBox сразу после показа ликвидируется.
Как минимум надо вместо Show поставить ShowModal.
А вот что вернет Assigned(AboutBox) - интересно! Вот :
...
Assigned(P)
...
Assigned returns False if P is nil, True otherwise.
Помоему всё нормально!
FreeAndNil немного читабельнее чем
Self.Free;
AboutBox:=nil;
а делает почти тоже самое только с лишним вызовом... :
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
>> opportune-fl
ОтветитьУдалить>> Управление временем жизни объекта должно >>происходить в рамках одного контекста
Совершенно верно, спасибо. На самом деле за это меня уже несколько раз "били по рукам".
>>Конструкция:
>>посмотреть на форму AboutBox не даст - >>AboutBox сразу после показа ликвидируется.
>>Как минимум надо вместо Show поставить >>ShowModal.
Правильно. Но если форма предпологает использование драг&дрод c другой формой например, такой метод выходом назвать нельзя. Или я ошибаюсь?
Уже давно пользуюсь данным приемом. Никаких проблем не возникало.
ОтветитьУдалить