Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Units mit gleichem Namen (System.Hash und Hash) (https://www.delphipraxis.net/190245-units-mit-gleichem-namen-system-hash-und-hash.html)

gammatester 16. Sep 2016 09:51

Units mit gleichem Namen (System.Hash und Hash)
 
Moin,

Seit XE8 gibt es eine Unit "System.Hash". Ich habe jetzt ein paar Berichte, daß meine Opensource Unit Hash (die seit über 13 Jahren im Einsatz ist und ständig weiterentwickelt wird) nicht erfolgreich benutzt werden kann (zB Fehler E2003 Undeclared identifier: THashContext).

Da ich selbst nur bis XE4 teste, kann ich das nicht nachvollziehen. Aber: Es sollte doch eine Möglichkeit geben, die Unit Hash ohne "System" Namespace zu benutzen eventuell mit

Delphi-Quellcode:
uses System.Hash, Hash, ...;


oder kann man die Suchreihenfolge irgendwie anders festlegen (wenn ja wie und wo)?

Die letzte Möglichkeit, meine Unit umzubenennen oder gar mit Namespace zu verzieren, möchte ich vermeiden, weil das wiederum das Kompilieren vieler vorhandener Programme (die ältere Delphis, Free Pascal, VirtualPascal benutzen) unmöglich macht.

Also zusammenfassende Frage: Wie kann man eine eigene Unit Hash mit System.Hash zusammen benutzen?

Gruß Gammatester

Uwe Raabe 16. Sep 2016 10:33

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von gammatester (Beitrag 1347803)
Also zusammenfassende Frage: Wie kann man eine eigene Unit Hash mit System.Hash zusammen benutzen?

In dem man in den Projektoptionen die Unit-Gültigkeitsbereichsnamen löscht.

Das kann allerdings wieder zu anderen Problemen führen. Wenn z.B. deine Unit Hash die System-Unit SysUtils verwendet, dann muss diese als System.SysUtils ausgeschrieben werden, da sie ohne die besagten Gültigkeitsbereichsnamen sonst nicht gefunden wird. Das kann übrigens auch für andere Bibliotheken gelten, die diese Gültigkeitsbereichsnamen voraussetzen.

jaenicke 16. Sep 2016 10:41

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Solche sehr allgemeinen Unitnamen sind eben ungünstig.

Einzige Möglichkeit wäre den Namespace System im Projekt zu entfernen. Aber erstens geht das auch nur manuell und ist bei jedem Projekt notwendig und zweitens macht es in der Regel keinen Sinn. Da ist die Umbenennung der Unit einfacher.

Benedikt Magnus 16. Sep 2016 11:02

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Und wenn du die Unit nur für die entsprechend betroffenen Versionen umbenennst? Oder eine Legacy Version anbietest?

gammatester 16. Sep 2016 11:44

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1347810)
In dem man in den Projektoptionen die Unit-Gültigkeitsbereichsnamen löscht.

Heißt das, daß in dem Project dann alle Namespace-Prefixes nicht mehr verwendet werden (können), außer System also auch VCL, Winapi etc?

Zitat:

Zitat von Uwe Raabe (Beitrag 1347810)
Wenn z.B. deine Unit Hash die System-Unit SysUtils verwendet, dann muss diese als System.SysUtils ausgeschrieben werden, da sie ohne die besagten Gültigkeitsbereichsnamen sonst nicht gefunden wird.

Das sollte kein Problem sein, da mein Hash nur eine eigene Unit BTypes benutzt (für Typdefinitionen), BTypes selbst beutzt keine anderen Units.

Luckie 16. Sep 2016 12:02

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Bei eigenen Units setze ich imme rmeinen Kürzel vor den Namen. In diesem Fall wäre das dann MPHash. Dann sehe ich schon am Namen, das sich den Code in der Unit verbrochen habe.

Uwe Raabe 16. Sep 2016 12:03

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von gammatester (Beitrag 1347826)
Heißt das, daß in dem Project dann alle Namespace-Prefixes nicht mehr verwendet werden (können), außer System also auch VCL, Winapi etc?

Natürlich kann man auch nur System rausnehmen, aber das wird im Falle eines Konflikts (s.u.) auch nicht gehen.

Zitat:

Zitat von gammatester (Beitrag 1347826)
Das sollte kein Problem sein, da mein Hash nur eine eigene Unit BTypes benutzt (für Typdefinitionen), BTypes selbst beutzt keine anderen Units.

Das kann aber für andere Bibliotheken, die der Anwender verwendet, trotzdem relevant sein. Es gibt einige Libraries, die intern nur die alten Unitnamen (z.B. SysUtils) verwenden, um den Sourcecode kompatibel mit älteren Delphi-Versionen zu halten. Die Verwendung von Units einer solchen Library erfordert aber zwingend den Einsatz von Gültigkeitsbereichsnamen.

Wenn deine Unit nun diesen Einsatz (und sei es nur für System) verbietet, gibt es eine Kollision.

Um das Problem dauerhaft und ohne Klimbzüge des Anwenders aus der Welt zu schaffen, plädiere ich daher für die Umbenennung deiner Unit. Du kannst ja die Compilierfähigkeit der alten Projekte durch einen geeigneten Unit-Alias wieder herstellen.

BUG 16. Sep 2016 12:18

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von Luckie (Beitrag 1347830)
Bei eigenen Units setze ich imme rmeinen Kürzel vor den Namen. In diesem Fall wäre das dann MPHash.

Könnte auch Multi-Processing Hash heißen :angel2:

gammatester 16. Sep 2016 12:37

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1347831)
Um das Problem dauerhaft und ohne Klimbzüge des Anwenders aus der Welt zu schaffen, plädiere ich daher für die Umbenennung deiner Unit. Du kannst ja die Compilierfähigkeit der alten Projekte durch einen geeigneten Unit-Alias wieder herstellen.

Für Delphi mag das ja möglich sein (zB in .cfg), aber ich wüßte nicht, daß FreePascal und Virtualpascal Unit-Alias unterstützen. Im übrigen geht es ja nicht darum, daß ich nicht compilieren kann, sondern meine User.

Weiterhin weiß ich nicht, was die neuen Delphis machen, wenn man

/AHash=MyHash

verwendet, würde da nicht das gleiche Problem auftauchen?

Luckie 16. Sep 2016 12:44

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von BUG (Beitrag 1347838)
Zitat:

Zitat von Luckie (Beitrag 1347830)
Bei eigenen Units setze ich imme rmeinen Kürzel vor den Namen. In diesem Fall wäre das dann MPHash.

Könnte auch Multi-Processing Hash heißen :angel2:

Ok. OK. OK. Dann eben PuffHash. Was fällt dir dazu ein? :roll:

himitsu 16. Sep 2016 12:52

AW: Units mit gleichem Namen (System.Hash und Hash)
 
* Suchpfade änndern, in der Reihenfolge. Hash zuerst finden lassen und dann System.Hash
* "System"-Namespace aus den Projektoptionen entfernen und überall explizit System.Hash aufrufen, wo das gemeint ist

oder

* Hash.pas umbenennen


Ich mache bei allen meinen Units auch immer einen Namespace davor (jetzt mit Punkt und früher per CamelCase oder mit _)














PuffHasch.pas ... das Haschisch, wat man nur im gut sortierten Puff-Shop findet, neben den heißen Damen

gammatester 16. Sep 2016 13:00

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von himitsu (Beitrag 1347844)
* Suchpfade änndern, in der Reihenfolge. Hash zuerst finden lassen und dann System.Hash

Wenn dann doch wohl umgekehrt oder? So wie ich es in meinen ersten Beitrag angedeutet hatte, mit

Delphi-Quellcode:
uses system.hash, hash, ...;

Uwe Raabe 16. Sep 2016 13:02

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von gammatester (Beitrag 1347842)
Weiterhin weiß ich nicht, was die neuen Delphis machen, wenn man

/AHash=MyHash

verwendet, würde da nicht das gleiche Problem auftauchen?

Das sollte ja nur für die alten Projekte gelten, in denen es keine System.Hash gibt. Für neuere Projekte bzw. Projekte neuerer Delphi-Versionen sollte man natrülich imemr den korrekten Namen MyHash verwenden.

Ich meine, was willst du machen? Du hast eine Unit mit einem Namen, der sich mit dem einer System-Unit in neueren Delphi-Versionen beisst. Es ist ja kaum anzunehmen, daß das seitens Delphi geändert wird, also musst du schon selbst die nötigen Schritte vornehmen, aus diesem Dilemma zu entkommen. So ganz ohne Federn zu lassen wird das nicht gehen.

bra 16. Sep 2016 13:10

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von gammatester (Beitrag 1347847)
Zitat:

Zitat von himitsu (Beitrag 1347844)
* Suchpfade änndern, in der Reihenfolge. Hash zuerst finden lassen und dann System.Hash

Wenn dann doch wohl umgekehrt oder? So wie ich es in meinen ersten Beitrag angedeutet hatte, mit

Delphi-Quellcode:
uses system.hash, hash, ...;

Delphi verwendet die uses zuerst, die weiter hinten stehen. Eigentlich unlogisch und unsinnig, ist aber so.

http://www.delphibasics.co.uk/RTL.asp?Name=Uses

Zitat:

The order of the units in the list is important. Those later in the list take precedence over the earlier ones.

himitsu 16. Sep 2016 13:19

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Delphi bindet das zuerst ein, was vorne steht,

aber es sucht von hinten, also immer erst von der Nächsten zur entferntesten Deklaration :zwinker: ... ist doch sinnig, oder?


Und ich meinte nicht die Uses, sondern die Suchpfade.

Damit beim Suchen nach "Hash" zuerst "Hash" und dann System.Hash gefunden würde.
Die Suche nach Hash oder DieVordefiniertenNamespaces.Hash finden dann zuerst Hash und eben nicht System.Hash :stupid:




Die Reihenfolge in der Uses-Klausel hat einen kleinen Einfluss auf die Initialisierungsreihenfolge der Units und auf
Delphi-Quellcode:
uses AnsiStrings, SysUtils;

AnsiSameStr = SysUtils.AnsiSameStr
Delphi-Quellcode:
uses SysUtils, AnsiStrings;

AnsiSameStr = AnsiStrings.AnsiSameStr

gammatester 16. Sep 2016 13:45

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1347848)
Für neuere Projekte bzw. Projekte neuerer Delphi-Versionen sollte man natrülich imemr den korrekten Namen MyHash verwenden.

Und genau daß ist das Problem! Ich denke, daß die Unit in vielmehr FPC/VP Programmen (zB PeaZip) verwendet wird als in Delphi XE8+. Und gerade die brechen bei Namensänderung zusammen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1347848)
Ich meine, was willst du machen? Du hast eine Unit mit einem Namen, der sich mit dem einer System-Unit in neueren Delphi-Versionen beisst. Es ist ja kaum anzunehmen, daß das seitens Delphi geändert wird, also musst du schon selbst die nötigen Schritte vornehmen, aus diesem Dilemma zu entkommen. So ganz ohne Federn zu lassen wird das nicht gehen.

Richtig, den ersten Bericht habe ich zB frech so beantwortet, daß sich der User doch bei EMBA beschweren soll. Mir ist selbst klar. daß das unrealistisch ist.

Die Tendenz ist allerdings: Sollen die XE8+ User doch selbst die Namens-Änderung vornehmen.

Und natürlich: Uwe, vielen Dank für Deine fachlich hervorragenden Vorschläge.

BUG 16. Sep 2016 14:12

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Zitat:

Zitat von Luckie (Beitrag 1347843)
Dann eben PuffHash. Was fällt dir dazu ein? :roll:

Könnte der Name einer Hashfunktion sein/werden :tongue:
War auch nicht ganz erst gemeint. Wenn man es wirklich eindeutig machen will, muss man eh registrierbare eindeutige Namen nehmen (wie Domainnamen in Java).

gammatester 11. Mai 2017 21:00

AW: Units mit gleichem Namen (System.Hash und Hash)
 
Info: Der Bug ist gefixt in Embarcadero® Delphi 10.2 Version 25.0.26309.314, vgl. https://edn.embarcadero.com/print/44747 link auf RSP-15827

Selbst getestet.
Gruß Gammatester


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