Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 17:35
Jain, aber du kannst aus der TypeInfo/RTTI den Zeiger der gewünschten Methode auslesen und diese dann direkt aufrufen, am Helper/Compiler vorbei.

Und bei dieser Art des Override ist es halt manchmal ungünstig, dass es "unbemerkt" nur dann überschrieben/überdeckt wird, wenn der Helper sichtbar ist.


Bei uns hatte ich mal TField.Value mit einem Helper überschrieben, da Value:=Null nicht bei allen TField-Nachfolgern "richtig" funktioniert.
Aber nach anfänglichen Problemchen wurde es dann doch als "zusätzliches" Property implementiert und nicht als soeine Überladung des eigentlichen Value-Property.
Delphi-Quellcode:
type
  TFieldHelper = class helper for TField
  private
    function GetAsValueNullable : Variant;
    procedure SetAsValueNullable(const NewValue : Variant);
  public
    {$REGION 'Documentation'}
    ///   <summary>
    ///    <para>
    ///    Liest immer NULL, wenn das Feld NULL ist und setzt auch die NULL.
    ///    </para>
    ///    <para>
    ///    siehe TWideMemoField.GetAsVariant ... macht aus NULL ein '',<br />aber TWideStringField belässt es als
    ///    NULL, aber nur im Getter und nicht im Setter.
    ///    </para>
    ///   </summary>
    {$ENDREGION}
    property ValueNullable : Variant read GetAsValueNullable write SetAsValueNullable;
    {$REGION 'Documentation'}
    ///   <summary>
    ///    <para>
    ///    Achtung: Value=Variant, aber bei IsNull liefert/setzt es oftmals keine NULL.<br />z.B. TWideMemoField macht
    ///    dataus einen Leersting ''<br />siehe ValueNullable
    ///    </para>
    ///    <para>
    ///    Achtung: Property TField.Value=Variant, aber TIntegerField.Value=Integer<br />Property wird der Vererbung
    ///    überdeckt.
    ///    </para>
    ///   </summary>
    {$ENDREGION}
    //property Value; deprecated; // aus unerfindlichen Gründen meint der Compiler dass Variant, GetAsVariant und SetAsVariant nicht im Vorfahren existieren
    //property Value: Variant read GetAsVariant write SetAsVariant; deprecated;
    property Value: Variant read _GetAsVariant write _SetAsVariant; //deprecated 'BUGFIX: use ValueNullable if Value can contains NULL-Values';
  end;

function TFieldHelper.GetAsValueNullable: Variant;
begin
  if IsNull then
    Result := Null
  else
    Result := Value;
end;

procedure TFieldHelper.SetAsValueNullable(const NewValue: Variant);
begin
  if VarIsNull(NewValue) then
    Clear
  else
    Value := NewValue;
end;
$2B or not $2B
  Mit Zitat antworten Zitat