AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Trick um "überkreuzenden Bezug" von Units zu umgehen ?
Thema durchsuchen
Ansicht
Themen-Optionen

Trick um "überkreuzenden Bezug" von Units zu umgehen ?

Offene Frage von "dartrax"
Ein Thema von stoxx · begonnen am 5. Okt 2004 · letzter Beitrag vom 8. Mai 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 7. Okt 2004, 12:42
Genau das will er ja nicht machen.

Imho ist die einzige saubere Lösung der Umweg über eine 3. Unit die nur die Deklaraktionen enthält.
Zitat von stoxx:
da geht natürlich nicht, da man dort ja wieder den überkreuzenden bezug von Unit1/Unit3 und umgekehrt hat.
Das stimmt nicht, da du aus Unit3 die anderen beiden ja garnicht zu referenzieren brauchst.
Delphi-Quellcode:
unit Unit3;
.
.
type
  TClass2 = class;
  TClass1 = class
    p: TClass2;
  end;
  TClass2 = class
    p: TClass1;
  end;
Delphi-Quellcode:
unit Unit1;

uses Unit3...
Delphi-Quellcode:
unit Unit2;

uses Unit3...
und fertig
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#12

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 7. Okt 2004, 23:37
Hi dizzy,

es bleibt dabei, dass ich halt in Unit3 alle Implementationen integrieren muss. Von beiden Objecten.
Und das is halt nich schön..
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 8. Okt 2004, 00:59
Also ich halte das eigentlich für besonders schön, da man dadurch sehr nett modularisiert. Wenn du auf einmal einen der Typen in einer weiteren Unit brauchst, reicht es die deklarierende Unit einzubinden, und du kommst nie in die Verlegenheit von Kreuzbezügen. Ich habe mir mittlerweile angewöhnt jede Klasse in eine eigene Unit zu packen bzw. sehr eng verwandte. Das eigentliche Programm hingegen enthält nur die Klassendefinition "TForm1", alles weitere wird "ge-used".
Bin damit bisher sehr gut gefahren, und die Übersichtlichkeit gewinnt zudem .

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
dartrax

Registriert seit: 10. Nov 2004
26 Beiträge
 
#14

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 30. Apr 2005, 10:49
Zitat von dizzy:
Genau das will er ja nicht machen.

Imho ist die einzige saubere Lösung der Umweg über eine 3. Unit die nur die Deklaraktionen enthält.
Zitat von stoxx:
da geht natürlich nicht, da man dort ja wieder den überkreuzenden bezug von Unit1/Unit3 und umgekehrt hat.
Das stimmt nicht, da du aus Unit3 die anderen beiden ja garnicht zu referenzieren brauchst.
Aber dann stehen doch im Interface-Teil der Unit3 die gesamten Eigenschaften und Methoden der Klassen, im Implementation-Teil werden die Methoden jedoch nicht realisiert? Sondern im Implementation-Teil der Units jeweiligen Klassen? Dann kommt bei mir der "Ungenügende Forward- oder External-Deklaration: ..."-Fehler. Wenn ich im Implementationteil der Unit3 noch mal ein Uses auf die anderen Units setze, ist dieser Fehler behoben, aber die anderen Klassen kennen ihre (von Unit3 "entführte") Klassendeklaration nicht mehr! Obwohl ich im Interface-Teil auf die Unit3 verweise! (Ich weiß nicht, ob der Fehler daher rührt oder schon vorher existierte)

Vielleicht kann einer noch mal ein Beispiel posten. Ich habe zwei Klassen, in deren Interface-Teil muss jede auf die jeweils andere verweisen. Methoden gibt's natürlich auch. Die Implementation soll in eigenen Units erfolgen.

Benutze Delphi 7.

Vielen Dank,
dartrax
Meine Homepage: www.dartrax.de
  Mit Zitat antworten Zitat
rantanplan99
(Gast)

n/a Beiträge
 
#15

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 30. Apr 2005, 11:18
Du könntest das mit einem Interface lösen. In einem Interface werden nur die Funktionen und Properties definiert. keine Implementierung davon. Deine Klassen TClass1 und TClass2 erweitern das Interface nur, bzw. müssen die im Interface deklarierten Funktionen implementieren. Schau die das mit den Interfaces in der Online-Hilfe an.

Grobes Gerüst:

Unit3:
Delphi-Quellcode:
IClass1 = interface
  Procedure Proc1(parameter...);
  Procedure Proc2(parameter..);
end;

IClass2 = Interface
  Procedure TueWas(parameter..);
  Procedure TueWasAnderes(..);
end;
In Unit1 dann:
Delphi-Quellcode:
uses Unit3;

TClass1 = class(TObject, IClass1)
  p2: IClass2;
  Procedure Proc1(parameter...);
  Procedure Proc2(parameter..);
end;

impelementation

Procedure TClass1.Proc1(paramemeter...);
begin

end;

...
In Unit2 dann analog zur Unit1:
Delphi-Quellcode:
uses Unit3;

TClass2 = class(TObject, IClass2)
  p2: IClass1;
  Procedure TueWas(parameter..);
  Procedure TueWasAnderes(..);
end;

impelementation

Procedure TClass2.TueWas(paramemeter..);
begin

end;

...

Ich denke so in etwa müsste das funktionieren, bin mir allerdings nicht ganz sicher. In Unit3 brauchst du keine implementierung zu den Funktionen schreiben. Habe das nicht ausprobiert. Schau halt in der Hilfe nach wie genau das geht.

rantanplan
  Mit Zitat antworten Zitat
n0b0dy@home

Registriert seit: 1. Jan 2003
7 Beiträge
 
#16

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 30. Apr 2005, 12:18
die antwort von rantanplan99 ist am sinnvollsten, da unit3 nur die interfaces bestimmt.

wenn du die beiden klassen benutzen moechtest, wuerde ich dir empfehlen, nur ueber die schnittstelle auf die objekte zuzugreifen. innerhalb der objekte geht ja ohnehin nichts mehr anderes.

warum muss eigentlich ein kreuzbezug zwischen den beiden klassen bestehen?
  Mit Zitat antworten Zitat
Benutzerbild von BenBE
BenBE

Registriert seit: 3. Apr 2005
Ort: Jahnsdorf
48 Beiträge
 
Delphi 5 Enterprise
 
#17

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 2. Mai 2005, 12:01
Einfachste und sauberste Lösung:

Forward-Deklaration von TClass2
Deklaration von TClass1
Deklaration von TClass2

Alles in eine Unit packen.

Anders geht's nicht!
Benny Baumann
Je komplexer das System, desto kleiner die Fehler; je kleiner die Fehler, desto häufiger ihr Auftreten!
  Mit Zitat antworten Zitat
n0b0dy@home

Registriert seit: 1. Jan 2003
7 Beiträge
 
#18

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 3. Mai 2005, 20:27
naja, das ganze laesst aber auf einen design-fehler schliessen, wenn ich einen kreuzbezug erzeuge. es wuerde mich schon interessieren, warum er hier von noeten ist.
  Mit Zitat antworten Zitat
Benutzerbild von BenBE
BenBE

Registriert seit: 3. Apr 2005
Ort: Jahnsdorf
48 Beiträge
 
Delphi 5 Enterprise
 
#19

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 3. Mai 2005, 22:55
Dann wär die VCL ein einziger Designfehler: Dort wird in TControl bereits auf TWinControl verwiesen, und ähnliches.

Forward-Deklarationen sind von daher gesehen in vielen Situationen sogar seh nützlich.

@Möglicher Designfehler: Probleme bei der Hierarchie der Komponentenvererbungen, d.h. keine eindeutigen Vererbungen und Datenflüsse.
Benny Baumann
Je komplexer das System, desto kleiner die Fehler; je kleiner die Fehler, desto häufiger ihr Auftreten!
  Mit Zitat antworten Zitat
n0b0dy@home

Registriert seit: 1. Jan 2003
7 Beiträge
 
#20

Re: Trick um "überkreuzenden Bezug" von Units zu u

  Alt 4. Mai 2005, 18:19
innerhalb einer unit ist es in ordnung. dass war ja auch dein loesungsvorschlag. er hat aber einen kreuzbezug zweier units. das wuerde mich interessieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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