Для массивов той же длины:
my @zipped = ( @a, @b )[ map { $_, $_ + @a } ( 0 .. $#a ) ];
Из справочного файла TTabSet:
Элементы управления набором вкладок обычно используются для отображать страницы с вкладками в диалоговом окне коробка. TTabSet предназначен для обратного совместимость. Используйте TTabControl компонент в 32-битной Windows приложения.
Итак, реальный вопрос в том, в чем разница между TTabControl и TPageControl? Разница в том, что TTabControl имеет только одну «страницу», тогда как TPageControl имеет по одной странице для каждой вкладки. Это делает их полезными в различных ситуациях.
TPageControl полезен для диалогов, в которых вы хотите разместить на экране больше пользовательского интерфейса, чем у вас есть экранное пространство для его размещения. Организуйте свой пользовательский интерфейс по категориям и поместите каждую категорию на одну страницу. Вы часто видите этот шаблон в диалогах настроек, например.
TTabControl, с другой стороны, хорошо работает для работы с массивом / списком объектов. Создайте пользовательский интерфейс для отображения и редактирования свойств одного объекта и поместите его в TTabControl, затем создайте одну вкладку для каждого объекта и настройте обработчики событий, чтобы он ' Я загружаю новый объект из массива в элементы управления всякий раз, когда вы меняете вкладки.
Что касается вопроса о фреймах, основная причина использования TPageControl в сочетании с фреймами заключается в том, что он предоставляет заранее созданный способ решить, какой фрейм отображать. Таким образом, вам не нужно изобретать механизм для этого.
Один метод, который я использовал с большим успехом, - это использование фреймов с 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;