![]() |
Trick um "überkreuzenden Bezug" von Units zu umgeh
kennt irgendjemand eine clevere Möglichkeit um nicht Haufen Umwege gehen zu müssen ?
Ich habe zwei Objecte in zwei verschiedenen Units. Und will von jedem Object einen Zeiger auf das andere Object speichern können. in Unit1:
Code:
in Unit2:
TClass1 = class
p : TClass2; end;
Code:
dummerweise muss ich nun in Unit2 die Unit1 in den Uses Klauseln einfügen und umgekehrt.
TClass2 = class
p : TClass1; end; Dummerweise kommt ja nun die Meldung "Überkreuzender Bezug zweier Units" HAb schon einige ZEit gegrübelt, kann man das irgendwie über eine dritte Unit umgehen ? Forward Deklarationen ? mir is noch keine Lösung eingefallen ? will nich immer mit:
Code:
arbeiten .. ständig die Zeiger beim programmieren zu typisieren macht auch keine Laune !
TClass2 = class
p : TObject; end; Dankeschön ! |
Re: Trick um "überkreuzenden Bezug" von Units zu u
es kommt zwar drauf an was du genau machen möchtest. Aber mit einer 3ten Unit würde das schon gehen.
In Unit 1 und Unit2 jeweils ein uses auf Unit3 in Unit 3 ein Uses auf Unit1 und Unit2. Nun in dieser Unit die beiden Variablen deklarieren: var p1 : TClass1; var p2 : TClass2; Nun kannst du in Unit1 das Object p2 verwenden und in Unit2 das Object p1 (erzeugen nicht vergessen :) ) vielleicht hab ich dich auch ganz falsch verstanden... |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Das müsste auch gehen, wenn du z.B. in Unit1 die andere direkt in die Uses einfügst und in Unit2 nach implementation nochmal uses Unit1; schreibst :wink:
|
Re: Trick um "überkreuzenden Bezug" von Units zu u
²jfheins: Das wird vermutlich nicht gehen, da die Klassendeklarationen (in denen man den Bezug auf die jeweils andere Unit ja schon benötigt) wohl im Interface-Teil stehen werden..
:arrow: Ohne Globale Variablen *pfui* oder der TObject-Methode, die Du selbst schon angesprochen hast, siehts imho schlecht für Dich aus! Gruß Stephan :dance: |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Moin Stoxx,
oder Du musst beide in einer Unit deklarieren.
Delphi-Quellcode:
type
TClass1 = class; TClass2 = class F2 : TClass1; end; TClass1 = class F1 : TClass2; end; |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Hallo An Alle,
@Maa83 .. da geht natürlich nicht, da man dort ja wieder den überkreuzenden bezug von Unit1/Unit3 und umgekehrt hat. @jfheins .. ich brauch ja aber die Unit1 schon im interface Teil, das is ja gerade der Witz ;-) @Christian .. so hab ichs nun auch gemacht. Dennoch kann ich ein Gesamtes Programm nich in einer Unit unterbringen ;-) is auf Dauer halt sehr sehr schlecht ... aber scheint wohl doch nicht zu gehen. habe D7 .. Ist das mit Delphi 8 / Delphi9 möglich sowas ? |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Zitat:
Weil man den Überblick verlieren könnte, wo sie in welcher Unit geändert werden könnten oder was? Echt neugierig! mfg |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Nunja, ganz kurz und knapp gesagt: Mangelnde Übersichtlichkeit, mangelnde Kontrolle ( :!: z.B. muss der Programmierer wissen, wann die Variable welche Werte annehmen kann, von wo aus sie geändert werden kann etc.); häufig ist damit eine unnötige Belegung von Speicherplatz verbunden; und vor allem widerspricht das allgemein der Idee des OOP, und innerhalb der OOP wiederum widersprächen (wenn sie denn generell mit oop vereinbar wären :mrgreen: ) globale Variablen dem Geheimnisprinzip... Hinzu können Namenskonflikte kommen
Wie gesagt, Kurzfassung :mrgreen: Gruß Stephan :dance: |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Zitat:
Bei schwacher Kopplung wäre das Observer-Visitor Design Pattern interessant: ![]() ![]() Oder eher umgekehrt: das Observer Pattern führt zu einer schwachen Kopplung zwischen den Objekten. |
Re: Trick um "überkreuzenden Bezug" von Units zu u
Ist auch mit einem Zeiger lösbar:
Unit1.pas:
Delphi-Quellcode:
interface
uses Unit2; TClass1 = class i: Integer; p: TClass2; end; Unit2.pas:
Delphi-Quellcode:
interface
TClass2 = class p: Pointer; end; implementation uses Unit1; procedure foo(); begin TClass1(p).i := 17; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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-2025 by Thomas Breitkreuz