Mit einem Pointer auf TDataItem, den die Property zurück liefert, sollte es gehen.
Ich persönlich würde das ganze aber komplett mit Generics und Klassen umsetzen. Mal so ins Blaue getippt, das sollte kompilieren:
Delphi-Quellcode:
type
TDataItem =
class
end;
TDataItem<T> =
class(TDataItem)
private
FData: T;
public
constructor Create(
const AValue: T);
procedure SetData(
const AValue: T);
function GetData: T;
end;
TCustomColumn =
class(TComponent)
private
FItem: TDataItem;
public
procedure SetItem<T>(
const AValue: T);
function GetItem<T>: T;
end;
...
function TCustomColumn.GetItem<T>: T;
begin
if Assigned(FItem)
and (FItem
is TDataItem<T>)
then
Result := TDataItem<T>(FItem).GetData
else
raise Exception.Create('
Falscher Typ');
end;
procedure TCustomColumn.SetItem<T>(
const AValue: T);
begin
FItem.Free;
FItem := TDataItem<T>.Create(AValue);
end;
constructor TDataItem<T>.Create(
const AValue: T);
begin
FData := AValue;
end;
function TDataItem<T>.GetData: T;
begin
Result := FData;
end;
procedure TDataItem<T>.SetData(
const AValue: T);
begin
FData := AValue;
end;
...
procedure Example;
var
a: TCustomColumn;
begin
a := TCustomColumn.Create(
nil);
a.SetItem<Integer>(42);
ShowMessage(a.GetItem<Integer>.ToString);
a.SetItem<
string>('
42');
ShowMessage(a.GetItem<
string>);
end;
Alternativ:
Delphi-Quellcode:
function TCustomColumn.GetItem<T>: T;
begin
if Assigned(FItem) then
Result := (FItem as TDataItem<T>).GetData
else
Result := TValue.Empty.AsType<T>;
end;