Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2010, 00:56   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Вопрос Клонирование компонента

Лежит на форме визуальный компонент (например Button1), настроенный как мне нужно. Есть массив Buttons: array [1..20] of TButton. Как заполнить этот массив копиями компонента Button1 не потеряв его настроек? Все элементы массива должны быть идентичны Button1.
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 30.10.2010, 09:02   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Идентичными не получаться. Например, свойства Left или Top у всех кнопок должны быть разными, иначе они закроют друг друга и на форме будет видна одна кнопка.
Отсюда вывод, точных копий быть не может.
Вопрос необходимо скорректировать, чтобы понятна была цель.
Прик вне форума Ответить с цитированием
Старый 30.10.2010, 10:14   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

var mas:array[1..10] of TButton;

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  for i := 1 to 10 do
  begin
    Mas[i] := TButton.Create(Form1);
    Mas[i].Parent := Form1;
    Mas[i].Top := 100 + i * 20;
    Mas[i].Left := 100;
    Mas[i].Caption := 'Кнопка ' + IntToStr(i);
    Mas[i].Tag := i;
    Mas[i].Name := Mas[i].ClassName + inttostr(i);
    (Mas[i]).OnClick := MyClick; //процедура по щелчку. Нужно задекларировать.
  end;
end;

procedure TForm1.MyClick(Sender: TObject);
begin
  ShowMessage('Нажали на кнопку № ' + inttostr((Sender as TButton).Tag));
end;
Как видишь, свойству Tag происвоен порядковый номер. Я всегда так делаю, чтобы в процедуре MyClick разделить события кнопок, т.к. по имени к ним обращаться нельзя:
Код:
case (Sender as TButton).Tag of
  begin
  1:{.......}
  2:{.......}
{.......}
end;
Понятно написал?
Юзай поиск "Динамическое создание компонент"

Последний раз редактировалось _SERGEYX_; 30.10.2010 в 10:18.
_SERGEYX_ вне форума Ответить с цитированием
Старый 30.10.2010, 10:21   #4
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

С массивом не прокатит, попробуйте вот так
Код:
var
  Form1: TForm1;
   kom:Tbutton;   //Button от класса Tbutton
   komponent_list:Tlist; //Список
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
kom:=Tbutton.Create(self); // Указываем где создаётся
kom.parent:=form1; //Указываем родителя тоесть на чё он будет
kom.Caption:='2';  //Отсюда можно прыгать со свойствами
tag:=tag+1;        //Нужно для того что-бы имя у них не повторялось
kom.Name:='button_'+inttostr(tag);  //Указываем новое имя
komponent_list.add(kom);            //А это массив тока чучуть в другом плане
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
komponent_list:=Tlist.Create; //Создаём список
end;
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 30.10.2010, 10:34   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
С массивом не прокатит
Ну, почему? Еще как работает
_SERGEYX_ вне форума Ответить с цитированием
Старый 30.10.2010, 11:20   #6
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Ну, почему?
Не знаю пробовал с фреймом не получается
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 30.10.2010, 15:32   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не знаю пробовал с фреймом не получается
Ты просто не разобрался
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.10.2010, 17:57   #9
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Спасибо _SERGEYX_! Мне помог ваш код. Сначала пытался клонировать, но простое создание объекта и задание нужных свойств программно оказалось лучше.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  for i := 1 to 10 do
  begin
    Mas[i] := TButton.Create(Form1);
    Mas[i].Parent := Form1;
    Mas[i].Top := 100 + i * 20;
    Mas[i].Left := 100;
    Mas[i].Caption := 'Кнопка ' + IntToStr(i);
    Mas[i].Tag := i;
    Mas[i].Name := Mas[i].ClassName + inttostr(i);
    (Mas[i]).OnClick := MyClick; //процедура по щелчку. Нужно задекларировать.
  end;
end;

procedure TForm1.MyClick(Sender: TObject);
begin
  ShowMessage('Нажали на кнопку № ' + inttostr((Sender as TButton).Tag));
end;
Теперь проблема с очисткой массива и уничтожением созданных компонентов...
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клонирование Windows XP DJ HITMAN Windows 6 20.08.2010 13:35
Динамическое создание компонента из компонента)) Impuls1989 Компоненты Delphi 8 22.10.2009 00:08
2 компонента Serious Компоненты Delphi 3 05.09.2009 15:31
Клонирование ветки дерева (дерево Adjacency List) ISSET PHP 0 28.05.2009 16:02