AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Method Resolution Clause --> Undeclared Identifier
Thema durchsuchen
Ansicht
Themen-Optionen

Method Resolution Clause --> Undeclared Identifier

Ein Thema von Aviator · begonnen am 16. Jan 2017 · letzter Beitrag vom 16. Jan 2017
Antwort Antwort
Seite 1 von 2  1 2      
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:20
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 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. stdcall ) bei den Methoden angeben die ich mit einer MRC auflösen musste?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:49
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
Fritz Westermann
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:52
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.

Geändert von Aviator (16. Jan 2017 um 17:54 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:54
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
Fritz Westermann
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:55
Wieso geht stdcall nicht was meckert wer da?
Fritz Westermann
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 18:07
Wieso geht stdcall nicht was meckert wer da?
Kommando zurück mit dem stdcall . Da hat bei mir bei der Interface Deklaration noch etwas gefehlt. Aber der andere Fehler bleibt leider weiterhin.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 18:10
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.
Fritz Westermann
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 18:24
Hallo FritzeW,

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

Der Fehler kam daher, dass ich bei einem anderen Interface in dem ich schon Method Resolution Clauses verwenden musste das 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.

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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 18:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 18:38
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?
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:14 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