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
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:07
Delphi-Version: 10 Seattle
Hallo,

Das ist quasi eine Folgefrage zu TValue.AsVariant und Boolean - Fehler?
Da ich gerade (noch) nicht auf 10.2 umsteigen kann musste ich mir anders behelfen:
Delphi-Quellcode:
TValueHelper = record helper for TValue
public
  function AsVariant() : Variant;
end;

function TValueHelper.AsVariant: Variant;
begin
  if (IsType<Boolean>()) then
    Result := AsBoolean()
  else
    Result := Self.AsVariant(); // !
end;
Die markierte Zeile führt allerdings zu einer Endlosrekursion.
"inherited" funktioniert in dem Zusammenhang nicht und auch sonst habe ich keine Art gefunden wie ich das original TValue.AsVariant aufrufen kann.
Mein letzter und extremster Versuch:
Delphi-Quellcode:
function TValueHelper.AsVariant: Variant;
var originalAsVariant: function(Self: TValue): Variant;
begin
  originalAsVariant := @TValue.AsVariant;
  if (IsType<Boolean>()) then
    Result := AsBoolean()
  else
    Result := originalAsVariant(Self);
end;
Aber selbst in diesem Fall springt er wieder in den TValueHelper.AsVariant. Bedeutet das, dass das original-TValue.AsVariant nicht mehr existiert und nicht nur überdeckt sondern ersetzt wurde?
Denn so sieht es für mich momentan aus.

Die Frage ist nun: Existiert die ursprüngliche Methode noch und wenn ja, wie kann ich sie aufrufen?

Disclaimer: Mir ist klar, dass ich das ganze umgehen kann, indem ich meine Helper-Methode einfach umbenenne, aber einerseits wäre mir ein Überdecken lieber und andererseits bin ich jetzt neugierig was da jetzt im Hintergrund wirklich passiert
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:10
Delphi-Quellcode:
  else
    Result := inherited Self.AsVariant(); // !
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:12
Delphi-Quellcode:
  else
    Result := inherited Self.AsVariant(); // !
end;
"inherited" funktioniert in dem Zusammenhang nicht [...]
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#4

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:28
Das mit dem inherited funktioniert bei records ja leider nicht. In diesem Fall kann man das aber umgehen:
Delphi-Quellcode:
function TValueHelper.AsVariant: Variant;
begin
  if (IsType<Boolean>()) then
    Result := AsBoolean()
  else
    Result := AsType<Variant>;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:49
Das mit dem inherited funktioniert bei records ja leider nicht. In diesem Fall kann man das aber umgehen:
Delphi-Quellcode:
function TValueHelper.AsVariant: Variant;
begin
  if (IsType<Boolean>()) then
    Result := AsBoolean()
  else
    Result := AsType<Variant>;
end;
Danke, so werd ichs machen!

Habe aber selbst noch etwas rumprobiert und auf Biegen und Brechen lässt es sich machen:
Delphi-Quellcode:
var
  OriginalTValueAsVariant: Pointer = @TValue.AsVariant; // Muss VOR dem Recordhelper deklariert/zugewiesen werden

type
  TValueHelper = record helper for TValue
  public
    function AsVariant() : Variant;
  end;

function TValueHelper.AsVariant: Variant;
type TAsVariantFunc = function(Self: TValue): Variant;
begin
  if (IsType<Boolean>()) then
    Result := AsBoolean()
  else
    Result := TAsVariantFunc(OriginalTValueAsVariant)(Self);
end;
Deine Lösung ist natürlich deutlich besser/eleganter und werde die auch auf jeden Fall verwenden, aber man hat ja nicht immer das Glück, dass man so nen schönen Ausweg hat.
For Science und so.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Recordhelper - Methode mit gleichem Namen wie im Record

  Alt 23. Jul 2018, 15:57
Jupp, vor dem Helper, da wo es noch nicht überschrieben ist, oder aus der TypeInfo/RTTI auslesen.

Aber es ist doch ein Bug, dass inherited nicht geht?
Nja, aber stimmt schon, inherited wird hier auf den Vorfahren der Klasse und nicht auf den "Vorfahren" des Helpers gehen.

Allergings ist es im Normalfall eine schlechte Idee eine bestehende Funktion mit den Helpern verdecken zu wollen.
Es ist schwer zu erkennen ob/wann der Helper genommen wird oder das Original des Typs.




Wäre es nicht toll, wenn die Helperbugs mal nach all den Jahren behoben werden? (vorallem mehrere Helper an einem Typ)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:39 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