Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Копирование объекта


Автор: Delphist 8.5.2007, 13:16
Как сделать копию с произвольного объекта, т.е. чтобы в новом объекта сохранились значения сво-в, переменных и т.п. копируемого объекта.

Автор: Sunvas 8.5.2007, 15:59
Delphist, 
Цитата(Delphist @  8.5.2007,  13:16 Найти цитируемый пост)
сохранились значения сво-в, переменных и т.п.

Если объект объявлен как класс (например форма) то можно - просто объявить переменную типа имени класса.

Автор: Snowy 8.5.2007, 16:39
Assign ?

Автор: Alexeis 8.5.2007, 16:40
теоретически так
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  b1, b2 : TBitmap;
begin
   b1 := TBitmap.Create;
   b1.Width  := 17;
   b1.Height := 37;

   GetMem(Pointer(b2), TBitmap.InstanceSize);
   Move(Pointer(b1)^,
        Pointer(b2)^, TBitmap.InstanceSize);

   b1.Free;

   ShowMessage(IntToStr(b2.Width)+ ' ' +
               IntToStr(b2.Height));
   b2.Free;
end;


Но за последствия не отвечаю  smile Если объект b1 будет содержать картинку, то после его удаления b2 тоже ее потеряет. Короче если в конструкторе объекта создаются другие объекты, а объект в работе расчитывает что они уже созданы, то может произойти крах, после удаления объекта с которого делали копию, ведь все внутренние объекты у них общие.

Добавлено через 8 минут и 54 секунды
Упс. при удалении исходного, потеряются и строки и динамические массивы тоже. Ведь это все указатели.
  А все изменения будут сказываться на обоих smile Даже переименование одного из них приведет к краху. Потому что прежний указатель на имя объекта станет невалидным, но 2й объект об этом знать не будет. Для маленьких и простеньких объектов сойдет, но для больших просто труба.

Автор: Bose 8.5.2007, 16:50
Assign. Только если это твой собственный класс, то он должен наследоваться от Tpersistent, и иметь собственную реализацию метода Assign. smile 

Автор: MetalFan 8.5.2007, 17:48
Bose, а еще лучше метода AssignTo... хотя те же яйца, только одни другие вызывают

Автор: lukas 8.5.2007, 19:37
А можно пример использования, у меня выскакивает вот такая ошибка..

Как использовать assign... 


Код

procedure TForm1.Button1Click(Sender: TObject);
 var
 bt:tbutton;
begin
bt:=TButton.Create(self);
bt.parent:=self;
button1.Assign(bt);
end;


Как ?  smile 

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EConvertError with message 'Cannot assign a TButton to a TButton'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

Автор: Alex 8.5.2007, 22:09
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=450550

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)