Динамически добавлять вкладки в элемент управления страницы и вставлять форму?

Я работаю над модулем, который состоит из элемента управления страницы. По умолчанию этот элемент управления страницы (TPageControl) не должно быть никаких вкладок (TTabSheet), но после инициализации он должен динамически вставлять эти страницы и вставлять в них форму.

Проблема заключается в том, чтобы знать, как вставить вкладку в элемент управления страницы. Как мне это создать? И как только он будет создан, вместе с формами внутри каждой, как мне пройти через них, чтобы уничтожить формы?

3 ответа

Решение

1. Как динамически создать вкладку?

procedure TForm1.Button1Click(Sender: TObject);
var
  TabSheet: TTabSheet;
begin
  TabSheet := TTabSheet.Create(PageControl1);
  TabSheet.Caption := 'New Tab Sheet';
  TabSheet.PageControl := PageControl1;
end;

2. Как встроить форму внутри вкладки?

Чтобы вставить форму внутри вкладки, просто измените родительский элемент:

Form2.Parent := TabSheet;
Form2.Show;

3. Нужно ли вручную удалять формы, вложенные в лист вкладок, при их уничтожении?

Нет, достаточно освободить вкладку. В случае, когда формы будут иметь вкладку или, если быть более точным, TWinControl как их Parent этот родитель позаботится об их освобождении при освобождении.

Дэвид Хеффернан прав.

Form2.Parent := TabSheet;
Form2.Show;

Этот код означает, что родитель Form2 - это TabSheet, а не его владелец.

Вы можете создать форму следующим образом:

Form2 := TForm2.Create(nil);

и затем освободите это самостоятельно. или вы можете создать такую ​​форму:

Form2 := TForm2.Create(Form1);

Form1 является владельцем Form2, и она автоматически освобождает Form2, когда сама освобождается.

Я делаю то же самое в проекте, который имеет более 100 форм (по одной на DLL). Я установил действие FormClose на caFree — некоторые клиенты используют этот продукт круглосуточно в течение пары лет без проблем. Утечки обнаружены только в Borland VCL. Проект начался в D5, затем в D7, и мы находимся в процессе переноса на Alexandria 11.2 (думаю, на D35). Я могу портировать на Lazarus и мигрировать на пользователей настольных компьютеров Mac и Linux.

Другие вопросы по тегам