![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быстро скопировать record ? [D7]
Рекорд © (2007-01-08 07:14:00)
TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
Хочется скопировать её через CopyMemory. Но мешает Name.
Нельзя ли как нибудь скопировать через CopyMemory без нэйма? А потом скопировать name через присваивание?
Потому, что просто лень писать
r2.par1 := r1.par1;
r2.par2 := r1.par2;
...
r2.par100 := r1.par100;
oxffff (2007-01-09 14:06:00) [1]
> alex_*** © (09.01.07 13:42) [36]
> кастомер.
> obj := TMyObj.Create(old_obj);
А не замучаешься писать для каждой версии записи свой "клонирователь"?
Можно написать свою реализацию _CopyRecord,
в которой сделать допущение что либо базовый класс имеет
либо виртуальную функцию Clone:TBaseObject,
либо виртуальный твой конструктор копий CopyConstructor(const obj)
либо интерфейс клонирования объекта ICLONABLE
alex_*** (2007-01-09 13:42:00) [2]кастомер.
obj := TMyObj.Create(old_obj);
oxffff (2007-01-09 13:27:00) [3]
> Почему это? в дельфях разве нельзя написать конструктор
> для копии?
> TMyObj.Create(const src: TMyObj);
А кто его вызывать будет?
_CopyRecord?
alex_*** (2007-01-09 13:14:00) [4]
> короче свой string написать, понятное дело :)
Это еще зачем?
> Это уже С++.
Почему это? в дельфях разве нельзя написать конструктор для копии?
TMyObj.Create(const src: TMyObj);
не майтесь дурью, в общем.
oxffff (2007-01-09 13:02:00) [5]:)
Пробывал читать как пробовал.
evvcom (2007-01-09 12:59:00) [6]> [28] alex_*** © (09.01.07 11:57)
> array[0..256 (и более)] of char :)
короче свой string написать, понятное дело :)
oxffff (2007-01-09 12:57:00) [7]
> В новых версиях Делфи можно для рекордов операторы перегрузить
> :)
Хотя, к теме это мало относится.
Нет перегрузки :=
Пробывал "обойти" вот так
Implicit(a:Type1):Type1 или Explicit(a:Type1):Type1
не срабывает при
SomeVar1OfType1:=SomeVar2OfType1;
Джо (2007-01-09 12:35:00) [8]В новых версиях Делфи можно для рекордов операторы перегрузить :) Хотя, к теме это мало относится.
oxffff (2007-01-09 12:33:00) [9]
> надо класс тогда писать с полем типа string и делать конструктор
> копии
Это уже С++.
alex_*** (2007-01-09 11:57:00) [10]
> А как в него 257 и более символов запхнуть?
array[0..256 (и более)] of char :)
надо класс тогда писать с полем типа string и делать конструктор копии
evvcom (2007-01-09 10:47:00) [11]> [26] alex_*** © (09.01.07 10:41)
А как в него 257 и более символов запхнуть?
alex_*** (2007-01-09 10:41:00) [12]Не проще string заменить на array[0..255] of char ?
oxffff (2007-01-09 10:18:00) [13]Блин, влез в такую то замануху.
Читать [23],[21] как изменение семантики копирования объектов в _CopyRecord
Джо (2007-01-09 10:02:00) [14]> [22] icWasya © (09.01.07 09:51)
> а просто
>
> r2:=r1;
>
> не прокатит?
Вася, не порть концептуальность спора! :0)
oxffff (2007-01-09 09:59:00) [15]F r\\\
> icWasya © (09.01.07 09:51) [22]
> а просто
>
> r2:=r1;
>
> не прокатит?
А что _CopyRecord скопирует(клонирует) объект?
icWasya (2007-01-09 09:51:00) [16]а просто
r2:=r1;
не прокатит?
oxffff (2007-01-09 09:48:00) [17]
>ors_archangel © (08.01.07 07:37) [4]
> p.p.s. В общем случае твой вопрос не имеет решения в рамках
> Паскаля.
А вы не торопитесь c выводами?
Вопрос IMHO имеет решение, посмотрите на _FinalizeRecord, _FinalizeArray.
Что касаемо копирования объекта, то можно реализовать интерфейсы для
копирования например
ICLONABLE=interface
function CopyObj(DeepCopy:Boolean=TRUE):Tobject;
end;
Конечно это .NET, но сделать можно. IMHO.
Palladin (2007-01-09 06:14:00) [18]
> Рекорд (09.01.07 05:13) [18]
нет, ну ты наглец :) хоть где нибудь бы эта информация от тебя проскользнула...
TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
такая конструция не скомпилируется, знаток, ты наш, паскаля... а то что ты вызываешь получение размера указателя... ну что ж... головой думать нужно, как я тебе уже не раз сказал... реального определения типа и реальных функций работы с ними ты привести не сблагволил...
вот, может быть, твое, то что подсказывает мне телепатор
TMyRec = record
Name : string;
par1, par2 ... par100 : Integer;
end;
Теперь запусти
Type
TMyRec = record
Name : string;
pars:array [1..100] of : Integer;
end;
ShowMessage(IntToStr(SizeOf(TMyRec)));
и нечего морочить голову отвечающим...
хочешь по указателю? без проблемм
type
PMyRec=^TMyRec;
TMyRec = record
Name : string;
par1,par2...parNNN:Integer;
end;
Procedure CopyRec(Rec1:PMyRec;Var Rec2:PMyRec);
Begin
New(Rec2);
Rec2.Name:=Rec1.Name;
Move(Rec1.par1,Rec2.par1,SizeOf(TMyRec)-4);
End;
знаток паскаля, блин... еще кому то что то советует...
сто пудово, сейчас новые подробности вылезут...
Джо (2007-01-09 05:35:00) [19]> [16] Рекорд (09.01.07 04:29)
В этой ветке есть всего один TMyRec, его определение дал ты же сам в первом посте:
TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
Поэтому не нужно выдумывать тут «какие-то другие» TMyRec и на основании личных выдумок кому-то что-то здесь рассказывать и строить предположения.
Рекорд (2007-01-09 05:13:00) [20]
> Palladin © (09.01.07 04:33) [17]
>
> без запуска все уже понятно
> TMyRec у тебя указатель
Поздравляю, что наконец то допёр.
> изучай паскаль и не выпендривайся
Вот ты и не выпендривайся, а запускай и проверяй, пока слишком слаб в Паскале.