Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ich kann meinen eigenen Helper nicht benutzen (https://www.delphipraxis.net/189468-ich-kann-meinen-eigenen-helper-nicht-benutzen.html)

Der schöne Günther 15. Jun 2016 19:07

Ich kann meinen eigenen Helper nicht benutzen
 
Ich stehe auf dem Schlauch. Folgender Code funktioniert nicht, ich kann meine Helper-Methode
Delphi-Quellcode:
IWantThis()
nicht aufrufen:

Delphi-Quellcode:
program RecordHelper;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  EnumUnit in 'EnumUnit.pas',
  WrapperUnit in 'WrapperUnit.pas';

type
   TSomeEnumHelper = record helper for TSomeEnum
      procedure IWantThis();
   end;

procedure TSomeEnumHelper.IWantThis();
begin
   //
end;

var
   wrapper: TSomeWrapper;
begin
   wrapper.enum.IDontWantThis();
   wrapper.enum.IWantThis(); // <-- E2003
end.
Die beiden anderen Units:

Delphi-Quellcode:
unit EnumUnit;

interface

type
   TSomeEnum = (yes, no);

   TSomeEnumHelper = record helper for TSomeEnum
       procedure IDontWantThis();
   end;

implementation

{ TSomeEnumHelper }

procedure TSomeEnumHelper.IDontWantThis();
begin
   //
end;

end.
Delphi-Quellcode:
unit WrapperUnit;

interface uses EnumUnit;

type
   TSomeWrapper = record
      enum: TSomeEnum;
    end;

implementation

end.

Warum ist das so? Mir leuchtet ein dass es vielleicht auch nicht die tollste Idee ist, den Enum-Typen sowie den Helper in der selben Unit zu deklarieren. Trotzdem- Sollte das wirklich so sein?

Ein Workaround wäre so etwas in der Richtung, dann geht es komischerweise:
Delphi-Quellcode:
var
   wrapper: TSomeWrapper;
   theEnum: TSomeEnum;
begin
   wrapper.enum.IDontWantThis();
   //wrapper.enum.IWantThis(); // <-- E2003

   theEnum := wrapper.enum;
   theEnum.IWantThis(); // works
end.

Sir Rufo 15. Jun 2016 19:12

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Weil der Helper nicht in einer
Delphi-Quellcode:
unit
liegt.

Delphi-Quellcode:
program
ist keine
Delphi-Quellcode:
unit
.

:stupid:

Der schöne Günther 15. Jun 2016 19:14

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Nee, macht keinen Unterschied wenn es eine UNIT ist. War nur zu Verkürzungszwecken in die DPR gepackt ;-)

Sir Rufo 15. Jun 2016 19:52

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Bitte im ganzen Satz (mit dem gesamten Code).

Du weißt, dass immer nur ein Helper pro Typ aktiv sein kann?

Der schöne Günther 15. Jun 2016 20:07

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich fand den Satz jetzt nicht allzu schwer :|

Anbei gerne auch noch einmal als ZIP-Datei. Ohne Code in der DPR.


Mir ist klar dass immer nur ein Helper aktiv sein kann. Mir ist hingegen nicht klar, weshalb der Helper aus einer anderen Datei Vorrang vor dem Helper in der eigenen Unit haben sollte.

Sir Rufo 15. Jun 2016 22:18

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Ahhh, jetzt habe ich es auch gesehen :stupid:

Das ist aber wohl kein Bug, sondern ehar als Feature gedacht ;)
(oder es hat wieder keiner weiter gedacht ... es kompiliert, dann reicht es ja)

Der Helper wird augenscheinlich beim Kompilieren mit in die Klasse/den Record verwoben, so dass dieser dann an egal welcher Stelle beim Verwenden der Struktur zur Verfügung steht, egal was für Helper da noch definiert sein sollten.

Hätte ich so auch nicht erwartet ... aber die Helper (grundsätzlich sehr hilfreich) sind ja eh etwas seltsam implementiert (es kann nur einen geben, nicht für Generics, ...)

Union 16. Jun 2016 10:49

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1340273)
... aber die Helper (grundsätzlich sehr hilfreich) sind ja eh etwas seltsam implementiert

Ich würde eher sagen dämlich, nicht nur seltsam. Siehe TBooleanHelper.ToString, wo die overloads sich gegenseitig ausschließen und erst in XE7 durch (undokumentierte) Einführung eines separaten Typs unterscheidbar werden.

Sir Rufo 16. Jun 2016 11:37

AW: Ich kann meinen eigenen Helper nicht benutzen
 
Zitat:

Zitat von Union (Beitrag 1340306)
Zitat:

Zitat von Sir Rufo (Beitrag 1340273)
... aber die Helper (grundsätzlich sehr hilfreich) sind ja eh etwas seltsam implementiert

Ich würde eher sagen dämlich, nicht nur seltsam. Siehe TBooleanHelper.ToString, wo die overloads sich gegenseitig ausschließen und erst in XE7 durch (undokumentierte) Einführung eines separaten Typs unterscheidbar werden.

Auf die Implementierung wollte ich gar nicht hinaus, sondern wie die Helper generell funktionieren.

Bei der Erstellung von Helpern kann man natürlich auch Fehler machen, was aber nicht an der Funktionalität Helper liegt :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz