Форум: "Основная";
Текущий архив: 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.04 c