Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.036 c
1-1093517944
aleks-ran
2004-08-26 14:59
2004.09.12
Возврат значения (ий) в вызывающую форму


4-1091031843
Slaga
2004-07-28 20:24
2004.09.12
Работа с WinAPI


14-1093409682
Kerk
2004-08-25 08:54
2004.09.12
ПОДДЕРЖИ НЕМОВА! ПОШЛИ ПРОТЕСТ МОК!


6-1089282243
banderas
2004-07-08 14:24
2004.09.12
TcpServer TcpClient Работают в блокирующем режиме ?


1-1093537096
mouse_web
2004-08-26 20:18
2004.09.12
Разбивка String





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский