Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Record- oder Klassenfelder als property zuweisen und lesen, wie?

  Alt 25. Feb 2023, 11:06
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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat