Вниз
Скачать: 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.025 c
14-1122027658
Piter
2005-07-22 14:20
2005.08.28
Чарльз Петцольд "Программирование для MS Windows на С#"


14-1122538875
sapsi
2005-07-28 12:21
2005.08.28
Продвижение программного продукта


4-1121073249
Вт
2005-07-11 13:14
2005.08.28
Настройка экрана


14-1122964668
dmitry99
2005-08-02 10:37
2005.08.28
День Десантника.


14-1122973644
12DFBDDh
2005-08-02 13:07
2005.08.28
Политкорректные сказки




   Наверх