Autor Beitrag
daniel-kun
Hält's aus hier
Beiträge: 2

Gentoo GNU/Linux
Delphi 5
BeitragVerfasst: Di 22.07.03 09:46 
Hallo,

Bisher habe ich das Problem von überkreuzenden Units meist
irgendwie umschiffen können. Sei es durch Forwad-Declarations oder
ähnlich (eher unschöne) Methoden.
Allerdings habe ich im Moment ein Problem, bei dem ich keinen Weg finde,
wie ich die Abhängigkeiten ohne Überkreuzung abbilden kann.
Folgende Situation:

Ich habe zwei Dialoge, die einander aufrufen können.
Dialog1 Ist eine Liste. Dialog2 ist der Inhalt des markierten Elements
in der Liste von Dialog1. (Der Sinn dieser Geschichte ist in der vereinfachten
Situation weniger erkennbar... aber es ist nötig, dies so zu machen).
Dialog1 kann allleine stehend angezeigt werden. Wird allerdings ein
Button in Dialog1 geklickt, öffnet sich Dialog2. Das selbe gilt für diesen:
Es ist ein Button, um Dialog1 zu öffnen, vorhanden.

Das Problem entsteht allerdings erst aus diesem Umstand:
Da beide Dialoge mehrmals instanziiert werden können, kann ich die
global deklarierten Variablen der Klassen nicht nutzen. Stattdessen muss
Dialog1 einen Member vom Typ Dialog2 haben und umgekehrt.
Und hier tritt das Problem auf....
Der Code müßte quasi so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Unit Dialog1;
uses Dialog2;
type
   Dialog1 = class(TForm)
       ...
       MyDialog2: TDialog2
   end;
implementation
...

//////////////////////////////

Unit Dialog2;
uses Dialog1;
type
   Dialog2 = class(TForm)
       ...
       MyDialog1: TDialog1
    end;
implementation
...

Kann mir jemand helfen, aus dieser Zwickmühle raus zu kommen?

Danke, Daniel

_________________
eat(this); // delicious suicide
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 22.07.03 10:58 
Hallo,

wie soll denn das funtionieren? Wen du den jeweiligen Kind Dialog Dynamisch erzeugst dann hast du eine Endlos Rekursion.
Denn Dialog1 erzeugt Dialog2 erzeugt Dialog1 erzeugt Dialog2...

Wenn es nur verwese sind, dann solltest du Referenzen in einer dritten Unit anlegen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit uTypeRef;
USES
  uDialog1, uDialog2; // Du kannst nicht Unit und Klasse gleich nennen ;)
TYPE
  D1 = class(Dialog1)
  end;
  D2 = class(Dialog2)
  end;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Unit uDialog1; 
uses uTypeRef; 
type 
   Dialog1 = class(TForm) 
       ... 
       MyDialog2: D2; 
   end; 
implementation 
...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Unit uDialog2; 
uses uTypeRef; 
type 
   Dialog2 = class(TForm) 
       ... 
       MyDialog1: D1;
    end; 
implementation 
...


Aber das gesamtdesign des ganzen kommt mir Spanisch vor. Das riecht nach designfehler. Also deke wirklich noch mal drüber nach, ob das son sinvol ist, denn auch bei Referenzzen mus ja jeder Dioalog eine Refferenz haben, welche eine Refferenz hat, welche eine Referenz hat. Das ganze kannst du nur Mit Nil unterbrechen oder einen Ring bilden.

Gruß
Klabautermann
daniel-kun Threadstarter
Hält's aus hier
Beiträge: 2

Gentoo GNU/Linux
Delphi 5
BeitragVerfasst: Di 22.07.03 11:40 
Klabautermann hat folgendes geschrieben:

wie soll denn das funtionieren? Wen du den jeweiligen Kind Dialog Dynamisch erzeugst dann hast du eine Endlos Rekursion.

Hier wollte ich eigentlich spontan antworten: "Das habe ich ja garnicht vor"...
allerdings musste ich dann feststellen, dass ich meinen Fehler wirklich erst
bei den auftretenden Symptomen bemerkt haette. :)
Naja, aber hier kann ich eine Eigenschaft machen, die ich mit nil initialisiere
und, wenn ich sie benutze, konstruiere -- nur, falls sie nil ist.
So haette ich nicht im ctor schon die Rekursion.
Zitat:

Wenn es nur Verweise sind, dann solltest du Referenzen in einer dritten Unit anlegen:

Was meinst du genau mit "Verweise"?

Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit uTypeRef;
USES
  uDialog1, uDialog2;
TYPE
  D1 = class(Dialog1)
  end;
  D2 = class(Dialog2)
  end;

Das hatte ich auch schon versucht. Allerdings habe ich da auch einen
Fehler bezueligch ueberkreuzender Units erhalten.
uDialog1 nutzt uTypeRef, uDialog2 nutzt uTypeRef und uTypeRef benutzt
wiederum beide Units. Ich denke, das mag Pascal/Delphi nicht.

Zitat:
Aber das gesamtdesign des ganzen kommt mir Spanisch vor.

Wie gesagt ist in dem Vereinfachten Beispiel der Sinn nicht ganz klar....
Zitat:

Das riecht nach designfehler.

Wir reden von GUI Programmierung -- das ist per Definition ein Designfehler. :)
Aber Spass bei Seite: Es muss leider so aussehen. Es ist eine stark
Datenbezogene Problematik, wo Rekursion im Design vorgesehen ist.

cu, Daniel

P.S.: Huebsch -- Ich hatte das Delphi-Tag garnicht gesehen.

_________________
eat(this); // delicious suicide