Notebook как контейнер для форм
Автор: Neil
...у меня происходит утечка памяти при изменениях страниц в
закладках NoteBook.
Вы не "теряете" ресурсы, вы их используете. Вы ИСПОЛЬЗУЕТЕ ресурсы на каждой
страницы начиная с первой, которая доступна для вашего созерцания. Я упомянаю
это потому, потому что проблема ПОТЕРИ ресурсов относится к другому типу
проблемы.
Недавно я работал над проблемой показа других *ФОРМ* в главной форме, как
если бы они были страницами NoteBook. Форма создается при перелистывании на эту
"страницу", и разрушается при ее покидании. Это требует хранения неизменяемой
информации, естественно, в главной форме, но это чрезвычайно нетребовательно к
ресурсам. Главное, что вы храните поля индивидуальных данных в главной форме с
именем "Child", а инициализируете в обработчике события экземпляра TForm2 (или
имеющего другое имя, в зависимости от имени вашей первой дочерней формы)
OnCreate. Поместите закладки в нижней части формы, и при изменении закладки
освобождайте текущего "ребенка", а затем создавайте и делайте ребенком другой
соответствующий экземпляр формы.
Как заставить работать эту технологию: у каждой дочерней формы имеется метод
CreateParams, позволяющий сделать ее "ребенком" главной формы:
procedure TPageForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
WndParent := Application.MainForm.Handle;
Parent := Application.MainForm;
Style := WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
Align := alClient;
end;
end;
|
Код главной формы должен выглядеть примерно так:
procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
begin
LockWindowUpdate(Handle);
Child.Free;
case NewTab of
0: Child := TForm2.Create(Application);
1: Child := TForm3.Create(Application);
2: Child := TForm4.Create(Application);
end;
Child.Show;
LockWindowUpdate(0);
end;
|
Надеюсь это окажется полезным!
|