Вниз
Скачать: CL | DM;

скопировать объекты-классы   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.024 c
4-1120725661
AxelBlack
2005-07-07 12:41
2005.08.28
NetServerEnum


4-1120571972
cosinus
2005-07-05 17:59
2005.08.28
Как в глобальном хуке определить кому адресовано отловленное msg?


11-1106057807
Slay
2005-01-18 17:16
2005.08.28
Thread.OnDestroy


4-1121162964
Nikon
2005-07-12 14:09
2005.08.28
работа с клавиатурой


1-1123441747
Tab
2005-08-07 23:09
2005.08.28
Прозрачность SpeedButton при включенных стилях XP.




   Наверх