Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1122549507
Андрей Жук
2005-07-28 15:18
2005.08.28
Три вещи, без которых нельзя прожить (не моё)


1-1123264667
Doplhin1
2005-08-05 21:57
2005.08.28
emoticon


14-1123170240
Димитрий
2005-08-04 19:44
2005.08.28
Программист vs Инженер-программист


14-1123066040
Empleado
2005-08-03 14:47
2005.08.28
Дешевые авиакомпании


1-1123584552
Svintus
2005-08-09 14:49
2005.08.28
Как сохранить интернет страницу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский