Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизКлонирование TabSheet со всем содержимым Найти похожие ветки
← →
DarkLord © (2006-03-10 13:16) [0]Имеется PageControl с одним TabSheet, на который, в design-time, помещены ComboBox-ы, LabeledEdit-ы и пр.
Необходимо, по нажатию кнопки, создать клон TabSheet-а со всем содержимым (контролами). Содержимое контролов можно не клонировать. Оно будет выполняться при иных условиях.
Главное условие - нормальный и лёгкий доступ в дальнейшем, к созданным TabSheet-ам и их контролам.
Доступ будет в виде процедуры, которой передается номер страницы, а она уже сама должна оперировать с контролами на этой странице.
Доп. условие - кол-во страниц переменное.
Пробовал работать через массивы компонентов, но возникают странности. Например, массив ComboBox-ов ведёт себя иначе, нежели такой же массив CheckBox-ов. Т.е. CheckBox-ы загоняются в массив, а при загоне ComboBox-ов, массив содержит nil. :(
Подозреваю, что это я лажанулся в коде, но может где-то есть что-то типа шаблона-заготовки, либо некоего компонента, дабы не изобретать веловипед.
← →
Crash Coredump © (2006-03-10 13:55) [1]
> Необходимо, по нажатию кнопки, создать клон TabSheet-а со
> всем содержимым (контролами). Содержимое контролов можно
> не клонировать
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;
type
TfMain = class(TForm)
Button1: TButton;
PageControl: TPageControl;
TabSource: TTabSheet;
Edit: TEdit;
CheckBox: TCheckBox;
ComboBox: TComboBox;
procedure Button1Click(Sender: TObject);
private
function CloneTab(Source: TTabSheet): TTabSheet;
end;
var
fMain: TfMain;
implementation
{$R *.DFM}
procedure TfMain.Button1Click(Sender: TObject);
var
Dest: TTabSheet;
begin
Dest := CloneTab(TabSource);
end;
function TfMain.CloneTab(Source: TTabSheet): TTabSheet;
var
I: Integer;
Control: TControl;
begin
Result := TTabSheet.Create (Self);
Result.Name := Source.Name+"1";
Result.PageControl := Source.PageControl;
for I:=0 to Pred(Source.ControlCount) do begin
Control := TControlClass(Source.Controls[I].ClassType).Create (Self);
Control.Name := Source.Controls[I].Name+"1";
Control.Parent := Result;
Control.BoundsRect := Source.Controls[I].BoundsRect;
end;
end;
end.
← →
DarkLord © (2006-03-10 14:29) [2]Спасибо! Оно. Но! Есть нехороший нюанс с LabeledEdit - неверный Caption и непонятно откуда берущееся содержимое.
И ещё вопросик: как лучше потом организовать доступ к контролам?
Если там будет десяток страниц, и по пару десятков разных контролов на странице...
Просто по Name+"номер страницы"? Или может в массивы как-то?
← →
Crash Coredump © (2006-03-10 15:49) [3]
> Есть нехороший нюанс с LabeledEdit - неверный Caption и
> непонятно откуда берущееся содержимое.
Ничем не могу помочь - нет у меня такого компонента.
> Если там будет десяток страниц, и по пару десятков разных
> контролов на странице...
Делай у каждого контрола уникальный осмысленный Name, обращайся к нему через FindComponent - Owner"ом у них у всех все равно форма будет.
А еще у компонентов есть свойство Tag, туда тоже можно какую-то идентификацию положить.
← →
DarkLord © (2006-03-10 19:44) [4]И последний вопрос: как менять caption у созданных контролов, ведь он protected?
Допустим у меня Edit c именем "PriceEdit1" и капшеном "Цена". Так вот при клонировании, новому Edit-у присваивается капшен "PriceEdit1", что есть не совсем гуд :(
← →
DarkLord © (2006-03-10 20:00) [5]Вопрос снят. Надо было указывать класс контрола :)
← →
TStas © (2006-03-10 20:57) [6]А нельзя создавать и через Assign? Известны же, что за контролы на пе5рвом табе?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c