Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Подскажите как сравнить 2 пер.   Найти похожие ветки 

 
Man ©   (2003-07-01 20:41) [0]

Привет всем!Подскажите как сравнить 2 пер. r1,r2:RMyrec;
( RMyrec=Record
a1:byte;
............
an:string;
End;
)
чтобы не писать (r1.a1=r2.a1)....And(r1.an=r2.an)?
Можно написать ф-ю и потом её исполь.,но если исп. единожды,но типы рекордов отличаются,а лишнее писать всё равно влом.
Зараннее всем большое спасибо!


 
Романов Р.В. ©   (2003-07-01 21:01) [1]

в общем случае никак.


 
jack128 ©   (2003-07-01 22:39) [2]

Часто (если твои записи не содержат строк, дин. массивов или других указателей) помогает функция
function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;


 
Тих   (2003-07-01 23:08) [3]

Воспользоваться старым добрым object вместо record

TRec = object
public
a: integer;
b: integer;
function Equal(const Value: TRec): boolean; virtual;
end;

function TRec.Equal;
begin
result := ((a = Value.a) and (b = Value.b));
end;


 
Ученик ©   (2003-07-01 23:44) [4]

>Man © (01.07.03 20:41)

Вроде работает

type
TFieldInfo = packed record
TypeInfo: PPTypeInfo;
Offset: Cardinal;
end;

PFieldTable = ^TFieldTable;
TFieldTable = packed record
X: Word;
Size: Cardinal;
Count: Cardinal;
Fields: array [0..0] of TFieldInfo;
end;

function GetFieldTable(aTypeInfo: PTypeInfo): PFieldTable;
begin
Result := PFieldTable(Integer(aTypeInfo) + Byte(PTypeInfo(aTypeInfo).Name[0]));
end;

function CompareRecord(aRecord1, aRecord2: Pointer; aRecordInfo: PTypeInfo): Boolean;
var
FieldTable : PFieldTable;
i, iOffset, iFieldOffset: Integer;
begin
Result := False;
iOffset := 0;
FieldTable := GetFieldTable(aRecordInfo);
with FieldTable^ do
for i := 0 to Count - 1 do begin
iFieldOffset := Fields[i].Offset;
if iFieldOffset > iOffset then begin
Result := CompareMem(PChar(aRecord1) + iOffset, PChar(aRecord2) + iOffset,
iFieldOffset - iOffset);
if not Result then Break
end;
case Fields[i].TypeInfo^^.Kind of
tkLString: Result := string(Pointer(PChar(aRecord1)+iFieldOffset)^) =
string(Pointer(PChar(aRecord2)+iFieldOffset)^);
{ tkWString:
tkVariant:
tkArray:
tkRecord:
tkInterface:
tkDynArray:}
end;
if Result then iOffset := iFieldOffset + 4 else Break
end
end;

if CompareRecord(@MyRecord1, @MyRecord2, TypeInfo(TMyRecord)) then


 
Тих   (2003-07-01 23:59) [5]

Вопрос-то глубоко философский %-) Что значит "сравнить записи"? сравнить их адреса? сравнить значения полей? а если эти поля - указатели - то разадресовать их и сравнить содержимое? а если это пчары - то что сравнивать?
и т.п. В сях перегружают оператор ==, а в данном случае имеет-таки смысл написать несколько перегружаемых и виртуальных функций для сравнения.


 
Ученик ©   (2003-07-02 00:05) [6]

>Ученик © (01.07.03 23:44)
Нехватает :-)

function CompareRecord(aRecord1, aRecord2: Pointer; aRecordInfo: PTypeInfo): Boolean;
var
FieldTable : PFieldTable;
i, iOffset, iFieldOffset: Integer;
begin
Result := False;
iOffset := 0;
FieldTable := GetFieldTable(aRecordInfo);
with FieldTable^ do begin
for i := 0 to Count - 1 do begin
iFieldOffset := Fields[i].Offset;
if iFieldOffset > iOffset then begin
Result := CompareMem(PChar(aRecord1) + iOffset, PChar(aRecord2) + iOffset,
iFieldOffset - iOffset);
if not Result then Break
end;
case Fields[i].TypeInfo^^.Kind of
tkLString: Result := string(Pointer(PChar(aRecord1)+iFieldOffset)^) =
string(Pointer(PChar(aRecord2)+iFieldOffset)^);
{ tkWString:
tkVariant:
tkArray:
tkRecord:
tkInterface:
tkDynArray:}
end;
if Result then iOffset := iFieldOffset + 4 else Break
end;
if Result and (iOffset < Size) then
Result := CompareMem(PChar(aRecord1) + iOffset, PChar(aRecord2) + iOffset,
Size - iOffset)

end
end;



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

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-44884
ZeroDivide
2003-06-26 10:38
2003.07.14
Программисты, они толстые... Нда..., а похудеть то как?


1-44764
INCOGNITO
2003-07-02 00:43
2003.07.14
ReadOnly Files


1-44651
Darrin
2003-07-02 11:41
2003.07.14
Зависание MDI приложения.


1-44630
Sensor
2003-07-02 04:26
2003.07.14
ShellExecute + PopupMenu


1-44702
Some0ne
2003-06-30 02:48
2003.07.14
Рисование на десктопе