Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Копирование объектов.   Найти похожие ветки 

 
Kniff   (2004-08-24 15:34) [0]

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

 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;

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


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

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


 
Ega23 ©   (2004-08-24 15:36) [2]

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


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

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


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

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


 
Skier ©   (2004-08-24 15:47) [5]

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


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


> Kniff   (24.08.04 15:40) [4]

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


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

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


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

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

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


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

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


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

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


 
Digitman ©   (2004-08-24 15:59) [11]


> Kniff


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


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


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


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

> Digitman

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


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


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

можно


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

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

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


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

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

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


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

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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.021 c
4-1091016954
Катя
2004-07-28 16:15
2004.09.12
Снять с файла атрибут


10-1036587142
49
2002-11-06 15:52
2004.09.12
клиент не может найти orbpas50.dll


3-1092375802
REP
2004-08-13 09:43
2004.09.12
Не удается записать в TBlobField произвольный файл


1-1093501571
Mitrofan
2004-08-26 10:26
2004.09.12
Одна форма для нескольких пользователей


4-1091154478
Zer0
2004-07-30 06:27
2004.09.12
Работа с палитрой в консольном приложении