Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Внизскопировать объекты-классы Найти похожие ветки
← →
a80h19 © (2005-08-08 13:22) [0]Есть список TObjectList с массивом объектов класса К1, необходимо перекопировать элементы в другой список с преобразованием типа в класс К2 и первый список освободить. Как ожно сделать такое волшебство?
Типа:for i:=0 to High(DA) do
List2.Add( К2(List1.Items[i]) );
List1. Free;
← →
Slym © (2005-08-08 13:34) [1]var Tmp:TObject;
begin
Tmp:=List2;
List2:=list1;
list1:=Tmp;
end;
← →
Ega23 © (2005-08-08 13:41) [2]2 Slym © (08.08.05 13:34) [1]
Ну и чего ты написал?
← →
evvcom © (2005-08-08 13:46) [3]
> объектов класса К1, ... с преобразованием типа в класс К2
И как ты себе это представляешь? Есть объект типа "Дом", а ты его хочешь преобразовать в "Сортир"?
← →
a80h19 © (2005-08-08 13:46) [4]Да, это не то. Мне преобразование типов нужно сделать, а не указателями обменяться.
← →
a80h19 © (2005-08-08 13:47) [5]evvcom
Класс К2 наследник К1
← →
Ega23 © (2005-08-08 13:58) [6]2 a80h19 © (08.08.05 13:47) [5]
Класс К2 наследник К1
А в начальном списке экземпляры какого класса хранятся? К2 или К1? Если К2, то преобразование возможно, если К1 - нельзя.
← →
evvcom © (2005-08-08 14:03) [7]
> Класс К2 наследник К1
Давай перед типами я все же буду ставить "Т".
Если был создан объект класса TK1, то его корректное "преобразование к TK2" возможно только одним способом: создать объект класса TК2 и выполнить К2.Assign(K1). Преобразование же вида TK2(K1) с обращением к полям TK2, которых не существует в TK1, в лучшем случае выдаст ошибку времени выполнения.
← →
a80h19 © (2005-08-08 14:14) [8]Assign похоже я и искал
Спасибо
← →
Антоныч © (2005-08-08 14:35) [9]А можно поподробнее, как с 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.
← →
Anatoly Podgoretsky © (2005-08-08 14:44) [10]Антоныч © (08.08.05 14:35) [9]
Ну видимо так, компилятор не ошибается в таких случаях.
← →
Юрий Зотов © (2005-08-08 14:48) [11]> Антоныч © (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.
← →
Slym © (2005-08-08 14:52) [12]Удалено модератором
Примечание: Все хорошо, кроме одного слова. Сорри, но закон есть закон.
← →
Юрий Зотов © (2005-08-08 14:57) [13]Маленькая поправка к [11]:
procedure TProv.AssignTo(Dest: TPersistent);
begin
if Dest is TProv then
TProv(Dest).FField := FField
else
inherited
end;
← →
Fay © (2005-08-08 14:58) [14]Удалено модератором
Примечание: Обсуждение политики модерирования.
← →
Anatoly Podgoretsky © (2005-08-08 15:00) [15]Удалено модератором
Примечание: Обсуждение политики модерирования.
← →
Антоныч © (2005-08-08 15:12) [16]Теперь понятно, спасибо :). Просто возникла необходимость создать 2 экземпляра одного класса (например, Pr и Pr1 для TProv), работать с экземпляром класса Pr, а затем в определенный момент присвоить экземпляру Pr1 все значения полей из Pr и продолжать работать с Pr1, причем изменение значения Pr1.FField не должно затрагивать Pr.FField (короче, в памяти Pr.FField и Pr1.FField должны располагаться в разных местах :) ). Явно записывать Pr1.FField:=Pr.FField невозможно, т.к. полей очень много. Можно ли как-нибудь организовать такое "копирование" малой кровью, даже без помощи Assign?
← →
Slym © (2005-08-08 15:21) [17]Удалено модератором
Примечание: Есть сильное желание нарваться на RO?
← →
evvcom © (2005-08-08 16:27) [18]Удалено модератором
Примечание: Обсуждение политики модерирования.
← →
Slym © (2005-08-08 16:32) [19]Удалено модератором
Примечание: Обсуждение политики модерирования.
← →
Mx © (2005-08-08 18:18) [20]Удалено модератором
Примечание: Обсуждение политики модерирования.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c