Как динамически создавать настроенную среду выполнения TabSheet

Я хотел бы создать TTabsheet, который должен быть создан во время выполнения. TTabSheet имеет несколько компонентов, но все эти компоненты будут идентичны на каждой вкладке. Можно ли создать переменную типа, которая будет каждый раз создавать эти вкладки?

Спасибо

2 ответа

Решение

Да. Вы можете создать унаследованный класс от TTabSheet

TCustomTabSheet = class(TTabSheet)
public
  constructor Create(AOwner : TComponent); override;
public
   FTestButton : TButton;
end;

constructor TCustomTabSheet.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FTestButton := TButton.Create(Self);
  FTestButton.Parent := Self;
  FTestButton.Left := 1;
  FTestButton.Top := 1;
  FTestButton.Width := 20;
  FTestButton.Heigth := 10;
  FTestButton.Caption := 'Cool button!';
  FTestButton.Name := 'TestButton';
end;

Вы также можете создать фрейм (TFrame) со своими пользовательскими элементами управления во время разработки и разместить его экземпляры на всех новых вкладках.

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

function TMy_form.add_ts_mmo( ntbk : TPageControl; caption : string ) : TTabSheet;
var mmo : TMemo;
begin
  Result := TTabSheet.Create(self);
  Result.PageControl := ntbk;
  Result.Caption := caption;
  mmo := TMemo.Create(self);
  Result.Tag := Integer(mmo);
  mmo.Parent := Result;
  mmo.Font.Name := 'Courier New';
  mmo.Font.Size := 10;
  mmo.Align := alClient;
  mmo.ScrollBars := ssBoth;
  mmo.WordWrap := true;
end;

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

var
  ts : TTabSheet;
. . .
  ts := add_ts_mmo( myPageControl, ExtractFileName( text_file_nm ) );

Обратите внимание, что я сохраняю указатель новой заметки в ts.Tag так что я могу легко добраться до него позже через актерский состав.

TMemo(ts.Tag).Lines.LoadFromFile( text_file_nm );

Никаких подклассов не требуется. Вы можете создавать любые другие компоненты, которые вы можете захотеть на вкладке, после того, как Result.Caption := caption линия. Просто обязательно установите их .Parent собственность на Result,

PageControl может быть создан во время разработки или во время выполнения.

Другие вопросы по тегам