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

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

Копирование объектов. [D7, WinXP]


Kniff ©   (2004-08-24 15:34:00) 

Приветствую мастеров. Не могли бы подсказать новичку одну вещь.
Есть два объекта одного класса, при присвоении одного, другому происходит, как я понял, просто копирование указателя и конда первый объект разрушается, то по указателю второго остаётся не пойми что. Пример:

 TTest = class
 public
   sTest: string[12];
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Test1, Test2: TTest;
begin
 Test1:= TTest.Create;
 Test1.sTest:= 'testing';
 Test2:= TTest.Create;
 Test2:= Test1;
 Test1.Free;
 Test1:= nil;
 ShowMessage(Test2.sTest);// - тут ошибка
 Test2.Free;
end;

А как именно скопировать содержание одного объекта в другой?
Спасиба.


KSergey   (2004-08-24 16:34:00) [1]

> [10] Kniff   (24.08.04 15:58)
> А как это делается? Пример
> где посмотреть можно?

В иходниках VCL примеров - куча. (Почти) любой наследник упомянутого TPersistent.
Хотя в общем случае наследование от TPersistent (как мне видится) не обязательно. Просто там еще свои прелести накручены, но если они не нужны - то, думаю, нет и смысла от TPersistent наследоваться.


Kniff   (2004-08-24 16:17:00) [2]

> Семен Сорокин:

ага, на Test2. Уже сам увидел. Спасибо.


Семен Сорокин   (2004-08-24 16:12:00) [3]

2Kniff  
off:
Test2:= TTest.Create;
Test2:= Test1;

тут еще теряется ссылка на объект


Суслик   (2004-08-24 16:08:00) [4]


>  то можно CopyMemory в общем случае делать?

можно


Kniff   (2004-08-24 16:05:00) [5]

> Digitman

да это я просто выразился не корректно. Что не имеет смысла копировать указатели на данные это я слава богу понимаю. Но если нет динамически распределяемых данных, то можно CopyMemory в общем случае делать?


Digitman   (2004-08-24 15:59:00) [6]


> Kniff


ну же сам сказал :


> некоторые данные динамически распределяемые (ну всякие динамические
> массивы и т.д.)


такого рода данные представлены указателями, каков смысл копировать указатель в составе структуры ? ... нужно-то не указатель копировать, а те реальные данные, которые представлены упр.структурой, которую адресует этот указатель


Kniff   (2004-08-24 15:58:00) [7]

MBo ©   (24.08.04 15:36) [3] - А как это делается? Пример где посмотреть можно? Что - получать объект и проверять наличие у него полей и если есть - переписывать их?


Kniff   (2004-08-24 15:56:00) [8]

да это и ежу понятно


Суслик   (2004-08-24 15:53:00) [9]

все зависит от того, что попадет в область, которую ты собираешься копировать через copymemory.

если дин. массивы, строки и некоторые другие типы то будет лажа...


Kniff   (2004-08-24 15:48:00) [10]

А что если CopyMemory делать? Ну если точно знаешь, что размеры одинаковы? Ведь если присваиваешь друг-другу переменные типа структура, то они ведь копируют данные, а не указатели присваивают.


Skier   (2004-08-24 15:47:00) [11]

>Kniff   (24.08.04 15:40) [4]
Возможности переопределения операций в Object Pascal'e нет.
"Используй то что под рукою и не ищи себе другое" :)


Суслик   (2004-08-24 15:47:00) [12]


> Kniff   (24.08.04 15:40) [4]

нельзя т.к. нельзя.
язык такой...


Kniff   (2004-08-24 15:40:00) [13]

Да вы что, братцы, а если у меня 100 полей в классе и некоторые данные динамически распределяемые (ну всякие динамические массивы и т.д.)? А почему просто нельзя копировать соотв. поля автоматически (ну хотя бы те, что статические, не требующие run time распределения памяти)?


Ega23   (2004-08-24 15:36:00) [14]

У некоторых классов есть Assign, но далеко не у всех. Скорее всего, самому тебе метод писать придётся.


MBo   (2004-08-24 15:36:00) [15]

Наследоваться от TPersistent и реализовать методы Assign(To), где выполнить [1]


Суслик   (2004-08-24 15:35:00) [16]

в общем случае явно копировать поля.


Наверх

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