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;