Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

скопировать объекты-классы [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо