Советы по Delphi

         

Notebook как контейнер для форм I


...у меня происходит утечка памяти при изменениях страниц в закладках 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;

Надеюсь это окажется полезным!

- Neil [000664]



Содержание раздела