Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро скопировать record ? [D7]


Страницы:   1 2

Рекорд ©   (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 у тебя указатель

Поздравляю, что наконец то допёр.


> изучай паскаль и не выпендривайся

Вот ты и не выпендривайся, а запускай и проверяй, пока слишком слаб в Паскале.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо