При работе с компонентом TPageControl в Delphi часто возникает необходимость динамического создания вкладок (TabSheets) в runtime. Это может быть полезно, например, для добавления новых вкладок в зависимости от действий пользователя или изменений данных в приложении. В данной статье мы рассмотрим, как проверить, созданы ли вкладки, и активировать их, если они уже существуют, не создавая дубликаты.
Проблема
Пользователь создает вкладки в runtime и размещает на них фреймы, используя следующий код:
procedure TForm1.Button2Click(Sender: TObject);
var
TabSheetG: TTabSheet;
begin
TabSheetG := TTabSheet.Create(PageControl1);
TabSheetG.Caption := 'Tab Sheet green ';
TabSheetG.PageControl := PageControl1;
Frame3 := TFrame3.Create(nil);
Frame3.Parent := TabSheetG;
Frame3.Show;
end;
Пользователь хочет, чтобы при повторном нажатии на кнопку вкладка не создавалась заново, а просто активировалась, если она уже существует.
Решение
Для решения данной проблемы можно использовать приватную переменную типа TTabSheet в классе формы. Это позволит сохранить ссылку на созданную вкладку и использовать ее при повторном вызове события кнопки.
type
TForm1 = class(TForm)
...
private
FMyTabSheet: TTabSheet;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FMyTabSheet) then
begin
FMyTabSheet := TTabSheet.Create(PageControl1);
FMyTabSheet.PageControl := PageControl1;
// Дополнительный код для настройки вкладки
end;
PageControl1.ActivePage := FMyTabSheet;
end;
При закрытии вкладки необходимо обнулить ссылку на нее:
procedure TForm1.CloseTab;
begin
if Assigned(FMyTabSheet) then
begin
FMyTabSheet.PageControl := nil; // Удаляем ссылку на TPageControl
FMyTabSheet.Free; // Освобождаем вкладку
FMyTabSheet := nil; // Удаляем ссылку на вкладку
end;
end;
Вы можете вызвать TForm1.CloseTab при закрытии вкладки, например, через обработчик события OnCloseQuery вкладки.
Если у вас есть множество вкладок, вы можете использовать массив для хранения ссылок на них и использовать перечисление для индексации:
type
TPageType = (ptPage1, ptPage2, ...); // Перечисление типов страниц
var
FTabSheets: array of TTabSheet;
FFrames: array of TFrame;
FPageIndex: TPageType;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FTabSheets[FPageIndex]) then
begin
FTabSheets[FPageIndex] := TTabSheet.Create(PageControl1);
// Настройка вкладки
FFrames[FPageIndex] := TFrame.Create(nil);
FFrames[FPageIndex].Parent := FTabSheets[FPageIndex];
FFrames[FPageIndex].Show;
end;
PageControl1.ActivePage := FTabSheets[FPageIndex];
end;
procedure TForm1.CloseTab(const Index: TPageType);
begin
if Assigned(FTabSheets[Index]) then
begin
FTabSheets[Index].PageControl := nil;
FTabSheets[Index].Free;
FTabSheets[Index] := nil;
FFrames[Index].Free;
FFrames[Index] := nil;
end;
end;
Для динамического удаления вкладки в дизайнере, вы можете добавить кнопку закрытия на вкладку и обработать ее нажатие следующим образом:
procedure TForm1.ButtonCloseClick(Sender: TObject);
begin
if Sender is TFrame then
begin
var FrameSender := Sender as TFrame;
var Index: TPageType;
// Здесь должен быть код для определения индекса удаляемой вкладки
CloseTab(Index);
end;
end;
Этот код является лишь примером и должен быть адаптирован под конкретные нужды вашего приложения. Обратите внимание, что вам нужно будет реализовать логику для определения индекса удаляемой вкладки в зависимости от контекста вашего приложения.
Таким образом, вы сможете эффективно управлять созданием и удалением вкладок в runtime, обеспечивая их активацию без необходимости повторного создания.
В статье рассматривается вопрос динамического управления вкладками `TTabSheet` в runtime среды разработки Delphi, с целью их активации без повторного создания при наличии, а также удаления при необходимости.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.