TTabSet против TTabControl против TPageCtrl/TTabSheet?

Мне было интересно, почему Delphi (2007) предоставляет три виджета, которые, похоже, делают то же самое, и каковы преимущества/недостатки для каждого.

В той же теме, если я хочу отображать различные наборы элементов управления, почему я должен одобрять, например. PageControl + TabSheets + Frames вместо того, чтобы просто отображать разные кадры непосредственно в родительской форме?

Спасибо.

Ответы

Ответ 1

Из файла справки по TTabSet:

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

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

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

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

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

Ответ 2

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

То же самое можно сделать с помощью одной "точки монтирования" на TTabControl и ее переключения при изменении вкладки, но затем проблема о том, как обращаться с состоянием вкладки в качестве вкладок, также переключается обратно. /p >

[ EDIT] Возникает вопрос, как обрабатывать связь между фреймом и родительской формой. Это очень легко сделать с использованием интерфейсов. Просто создайте новый блок, который будет совместно использоваться формой И кадром и добавим два интерфейса:

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;