Es gibt Möglichkeiten dafür, aber generell betrachtet ist ein Zeiger ein untypisierter Datentyp, er zteigt eben nur auf Irgendwas.
Eine Lösung wurde oben schon angesprochen. Du machst deine Records teilweise zueinander kompatibel. Zb. indem als allererstes Datenfeld zb. ein Zeiger "Type" einfügst, bei all deinen Records. Zb. so
Delphi-Quellcode:
type
PBaseRecord = ^TBaseRecord;
TBaseRecord = packed record
Typ: PTypeInfo;
end;
TMyRecord1 = packed record
Typ: PTypeInfo;
Daten: ab hier;
end;
TMyRecord2 = packed record
Typ: PTypeInfo;
Daten ab hier;
end;
procedure Test;
var
Rec1, Rec2: PBaseRecord;
begin
Rec1 := New(TMyRcord1);
Rec1.Typ := TypeInfo(TMyRecord1);
Rec1.Data := XYZ;
Rec2 := New(TMyRecord2);
Rec2.Typ := TypeInfo(TMyRecord2);
if Rec1.Typ <> Rec2.Typ then
ShowMessage('Records unterschieldich');
if Rec1.Typ = TypeInfo(TMyRecord1) then
ShowMessage(Record1 ist TMyRecord1');
ShowMessage(Rec1.Typ.Name);
end;
Eine andere Lösung ist es die Allozierung der Records für jeden Recordtypen in unterschiedliche Speicherbereich zu machen. Zb. so
Delphi-Quellcode:
var
Rec1: array of TMyRecord1; // globaler Datenspeicher
Rec2: array of TMyRecord2;
procedure Test;
var
r1: Pointer;
begin
SetLength(Rec1, Length(Rec1) +1);
r1 := @Rec1[High(Rec1)];
if PChar(r1) >= @rec1[0] and PChar(r1) <= @rec1[High(Rec1)]) then
ShowMessage('Pointer r1 stammt aus array Rec1');
end;
Du kannst dann über die Addresse des Zeigers ermitteln von welchem Typ er ist.
ABER !
Was ist ein TObject im vergleich zu einem Record ? Ein TObject ist ein Record bei dem der Compiler uns sinnvolle Instrumente in die Hand gibt um typisiert und polymorph Daten zu verwalten. Polymorph ist das Stichwort, denn das ist es was du brauchst.
Ergo: die richtige Lösung ist es von deinen manuell allozierten Records wegzugehen und Klassen zu benutzen.
Gruß Hagen