Текущий архив: 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