AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Recordhelper - Methode mit gleichem Namen wie im Record
Thema durchsuchen
Ansicht
Themen-Optionen

Recordhelper - Methode mit gleichem Namen wie im Record

Ein Thema von Neutral General · begonnen am 23. Jul 2018 · letzter Beitrag vom 23. Jul 2018
 
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.315 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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz