![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Клонирование TabSheet со всем содержимым [D7, WinXP]
DarkLord © (2006-03-10 13:16:00)Имеется PageControl с одним TabSheet, на который, в design-time, помещены ComboBox-ы, LabeledEdit-ы и пр.
Необходимо, по нажатию кнопки, создать клон TabSheet-а со всем содержимым (контролами). Содержимое контролов можно не клонировать. Оно будет выполняться при иных условиях.
Главное условие - нормальный и лёгкий доступ в дальнейшем, к созданным TabSheet-ам и их контролам.
Доступ будет в виде процедуры, которой передается номер страницы, а она уже сама должна оперировать с контролами на этой странице.
Доп. условие - кол-во страниц переменное.
Пробовал работать через массивы компонентов, но возникают странности. Например, массив ComboBox-ов ведёт себя иначе, нежели такой же массив CheckBox-ов. Т.е. CheckBox-ы загоняются в массив, а при загоне ComboBox-ов, массив содержит nil. :(
Подозреваю, что это я лажанулся в коде, но может где-то есть что-то типа шаблона-заготовки, либо некоего компонента, дабы не изобретать веловипед.
TStas (2006-03-10 20:57:00) [1]А нельзя создавать и через Assign? Известны же, что за контролы на пе5рвом табе?
DarkLord (2006-03-10 20:00:00) [2]Вопрос снят. Надо было указывать класс контрола :)
DarkLord (2006-03-10 19:44:00) [3]И последний вопрос: как менять caption у созданных контролов, ведь он protected?
Допустим у меня Edit c именем 'PriceEdit1' и капшеном 'Цена'. Так вот при клонировании, новому Edit-у присваивается капшен 'PriceEdit1', что есть не совсем гуд :(
Crash Coredump (2006-03-10 15:49:00) [4]
> Есть нехороший нюанс с LabeledEdit - неверный Caption и
> непонятно откуда берущееся содержимое.
Ничем не могу помочь - нет у меня такого компонента.
> Если там будет десяток страниц, и по пару десятков разных
> контролов на странице...
Делай у каждого контрола уникальный осмысленный Name, обращайся к нему через FindComponent - Owner'ом у них у всех все равно форма будет.
А еще у компонентов есть свойство Tag, туда тоже можно какую-то идентификацию положить.
DarkLord (2006-03-10 14:29:00) [5]Спасибо! Оно. Но! Есть нехороший нюанс с LabeledEdit - неверный Caption и непонятно откуда берущееся содержимое.
И ещё вопросик: как лучше потом организовать доступ к контролам?
Если там будет десяток страниц, и по пару десятков разных контролов на странице...
Просто по Name+'номер страницы'? Или может в массивы как-то?
Crash Coredump (2006-03-10 13:55:00) [6]
> Необходимо, по нажатию кнопки, создать клон 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.