Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Überkreuzender Bezug zweier Units auf main


Marco D. - Di 23.01.07 20:01
Titel: Überkreuzender Bezug zweier Units auf main
Ich habe in main einen Typ definiert:

Delphi-Quelltext
1:
TVisibility = (viPrivate, viPublic, viProtected);                    

Dieser wird in der Unit ObjectMethod benötigt.
Darum steht main in der uses-Liste von ObjectMethod:

Delphi-Quelltext
1:
uses Parameterlist,main,Objectclass;                    

Da ich aber in main mit der Klasse aus ObjectMethod arbeiten will, ist ObjectMethod in der uses-Liste von main eingetragen:

Delphi-Quelltext
1:
2:
3:
uses
  //Own Units
  ... ObjectMethod ...

Nun meint Delphi aber folgendes:
Error hat folgendes geschrieben:
[Fataler Fehler] main.pas(7): Überkreuzender Bezug zweier Units auf 'main'

Was kann ich dagegen tun?


Jann1k - Di 23.01.07 20:06

Definier die Klasse in tVisibility im zweiten Formular, wenn das Konzeptmäßig geht.


Marco D. - Di 23.01.07 20:09

user profile iconJann1k hat folgendes geschrieben:
Definier die Klasse in tVisibility im zweiten Formular, wenn das Konzeptmäßig geht.

Ok, also:
- TVisibility ist ein Typ -> aber das ist auch egal ;)
- es brauchen noch mehr Units TVisibility, deswegen wollte ich es an einer zentralen Stelle haben.
- ist es ein Problem, wenn ich TVisibility in mehreren Units gleich definiere?


Jann1k - Di 23.01.07 20:14

Zitat:

Ok, also:
- TVisibility ist ein Typ -> aber das ist auch egal
- es brauchen noch mehr Units TVisibility, deswegen wollte ich es an einer zentralen Stelle haben.
- ist es ein Problem, wenn ich TVisibility in mehreren Units gleich definiere?


Ganz ehrlich, ich hab keine Ahnung was der Unterschied zwischen Typ und Klasse ist, werd ich mich wenn ich später wieder da bin mal informieren.

Ob es ein Problem darstellt dieselbe Klasse in mehreren Units gleich zu definieren, kann ich dir nicht sicher sagen, so wie ich Delphi kenne, wird es ein Problem damit haben.

Spricht etwas dagegen eine eigene Unit für TVisibility zu erstellen?


Marco D. - Di 23.01.07 20:17

user profile iconJann1k hat folgendes geschrieben:

Ganz ehrlich, ich hab keine Ahnung was der Unterschied zwischen Typ und Klasse ist, werd ich mich wenn ich später wieder da bin mal informieren.

Ja mach das. ;)
user profile iconJann1k hat folgendes geschrieben:

Ob es ein Problem darstellt dieselbe Klasse in mehreren Units gleich zu definieren, kann ich dir nicht sicher sagen, so wie ich Delphi kenne, wird es ein Problem damit haben.

Es muss aber eine einfachere Lösung geben!
user profile iconJann1k hat folgendes geschrieben:

Spricht etwas dagegen eine eigene Unit für TVisibility zu erstellen?

Ja tut es: Warum soll ich für eine Typdeklaration eine eigene Unit erstellen? Das ist imho überflüssig!


Christian S. - Di 23.01.07 20:48

Hallo!

Brauchst Du in einer der Units die jeweils andere nur im implementation- und nicht schon im interface-Teil? Dann kannst Du die uses-Klauses dorthin verlagern, das sollte den überkreuzenden Bezug auflösen.

Grüße
Christian


Marco D. - Di 23.01.07 20:56

user profile iconChristian S. hat folgendes geschrieben:
Hallo!

Brauchst Du in einer der Units die jeweils andere nur im implementation- und nicht schon im interface-Teil? Dann kannst Du die uses-Klauses dorthin verlagern, das sollte den überkreuzenden Bezug auflösen.

Grüße
Christian

Habe jetzt auf Hinweis BenBe's doch eine zusätzlich Unit genommen. ;)
Was ist denn der Unterschied zwischen den beiden uses-Listen?


Christian S. - Di 23.01.07 21:16

Lies Dir in der Delphi-Sprachreferenz (in der Hilfe enthalten) einfach mal den entsprechenden Abschnitt unterhalb von "Programme und Units" durch. :-)


Marco D. - So 28.01.07 19:27

Habe wieder das Problem.
Ich brauche aber beide Units jeweils im Interface der anderen, ich kann sie nicht unter implementation schieben!
Was tun?
Da muss es doch eine Lösung für geben!


Kroko - So 28.01.07 19:40

(a) mache eine Unit daraus
(b) lagere den Teil, den du benötigst in eine 3.Unit aus
(c) ???


Marco D. - So 28.01.07 19:46

user profile iconKroko hat folgendes geschrieben:
(a) mache eine Unit daraus
(b) lagere den Teil, den du benötigst in eine 3.Unit aus
(c) ???

Habe jetzt eine draus gemacht.
Nächstes Problem:
Klasse B ist sozusagen unter Klasse A deklariert.
Klasse A soll eine Instanz von Klasse B enthalten Diese ist aber erst unten deklariert -> Undefinierter Bezeichner!
Man könnte die ja einfach vertauschen! Aber: Klasse B soll auch eine Instanz von Klasse A enthalten. Dann tritt der gleiche Fehler auf, nur umgekehrt.
BenBe meinte was von Forward-Deklaration, aber das geht lauf DOH nur bei Methoden. :roll: Was tun?


Christian S. - So 28.01.07 20:30

user profile iconMarco D. hat folgendes geschrieben:
Was tun?
Ein bisschen Experimentierfreude zeigen oder im Crashkurs nachschauen ;-)
http://www.christian-stelzmann.de/artikel/crashkurs.htm#forwarding