Hallo,
solange du in Records denkst wird das nix.
Du solltest in Objekten und Interfaces denken.
Ich würde Dein Problem wie folgt lösen:
Ich würde als Parameter ein Interface verwenden.
Delphi-Quellcode:
function Datentypgrösse(unbekannter_Datentyp : IMyInterface ):Integer; // kann ein Record integer usw. sein
var
rl:integer;
begin
rl:=0;
rl:=unbekannter_Datentyp.Size; //könnten ja alle möglichen Typen sein
result:=rl ;
end;
IMyInterface würde dann wie folgt aussehen
Delphi-Quellcode:
IMyInterface = Interface
['{06C033D1-76E2-452E-8F94-C4ED1DCA429F}']
function Size : Integer;
end;
Jetzt kannst Du jedes Objekt dass das IMyInterface implementiert als Parameter übergeben.
Schau Dir folgenden Code mal etwas genauer an:
Delphi-Quellcode:
TMyObject = class(TInterfacedObject, IMyInterface)
public
function Size : Integer;
end;
TMyListObject = class(TListBox,IMyInterface)
public
function Size : Integer;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
function DataSize(aInterface : IMyInterface) : Integer;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
{ TMyObject }
function TMyObject.Size: Integer;
begin
Result:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aObject : TMyObject;
aListObject : TMyListObject;
begin
aObject:=TMyObject.Create;
DataSize(aObject); // Hier wird ein Objekt des Types TMyObject übergeben
aObject.Free;
aListObject:=TMyListObject.Create(Nil);
DataSize(aListObject); // Hier wird ein Objekt des Types TMyListObject übergeben (eigentlich eine TListBox
aListObject.Free;
end;
function TForm1.DataSize(aInterface: IMyInterface): Integer;
begin
Result:=aInterface.Size;
end;
{ TMyListObject }
function TMyListObject.Size: Integer;
begin
Result:=0;
end;
Ab D2005 würde ich die Möglichkeiten der ClassHelpers ausloten. (Habe bislang aber nur etwas darüber gelesen)