Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Клонирование 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо