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

Вниз

копирование компонента программно   Найти похожие ветки 

 
Volfram   (2005-12-26 18:45) [0]

есть массив TComboBox-ов, хочу чтобы каждый его элемент был копией ComboBox1, но с другими координатами


 for i:=1 to N do begin
   CBArray[i]:=ComboBox1;
   CBArray[i].Top:=...;
   CBArray[i].Left:=...;
 end;


Но на форме двигается сам ComboBox1. Т.е. как я понял, создается не копия, а ссылка на один тот же ComboBox. А как сделать именно 8 разных ComboBox но с одинаковыми свойствами (кроме координат)? Просьба сильно не пинать :)


 
Vlad ©   (2005-12-26 19:00) [1]


> Volfram   (26.12.05 18:45)  

Для этого нужно как минимум создать каждый из комбобоксов (CBArray[i]:= TCombobox.Create(Form1)). Ну а затем установить нужные свойства.


 
Volfram   (2005-12-26 19:37) [2]


for i:=1 to N do begin
  CBArray[i]:=TComboBox.Create(MainForm);
  CBArray[i]:=ComboBox1;
  CBArray[i].Top:=...;
  CBArray[i].Left:=...;
end;


работает точно так же :(


 
Vlad ©   (2005-12-26 19:41) [3]


> Volfram   (26.12.05 19:37) [2]

мдя... вижу что понимания никакого :-)

 CBArray[i]:=TComboBox.Create(MainForm); // создаем новый экземпляр комбобокса
 CBArray[i]:=ComboBox1; // присваиваем указатель на какой-то левый комбобокс (зачем???)
естественно после этого элемент массива будет содержать другой комбобокс, а не тот который ты создал сам.


 
Anatoly Podgoretsky ©   (2005-12-26 19:47) [4]

Попробуй Assign


 
Volfram   (2005-12-26 19:50) [5]

Гхм. Мне надо сделать массив ComboBox-ов, которые одинаковы во всем одиныковы, за исключением координат. Получается, что мне все нужные свойства надо задавать на N строчках? Я хотел создать некий ComboBox1, как эталон, и скопировать все его properties. Как понял, такое невозможно :(


 
Vlad ©   (2005-12-26 19:56) [6]


> Volfram   (26.12.05 19:50) [5]


> все нужные свойства надо задавать на N строчках

Один раз в цикле присвоить нужные свойства.

Можешь использовать метод Assign, но как я понимаю, его придется реализовывать самому, что опять же ведет к построчному присваиванию всех необходимых свойств объекта.


 
Джо ©   (2005-12-26 20:02) [7]

[5] Volfram   (26.12.05 19:50)
> Как понял, такое невозможно :(

Отчего невозможно? Очень даже возможно.

function MakeNewComboBasedOn (Combo: TComboBox;
 AOwner: TComponent): TComboBox;
var
 Stream: TMemoryStream;
begin
 Stream := TMemoryStream.Create;
 try
   Stream.WriteComponent(Combo);
   Stream.Position := 0;

   Result := TComboBox.Create (nil);
   Result.Parent := Combo.Parent;
   Stream.ReadComponent(Result);
 finally
   Stream.Free;
 end;
end;

Пользуем так. Пусть на форме лежит некий эталонный «комбо-бокс», назовем его cbEtalon. Кладем на форму кнопку, в обработчике вызываем приводимую функцию:

procedure TForm16.Button1Click(Sender: TObject);
var
 NewCombo: TComboBox;
begin
 NewCombo := MakeNewComboBasedOn(cbEtalon, Self);
 NewCombo.Left := 10;
 NewCombo.Top := 10;
end;

Вуаля :)


 
Джо ©   (2005-12-26 20:03) [8]


> Result := TComboBox.Create (nil);

Заменить на TComboBox.Create (AOwner), конечно.



Страницы: 1 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
14-1134830371
Nic
2005-12-17 17:39
2006.01.15
Воскрешаю старый проект :)


2-1135298975
Majesto
2005-12-23 03:49
2006.01.15
Компонент DBGrid


14-1134731483
Id
2005-12-16 14:11
2006.01.15
Не чем заняться


5-1121024936
cranium
2005-07-10 23:48
2006.01.15
Компонет наследник TGraphicControl как узнать цвет родителя


1-1134133314
webber
2005-12-09 16:01
2006.01.15
NMFTP - проблемы с передачей данных