![]() |
Delphi-Version: XE5
Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Gegeben sei:
Delphi-Quellcode:
Der TGUIDHelper aus
unit Unit1;
interface uses System.SysUtils; // Enthält ebenfalls einen TGUIDHelper procedure someProc(); forward; var myGUID: TGUID; implementation uses Spring.Helpers; procedure someProc(); begin if myGUID.IsEmpty then; end; end.
Delphi-Quellcode:
hat eine Property
Spring.Helpers
Delphi-Quellcode:
, der aus
IsEmpty
Delphi-Quellcode:
nicht. Die Code-Vervollständigung schlägt die Benutzung von
System.SysUtils
Delphi-Quellcode:
vor. Beim Kompilieren aber wird gesagt
IsEmpty
Code:
Ich habe also zwei
[dcc32 Fehler] Unit1.pas(15): E2003 Undeklarierter Bezeichner: 'IsEmpty'
[dcc32 Fataler Fehler] Project1.dpr(9): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Delphi-Quellcode:
: Einmal den aus
record helper for System.TGUID
Delphi-Quellcode:
und einmal aus, beispielhaft,
System.SysUtils
Delphi-Quellcode:
. Ich hätte erwartet dass der aus
Spring.Helpers
Delphi-Quellcode:
genommen wird, da dieser im
Spring.Helpers
Delphi-Quellcode:
-Abschnitt importiert wird. Anscheinend ist dem nicht so.
implementation
Ob das so gewollt ist? Habe ich etwas an der Delphi-Philosophie falsch verstanden? Weil sonst haben doch eigentlich immer später importierte Units und immer "implementation nach Interface" Vorrang... |
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Und wenn Du die Variablen-Deklaration auch in den implementation-Abschnitt verschiebst? Ich bin nicht sonderlich bewandert in Helpern, könnte mir aber vorstellen, dass das so klappt.
|
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Tatsächlich, im Beispiel oben macht das einen Unterschied- Dann nimmt er den "richtigen" Helper.
Aber im echten Fall war es ein geschütztes Feld einer Klasse. Keine globale Variable. Die bekomme ich aus dem interface-Abschnitt ja nicht heraus :wink: |
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Grundsätzlich würde ich eh immer empfehlen möglichst alle Uses ausschließlich im Interface zu deklarieren.
Da kommt es dann auch nur noch auf die Reihenfolge drauf an, was letzendlich verwendet wird. Und vorallem ist ausschließlich dort die Initialisierungsreihenfolge der Units richtig gegeben. In die Implementation kommen bei mir ausschließlich Units, welche aufgrund von Kreuzreferenzen dort hin müsssen. Außerdem halte ich es immernoch für einen grauenhaften Bug, daß Helper-Klassen nicht überladen werden, also daß immer nur ein Helper gleichzeitig pro Klasse/Typ aktiv ist. :wall: Und ja, es wäre toll, wenn Compiler, Code-Insight und Error-Insight gleich arbeiten würden. |
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Zitat:
Wusste ich aber auch noch nicht, dass es bei Helpers eine Rolle spielt ob die uses und das geholfene (:mrgreen:) Symbol im gleichen Bereich stehen |
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Aber wir sind uns doch alle (drei Leute immerhin) einig, dass das so eigentlich nicht sein sollte, oder? Es sollte immer die Helferklasse der "letzten" Unit zum Einsatz kommen. Steckt im
Delphi-Quellcode:
-Teil schon eine, überschreibt die im
interface
Delphi-Quellcode:
-Teil diese aber nicht. Aber sie sollte es.
implementation
Ist bei anderen Typen ja auch so. |
AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Zitat:
Aber mit der Verbesserung von Helpern geh ich Marco sowieso bei jeder sich bietenden Gelegenheit auf die Nerven :twisted: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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