Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut (https://www.delphipraxis.net/176991-sprach-feature-wird-nicht-unterstuetzt-benutzerdefiniertes-attribut.html)

Codehunter 9. Okt 2013 10:59

Delphi-Version: XE2

Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Moin!

Ich bekomme folgende Compilerwarnung:

[dcc64 Warnung] Unit1.pas(13): W1025 Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut'
Delphi-Quellcode:
const
  IID_Module: TGUID = '{ED91D3E0-912C-4B0B-9160-257D21399160}';

type
  ImyModule = interface(IInterface)
  [IID_Module] // <-- Hier die Warnung
    {...}
  end;
Muss man die GUID hier nochmal als quasi String-Konstante angeben? Find ich bissi unübersichtlich...

Grüße
Cody

PS: Delphi XE4 aber mehr als XE2 kann man hier nicht angeben ;-)

Der schöne Günther 9. Okt 2013 11:04

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Wenn man die GUID da angeben will, ist es doch eigentlich klar dass es die GUID ist, oder?

Ich drücke immer nur STRG+Shift+G und denke nicht weiter drüber nach :?

Ansonsten werden so in den Klammern Attribute angegeben. Der Compiler sucht nach Subklassen von
Delphi-Quellcode:
TCustomAttribute
mit dem Namen
Delphi-Quellcode:
IID_Module
und
Delphi-Quellcode:
IID_ModuleAttribute
und findet sie nicht. Daher die Warnung.

Das Attribut würde sich übrigens dann auch nicht auf das Interface, sondern die erste Methode im Interface beziehen.

Bernhard Geyer 9. Okt 2013 11:05

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Zitat:

Zitat von Codehunter (Beitrag 1231348)
Muss man die GUID hier nochmal als quasi String-Konstante angeben? Find ich bissi unübersichtlich...

Ja. Evtl. erfährt ja der Compiler mit dem neuen LLVM-Compiler eine erweiterung.

Zitat:

Zitat von Codehunter (Beitrag 1231348)
PS: Delphi XE4 aber mehr als XE2 kann man hier nicht angeben ;-)

Wieso? Bei dir steht doch XE4?

Der schöne Günther 9. Okt 2013 11:06

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Er meint die Mehrfachauswahl "Sprache" im Unterforum "Object-Pascal / Delphi-Language". Nach XE2 kommt nichts mehr...

Bernhard Geyer 9. Okt 2013 11:15

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1231353)
Er meint die Mehrfachauswahl "Sprache" im Unterforum "Object-Pascal / Delphi-Language". Nach XE2 kommt nichts mehr...

Ah. Stimmt. Da muss mohl der Forenknecht mal ran :-)

himitsu 9. Okt 2013 11:17

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Du könntest mal probieren, ob der Fehler weg ist, wenn du
Delphi-Quellcode:
(IInterface)
wegläßt.
Ohne Angabe ist es eh automatisch implizit davon abgeleitet.

Und nein, du kannst den GUID auch direkt da hinschreiben.
Delphi-Quellcode:
type
  ImyModule = interface
  ['{ED91D3E0-912C-4B0B-9160-257D21399160}']
    {...}
  end;
Theoretisch kann man den GUID auch weglassen, dann wird vom Compiler einer generiert, aber halt jedesmal ein Anderer
und man kann ein Objekt nicht mehr fragen, ob es das Interface bereitstellt.

Mit Strg+Shift+G die GUID zu erstellen ist auch nett, falls man keine Lust hat sich selber was auszudenken, bzw. wenn man kein bestimmtes Muster benötigt.


Die Attribute werden "zuällig" genauso definiert, also mit den eckigen Klammern.
irgendwas bringt da der Compiler wohl durcheinander.
bezüglich der Warnung: Also der Compiler macht erstmal weiter, hört dann aber später in der Unit auf mt arbeiten und es kommt kein Programm raus?
Nja, was dir da bleibt, wäre eine Meldungs ans QC und auf den Bugfix warten.
Eventuell kann es aber auch schon helfen, wenn du in den Codes über deinem Interface ein paar Leerzeilen änderst, oder dir Reihenfolge von anderen Typen ... manchmal sind dann derartige Compiler-Bugs plötzlich weg.

Codehunter 9. Okt 2013 11:40

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Ich glaub, ich hab mich da ein bisschen missverständlich ausgedrückt. Die Unit ist die gemeinsame Interface-Deklaration zwischen einem Hauptprogramm und einer DLL. Im Hauptprogramm will ich die GUID ja ausdrücklich als Konstante haben für QueryInterface usw.

Klar kann ich die GUID einmal per STRG+Shift+G für den const-Bereich erzeugen und dann per Copy&Paste runter in die Interface-Deklaration kopieren. Aber wenn ich oben schon mal so eine schöne Konstante habe, warum nicht unten auch als Konstante verwenden? Sprich: Vermeidung von redundanten GUID-Angaben. Dass ich es dort direkt als GUID angeben KANN ist mir schon klar, nur dass ich es MUSS war mir nicht bewusst. Zumal lustigerweise der Code trotzdem funktioniert, nur eben mit einer Compilerwarnung.

Bzgl. XE4: Ich meinte die Auswahlliste beim Erstellen des Threads. Eigentlich könnte man die doch ganz weg lassen, man hats doch in seinem Userprofil oder man schreibt eine abweichende Version ausdrücklich ins Post.

TiGü 9. Okt 2013 12:52

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Zitat:

Zitat von Codehunter (Beitrag 1231348)
Muss man die GUID hier nochmal als quasi String-Konstante angeben? Find ich bissi unübersichtlich...

Schau beispielsweise mal in die Unit Winapi.StructuredQuery oder Winapi.Wincodec.
Dort siehst du eine gängige Lösung, mit der es sich leben lässt.

Anhand deines Beispiels:
Delphi-Quellcode:
const
  SID_Module :      = '{ED91D3E0-912C-4B0B-9160-257D21399160}';
  IID_Module : TGUID = SID_Module;

type
  ImyModule = interface(IInterface)
  [SID_Module]
    {...}
  end;

jaenicke 9. Okt 2013 12:56

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Zitat:

Zitat von Codehunter (Beitrag 1231358)
Ich glaub, ich hab mich da ein bisschen missverständlich ausgedrückt. Die Unit ist die gemeinsame Interface-Deklaration zwischen einem Hauptprogramm und einer DLL. Im Hauptprogramm will ich die GUID ja ausdrücklich als Konstante haben für QueryInterface usw.

Das kommt mir irgendwie bekannt vor... ich habe das allerdings gleich generisch gelöst. Kurzfassung:
Delphi-Quellcode:
class function TFoo.Get<T>(const AParams: IFooParams): T;
var
  TypeGuid: TGuid;
begin
  TypeGuid := GetTypeData(TypeInfo(T)).Guid;
  Supports((Instance as TFoo).Host.GetIntfImplementation(TypeGuid, AParams), TypeGuid, Result);
end;
Sprich ich rufe diesen Getter mit dem gewünschten Interface als Typparameter und den dazu passenden Initialisierungsparametern als Methodenparametern auf. Dann hole ich mir darin die Guid, frage beim Host an, bekomme ein Interface zurück und wandele es mit Supports in den korrekten Typ um.

So ist das nach außen komplett generisch gekapselt und ich brauche keine GUID-Konstanten oder ähnliche Krücken.

Codehunter 9. Okt 2013 12:58

AW: Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut
 
Zitat:

Zitat von TiGü (Beitrag 1231383)
Dort siehst du eine gängige Lösung, mit der es sich leben lässt.

Jupp, funktioniert. So isses schön ordentlich :-) Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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