Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Method Resolution Clause --> Undeclared Identifier (https://www.delphipraxis.net/191440-method-resolution-clause-undeclared-identifier.html)

Aviator 16. Jan 2017 16:20

Method Resolution Clause --> Undeclared Identifier
 
Hallo Delphianer,

ich habe gerade ein sehr kurioses Problem. Ich habe drei Interfaces die voneinander nichts wissen. Also keine Ableitung kein gar nix. Alle drei Interfaces stellen die Methode
Delphi-Quellcode:
Init()
bereit. Jetzt habe ich eine Klasse die alle drei Interfaces implementiert.

Jetzt muss ich ja die Init Methoden von mindestens zwei Interfaces so implementieren, damit der Compiler weiß, welche Methode gemeint ist (Method Resolution Clause).

Bei zwei Interfaces funktioniert das auch problemlos, aber sobals das dritte Interface hinzu kommt, erhalte ich den Fehler, dass die Methode nicht deklariert sei.

Beispiel:

Delphi-Quellcode:
IInterface1 = interface
  function Init: Boolean; stdcall;
end;

IInterface2 = interface
  function Init: Boolean; stdcall;
end;

IInterface3 = interface
  function Init: Boolean; stdcall;
end;
Delphi-Quellcode:
TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3
private
  function I2Init: Boolean;
  function I3Init: Boolean;
public
  function Init: Boolean; // Init aus IInterface1
  function IInterface2.Init = I2Init;
  function IInterface3.Init = I3Init;
end;
Sobald ich jetzt F9 drücke erscheint die Meldung "Undeklarierter Bezeichner: I3Init". Nehme ich die Method Resolution Clause (MRC) von I3Init raus (auskommentieren), dann wird mir nur die Meldung "I3Init wurde deklariert aber nie verwendet" ausgegeben. Eine Fehlermeldung das Init aus IInterface3 nicht implementiert sei erscheint nicht. Ist auch klar, weil ich ja eine Init Methode ohne MRC implementiert habe. Sobald ich dann die Methode aus IInterface1 auch mit einer MRC versehe erscheint auch die Meldung, dass Init aus IInterface3 nicht implementiert ist. Ist ja dann auch korrekt.

Jetzt kommt es aber. Versehe ich alle Methoden mit einer MRC, dann erscheint bei zwei ein Fehler (IInterface1 und IInterface3).

Wenn ich jetzt die MRC für I3Init rausnehme, dann meldet er auch, dass I3Init deklariert aber nicht verwendet wurde. Also er findet die Methode, aber nur wenn die MRC nicht eingetragen ist.

Weshalb ist das so? Ich hoffe mir kann jemand helfen. Ich hoffe ich übersehe nur etwas. So kann ich mein Projekt nämlich nicht mehr kompilieren. :|


Vielleicht als abschließende Frage weil es irgendwo zum Thema passt: Warum kann ich keine Direktiven (wie z.B.
Delphi-Quellcode:
stdcall
) bei den Methoden angeben die ich mit einer MRC auflösen musste?

Fritzew 16. Jan 2017 16:49

AW: Method Resolution Clause --> Undeclared Identifier
 
Delphi-Quellcode:
TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3 )
private
  function I2Init: Boolean; stdcall;
  function I3Init: Boolean; stdcall;
public
  function Init: Boolean; stdcall;// Init aus IInterface1
  function IInterface2.Init = I2Init;
  function IInterface3.Init = I3Init;
end;
Das funktioniert hier einwandfrei

Aviator 16. Jan 2017 16:52

AW: Method Resolution Clause --> Undeclared Identifier
 
Hmm merkwürdig. Meine Interfaces sind zwar etwas größer und es gibt auch mehrere gleichnamige Funktionen darin, aber ich habe auch schonmal aus dem einem Interface (das bei dem er erstmalig angefangen zu meckern) alle gleichnamigen Methoden entfernt. Trotzdem das gleiche Problem. :|

EDIT: Du hast aber hinter I2Init und I3Init auch noch stdcall stehen. Das funktioniert bei mir nicht.

Fritzew 16. Jan 2017 16:54

AW: Method Resolution Clause --> Undeclared Identifier
 
Dein Code hat hier auch nicht funktioniert. Erst nachdem ich den Stdcall and die Einzelnen funktionen gehängt habe.
Ich denke die Fehlermeldungen vom Compiler sind hier "Suboptimal".
In Wirklichkeit passt nämlich die Signatur nicht

Fritzew 16. Jan 2017 16:55

AW: Method Resolution Clause --> Undeclared Identifier
 
Wieso geht stdcall nicht was meckert wer da?

Aviator 16. Jan 2017 17:07

AW: Method Resolution Clause --> Undeclared Identifier
 
Zitat:

Zitat von Fritzew (Beitrag 1358991)
Wieso geht stdcall nicht was meckert wer da?

Kommando zurück mit dem
Delphi-Quellcode:
stdcall
. Da hat bei mir bei der Interface Deklaration noch etwas gefehlt. Aber der andere Fehler bleibt leider weiterhin. :?

Fritzew 16. Jan 2017 17:10

AW: Method Resolution Clause --> Undeclared Identifier
 
Ich denke da musst Du noch mal alles genau anschauen. Das hier funktioniert einwandfrei,
nehme ich aber ein stdcall weg zb bei I2Init bekomme ich Deinen beschrieben Fehler

Delphi-Quellcode:
unit Unit24;

interface

type

  IInterface1 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface2 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface3 = interface
    function Init: Boolean; stdcall;
  end;

  TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3)
  private
    function I2Init: Boolean; stdcall;
    function I3Init: Boolean; stdcall;

  public
    function Init: Boolean; stdcall; // Init aus IInterface1
    function IInterface2.Init = I2Init;
    function IInterface3.Init = I3Init;
  end;

implementation

{ TTestClass }

function TTestClass.I2Init: Boolean;
begin
  result := false;
end;

function TTestClass.I3Init: Boolean;
begin
  result := false;
end;

function TTestClass.Init: Boolean;
begin
  result := false;
end;

end.

Aviator 16. Jan 2017 17:24

AW: Method Resolution Clause --> Undeclared Identifier
 
Hallo FritzeW,

hab nochmal über alles drübergschaut und schlussendlich auch den Fehler gefunden. :oops:

Der Fehler kam daher, dass ich bei einem anderen Interface in dem ich schon Method Resolution Clauses verwenden musste das
Delphi-Quellcode:
stdcall
vergessen habe und daher dachte, dass das nicht funktioniert. Deshalb habe ich das auch bei den neuen Methoden weggelassen und dadurch auch den Fehler an der falschen Stelle gesucht.

Dumme Fehler müssen bestraft werden. :roll:

Danke das du meine Kugel mit deinem ersten Beitrag schon ins Rollen gebracht hast. Deinen letzten Beitrag habe ich übrigens erst gesehen, als ich meine Lösung posten wollte. :stupid:

Aviator 16. Jan 2017 17:30

AW: Method Resolution Clause --> Undeclared Identifier
 
Ach noch eins. Wenn wir schon bei dem Thema sind.

Ist es sinnvoll, alle Methoden auf die gleiche Methode umzubiegen wenn alle das gleiche ausführen sollen? Also in etwa so?

Delphi-Quellcode:
unit Unit24;

interface

type

  IInterface1 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface2 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface3 = interface
    function Init: Boolean; stdcall;
  end;

  TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3)
  private
    function DoInit: Boolean; stdcall;
  public
    function IInterface1.Init = DoInit;
    function IInterface2.Init = DoInit;
    function IInterface3.Init = DoInit;
  end;
Theoretisch könnte man dann auch ein Basis-Interface machen, aber in dem Fall habe ich das nicht. Könnte ich theoretisch mal noch umbauen. Aber nur so aus Prinzip. Gibt es hier irgendwelche Nachteile? Kompilieren tut es nämlich.

himitsu 16. Jan 2017 17:38

AW: Method Resolution Clause --> Undeclared Identifier
 
Zitat:

Zitat von Aviator (Beitrag 1358998)
Ist es sinnvoll, alle Methoden auf die gleiche Methode umzubiegen wenn alle das gleiche ausführen sollen? Also in etwa so?

Wenn die eh das Selbe machen, wozu dann umbiegen? :angle:
Delphi-Quellcode:
  IInterface1 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface2 = interface
    function Init: Boolean; stdcall;
  end;

  IInterface3 = interface
    function Init: Boolean; stdcall;
  end;

  TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3)
  public
    function Init: Boolean; stdcall;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.
Seite 1 von 2  1 2      

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