Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Клонирование 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
15-1143006803
SergP.
2006-03-22 08:53
2006.04.16
Еще раз о сканировании портов. ИМХО кто-то чего-то темнит...


2-1143750669
serko
2006-03-31 00:31
2006.04.16
Второй экземпляр проги!


2-1143471867
Setor
2006-03-27 19:04
2006.04.16
Как записать данные в начало файла


15-1143217541
Ученик чародея
2006-03-24 19:25
2006.04.16
Принтсервер Surecom EP-903X-U печать из DOS-а.


15-1142731950
Лорд Байрон
2006-03-19 04:32
2006.04.16
Проблемы с виндой