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

Вниз

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

 
Иван   (2002-05-14 01:24) [0]

Я Делфи не давно знаю, вопрос следующий, как в Делфи копировать объект в другой. В C++ этот вопрос решается просто - есть конструктор копирования, в Delphi же объект реально - указатель на объект и пр явном присваивании a:=b; приравниваются указатели, а хотелось бы получить копию. Как это сделатьв Delphi?


 
Almaz   (2002-05-14 02:17) [1]

Для объектов - потомков TPersistent (практически все стандартные объекты и компоненты Delphi) это реализуется с помошью метода Assign. Например:

var
A, B: TCanvas;

A := TCanvas.Create;
...
B := TCanvas.Create;
B.Assign(A); // Копируем A в B.


Удачи.


 
Лёша   (2002-05-14 02:20) [2]

Assign, AssignTo.


 
Кулюкин Олег   (2002-05-14 08:32) [3]

Только для своих собственных классов, Assign придется самому ручками реализовывать.


 
cpp   (2002-05-14 09:13) [4]

Обычные объекты нельзя.
Можно
1. через Assign. Но только потомки TPersistent
2. Можно Через поток TStream. У него есть метод WriteComponent ReadComponent. Но только потомки TComponent. И копируются только published свойства.



 
Иван   (2002-05-14 15:17) [5]

Спасибо, не очень красиво, но что делать :-(,
а есть способ пройти по всем свойствам объекта, и прокопировать их в другой в цикле?


 
Бурундук   (2002-05-14 17:08) [6]

Например, так:
(разумеется, только для published св-в)

procedure CopyPublishedProperties(Src, Dest: TObject);
var i: Integer;
Cls: TClass;

PropCnt: Integer;
PropList: PPropList;
PropInfo: PPropInfo;

function IsField(PropProc: Pointer): Boolean;
type ba = array[0..3]of Byte;
begin
Result := ba(PropProc)[3] > $FE;
end;

begin
if not Dest.InheritsFrom(Src.ClassType) then
raise Exception.CreateFmt("Cannot copy properties from %s to %s", [Src.ClassName, Dest.ClassName]);

PropCnt := GetTypeData(Src.ClassInfo)^.PropCount;
GetMem(PropList, PropCnt*SizeOf(Pointer));

try
GetPropInfos(Src.ClassInfo, PropList);

for i := 0 to PropCnt-1 do
begin
PropInfo := PropList^[i];
if (PropInfo^.Name <> "Name") then
begin
if PropInfo^.PropType^^.Kind = tkMethod then
SetMethodProp(Dest, PropInfo,
GetMethodProp(Src, PropInfo))
else if PropInfo^.PropType^^.Kind = tkClass then
begin
{
Cls := GetTypeData(PropInfo^.PropType^).ClassType;
if (not Cls.InheritsFrom(TComponent)) and
(Cls.InheritsFrom(TPersistent)) and
IsField(PropInfo^.SetProc)
}
if PropInfo^.Name = "Constraints"
then
// По непонятной причине свойство
// property Constraints: TSizeConstraints read FConstraints write FConstraints;
// производит запись прямо в поле, а не через Set-метод + Assign
// Поэтому приходится делать обходной маневр.
//
// Не исключено, что имеются подобные глюки и с другими (более редкими) св-вами.

TPersistent(GetObjectProp(Dest, PropInfo)).Assign
(TPersistent(GetObjectProp(Src, PropInfo)))
else
begin
SetObjectProp(Dest, PropInfo,
GetObjectProp(Src, PropInfo));
end;
end
else
SetPropValue(Dest, PropInfo^.Name, GetPropValue(Src, PropInfo^.Name));
end;
end;
finally
FreeMem(PropList, PropCnt*SizeOf(Pointer));
end;

// if (Src is TControl) then
// TControl(Dest).Parent := TControl(Src).Parent;
end;

PS Я не уверен, что учёл все тонкости, но вроде работает.



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

Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-73230
PavelOKES
2002-04-26 09:14
2002.05.23
RXLib


14-73366
VictorT
2002-04-15 13:39
2002.05.23
Удалили мою ветку про переписочку.


1-73299
Dion
2002-05-11 21:03
2002.05.23
Помогите определить по таймеру настоящее время суток в программе


14-73375
VCL
2002-04-15 22:12
2002.05.23
Вот...


1-73249
nobody2002
2002-05-10 15:49
2002.05.23
Копирование файла на дискету





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