![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
скопировать объекты-классы [D7, Win2k, WinXP]
a80h19 © (2005-08-08 13:22:00)Есть список TObjectList с массивом объектов класса К1, необходимо перекопировать элементы в другой список с преобразованием типа в класс К2 и первый список освободить. Как ожно сделать такое волшебство?
Типа:
for i:=0 to High(DA) do
List2.Add( К2(List1.Items[i]) );
List1. Free;
Mx (2005-08-08 18:18:00) [1]Удалено модератором
Примечание: Обсуждение политики модерирования.
Slym (2005-08-08 16:32:00) [2]Удалено модератором
Примечание: Обсуждение политики модерирования.
evvcom (2005-08-08 16:27:00) [3]Удалено модератором
Примечание: Обсуждение политики модерирования.
Slym (2005-08-08 15:21:00) [4]Удалено модератором
Примечание: Есть сильное желание нарваться на RO?
Антоныч (2005-08-08 15:12:00) [5]Теперь понятно, спасибо :). Просто возникла необходимость создать 2 экземпляра одного класса (например, Pr и Pr1 для TProv), работать с экземпляром класса Pr, а затем в определенный момент присвоить экземпляру Pr1 все значения полей из Pr и продолжать работать с Pr1, причем изменение значения Pr1.FField не должно затрагивать Pr.FField (короче, в памяти Pr.FField и Pr1.FField должны располагаться в разных местах :) ). Явно записывать Pr1.FField:=Pr.FField невозможно, т.к. полей очень много. Можно ли как-нибудь организовать такое "копирование" малой кровью, даже без помощи Assign?
Anatoly Podgoretsky (2005-08-08 15:00:00) [6]Удалено модератором
Примечание: Обсуждение политики модерирования.
Fay (2005-08-08 14:58:00) [7]Удалено модератором
Примечание: Обсуждение политики модерирования.
Юрий Зотов (2005-08-08 14:57:00) [8]Маленькая поправка к [11]:
procedure TProv.AssignTo(Dest: TPersistent);
begin
if Dest is TProv then
TProv(Dest).FField := FField
else
inherited
end;
Slym (2005-08-08 14:52:00) [9]Удалено модератором
Примечание: Все хорошо, кроме одного слова. Сорри, но закон есть закон.
Юрий Зотов (2005-08-08 14:48:00) [10]> Антоныч © (08.08.05 14:35) [9]
type
TProv = class( TPersistent)
private
FField: string;
protected
procedure AssignTo(Dest: TPersistent); override;
public
...
end;
procedure TProv.AssignTo(Dest: TPersistent);
begin
if Dest is TProv then
Dest.FField := FField
else
inherited
end;
После этого можно будет вызывать Assign.
Anatoly Podgoretsky (2005-08-08 14:44:00) [11]Антоныч © (08.08.05 14:35) [9]
Ну видимо так, компилятор не ошибается в таких случаях.
Антоныч (2005-08-08 14:35:00) [12]А можно поподробнее, как с Assign работать? А то сделал пример, и не получается:
TProv=class(TObject)
FField: string;
constructor create;
destructor destroy; override;
end;
.........
var
Pr, Pr1: TProv;
begin
Pr:=TProv.create;
Pr1:=TProv.create;
Pr.FField:='qwe';
Pr1.Assign(Pr);
На этом месте пишет ошибку 'undeclared identifier' Assign.
a80h19 (2005-08-08 14:14:00) [13]Assign похоже я и искал
Спасибо
evvcom (2005-08-08 14:03:00) [14]
> Класс К2 наследник К1
Давай перед типами я все же буду ставить "Т".
Если был создан объект класса TK1, то его корректное "преобразование к TK2" возможно только одним способом: создать объект класса TК2 и выполнить К2.Assign(K1). Преобразование же вида TK2(K1) с обращением к полям TK2, которых не существует в TK1, в лучшем случае выдаст ошибку времени выполнения.
Ega23 (2005-08-08 13:58:00) [15]2 a80h19 © (08.08.05 13:47) [5]
Класс К2 наследник К1
А в начальном списке экземпляры какого класса хранятся? К2 или К1? Если К2, то преобразование возможно, если К1 - нельзя.
a80h19 (2005-08-08 13:47:00) [16]evvcom
Класс К2 наследник К1
a80h19 (2005-08-08 13:46:00) [17]Да, это не то. Мне преобразование типов нужно сделать, а не указателями обменяться.
evvcom (2005-08-08 13:46:00) [18]
> объектов класса К1, ... с преобразованием типа в класс К2
И как ты себе это представляешь? Есть объект типа "Дом", а ты его хочешь преобразовать в "Сортир"?
Ega23 (2005-08-08 13:41:00) [19]2 Slym © (08.08.05 13:34) [1]
Ну и чего ты написал?
Slym (2005-08-08 13:34:00) [20]var Tmp:TObject;
begin
Tmp:=List2;
List2:=list1;
list1:=Tmp;
end;