TTabSet по сравнению с TTabControl по сравнению с TPageCtrl/TTabSheet?

Для массивов той же длины:

my @zipped = ( @a, @b )[ map { $_, $_ + @a } ( 0 .. $#a ) ];
16
задан Gulbahar 17 August 2009 в 15:54
поделиться

2 ответа

Из справочного файла TTabSet:

Элементы управления набором вкладок обычно используются для отображать страницы с вкладками в диалоговом окне коробка. TTabSet предназначен для обратного совместимость. Используйте TTabControl компонент в 32-битной Windows приложения.

Итак, реальный вопрос в том, в чем разница между TTabControl и TPageControl? Разница в том, что TTabControl имеет только одну «страницу», тогда как TPageControl имеет по одной странице для каждой вкладки. Это делает их полезными в различных ситуациях.

TPageControl полезен для диалогов, в которых вы хотите разместить на экране больше пользовательского интерфейса, чем у вас есть экранное пространство для его размещения. Организуйте свой пользовательский интерфейс по категориям и поместите каждую категорию на одну страницу. Вы часто видите этот шаблон в диалогах настроек, например.

TTabControl, с другой стороны, хорошо работает для работы с массивом / списком объектов. Создайте пользовательский интерфейс для отображения и редактирования свойств одного объекта и поместите его в TTabControl, затем создайте одну вкладку для каждого объекта и настройте обработчики событий, чтобы он ' Я загружаю новый объект из массива в элементы управления всякий раз, когда вы меняете вкладки.

Что касается вопроса о фреймах, основная причина использования TPageControl в сочетании с фреймами заключается в том, что он предоставляет заранее созданный способ решить, какой фрейм отображать. Таким образом, вам не нужно изобретать механизм для этого.

23
ответ дан 30 November 2019 в 21:11
поделиться

Один метод, который я использовал с большим успехом, - это использование фреймов с TPageControl и поздняя привязка моих фреймов к tPageControl при первом выборе страницы. Это сокращает время загрузки формы, не создавая фреймы, которые никогда не просматриваются, но, тем не менее, обеспечивает гибкость создания, состояние сохраняется при переходе между вкладками. Недавно я переключился на использование форм и встраивание их вместо фреймов ... но концепция та же.

То же самое можно сделать, используя единственную «точку монтирования» на TTabControl и отключая ее при изменении вкладки, но затем возникает вопрос о том, что делать с состоянием вкладок, когда вкладки тоже переключаются обратно.

[ РЕДАКТИРОВАТЬ ] Возникает вопрос, как мне обрабатывать связь между фреймом и родительской формой. На самом деле это очень легко сделать с помощью интерфейсов. Просто создайте новый блок, который будет использоваться формой И фреймом, и добавьте два интерфейса:

type
  IFormInterface = interface
    [guid]
    procedure FormProc;
  end;

  IFrameInterface = interface
    [guid]
    procedure SetFormController(Intf:IFormInterface);
  end;

Пусть форма реализует IFormInterface, а фрейм реализует IFrameInterface. Когда вы щелкаете вкладку и показываете фрейм, затем запускаете следующий код:

var
  FrameIntf : IFrameInterface;
begin
  if Supports(FrameObj,IFrameINterface,FrameIntf) then
    FrameIntf.SetFormController(Self);
end;  

ваша фрейм-реализация метода SetFormController будет удерживать переданную ссылку, что позволит ему вызывать форму вверх.

procedure TFrame1.SetFormController(Intf:IFormInterface);
begin
  fFormController := Intf;
end;

Procedure TFrame1.Destroy; override;
begin
  fFormController := nil;  // release the reference
  inherited;
end;

Procedure TFrame1.Button1Click(Sender:tObject);
begin
  if fFormController <> nil then
    fFormController.FormProc
  else
    Raise Exception.Create('Form controller not set');
end;
5
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: