Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: 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 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
14-1123492515
WonderfulDay
2005-08-08 13:15
2005.08.28
Зажимание шифта


14-1123088662
Serg1981
2005-08-03 21:04
2005.08.28
Индексирование базы данных


9-1115181086
Slavikk
2005-05-04 08:31
2005.08.28
ошибка tglbdcebody


1-1123164593
Русланка
2005-08-04 18:09
2005.08.28
А как в DBComboBox программно установить какую либо строку


4-1120559821
Baltazor
2005-07-05 14:37
2005.08.28
Внешний вид