![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование объектов. [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]в общем случае явно копировать поля.