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;