Текущий архив: 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.46 MB
Время: 0.007 c