Как динамически создавать настроенную среду выполнения 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 может быть создан во время разработки или во время выполнения.