Вы не "теряете" ресурсы, вы их используете. Вы ИСПОЛЬЗУЕТЕ ресурсы на каждой страницы начиная с первой, которая доступна для вашего созерцания. Я упомянаю это потому, потому что проблема ПОТЕРИ ресурсов относится к другому типу проблемы.
Недавно я работал над проблемой показа других *ФОРМ* в главной форме, как если бы они были страницами NoteBook. Форма создается при перелистывании на эту "страницу", и разрушается при ее покидании. Это требует хранения неизменяемой информации, естественно, в главной форме, но это чрезвычайно нетребовательно к ресурсам. Главное, что вы храните поля индивидуальных данных в главной форме с именем "Child", а инициализируете в обработчике события экземпляра TForm2 (или имеющего другое имя, в зависимости от имени вашей первой дочерней формы) OnCreate. Поместите закладки в нижней части формы, и при изменении закладки освобождайте текущего "ребенка", а затем создавайте и делайте ребенком другой соответствующий экземпляр формы.
Как заставить работать эту технологию: у каждой дочерней формы имеется метод CreateParams, позволяющий сделать ее "ребенком" главной формы:
PROCEDURE TPageForm.CreateParams(VAR Params: TCreateParams); BEGIN Inherited CreateParams(Params);WITH Params DOBEGINWndParent := 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 OF0 : Child := TForm2.Create(Application);1 : Child := TForm3.Create(Application);2 : Child := TForm4.Create(Application);END;Child.Show;LockWindowUpdate(0);end; |
Надеюсь это окажется полезным!
- Neil [000664]
Я пробовал следующий код и он отлично работает с компонентами, являющимися частью формы, содержащей TTabbedNotebook; тем не менее он не работает с дочерними формами:
ChildForml[i].Parent := TWinControl(BrowseTabNotebook.Pages.Objects[i]); |
В дочерней форме должен быть следующий код:
private { Private-Deklarationen }procedure CreateParams(var Params: TCreateParams); override; ... procedure TChildForm1.CreateParams(var Params: TCreateParams);begininherited CreateParams(Params); { сначала вызываем унаследованные методы. }with Params do beginWndParent := Application.Mainform.Handle;Style := (Style or WS_CHILD) and not WS_POPUP;end;end; |
- Ralph Friedman [000823]