![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копирование компонента программно [D7, XP]
Volfram © (2005-12-26 18:45:00)есть массив TComboBox-ов, хочу чтобы каждый его элемент был копией ComboBox1, но с другими координатами
for i:=1 to N do begin
CBArray[i]:=ComboBox1;
CBArray[i].Top:=...;
CBArray[i].Left:=...;
end;
Но на форме двигается сам ComboBox1. Т.е. как я понял, создается не копия, а ссылка на один тот же ComboBox. А как сделать именно 8 разных ComboBox но с одинаковыми свойствами (кроме координат)? Просьба сильно не пинать :)
Джо (2005-12-26 20:03:00) [1]
> Result := TComboBox.Create (nil);
Заменить на TComboBox.Create (AOwner), конечно.
Джо (2005-12-26 20:02:00) [2][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;
Вуаля :)
Vlad (2005-12-26 19:56:00) [3]
> Volfram (26.12.05 19:50) [5]
> все нужные свойства надо задавать на N строчках
Один раз в цикле присвоить нужные свойства.
Можешь использовать метод Assign, но как я понимаю, его придется реализовывать самому, что опять же ведет к построчному присваиванию всех необходимых свойств объекта.
Volfram (2005-12-26 19:50:00) [4]Гхм. Мне надо сделать массив ComboBox-ов, которые одинаковы во всем одиныковы, за исключением координат. Получается, что мне все нужные свойства надо задавать на N строчках? Я хотел создать некий ComboBox1, как эталон, и скопировать все его properties. Как понял, такое невозможно :(
Anatoly Podgoretsky (2005-12-26 19:47:00) [5]Попробуй Assign
Vlad (2005-12-26 19:41:00) [6]
> Volfram (26.12.05 19:37) [2]
мдя... вижу что понимания никакого :-)
CBArray[i]:=TComboBox.Create(MainForm); // создаем новый экземпляр комбобокса
CBArray[i]:=ComboBox1; // присваиваем указатель на какой-то левый комбобокс ( зачем???)
естественно после этого элемент массива будет содержать другой комбобокс, а не тот который ты создал сам.
Volfram (2005-12-26 19:37:00) [7]
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:00:00) [8]
> Volfram (26.12.05 18:45)
Для этого нужно как минимум создать каждый из комбобоксов (CBArray[i]:= TCombobox.Create(Form1)). Ну а затем установить нужные свойства.