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

Вниз

Подскажите как сравнить 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
3-44579
www
2003-06-20 15:09
2003.07.14
Переиндексация


6-44789
Igor__
2003-05-08 15:12
2003.07.14
Закачка


14-44815
VEG
2003-06-29 12:42
2003.07.14
Мои разговоры


4-44954
maxik
2003-05-13 11:35
2003.07.14
taskbar


1-44641
KILLER_ABV
2003-07-02 11:21
2003.07.14
TWebBrowser, как достучатся до его TPopupMenu





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