Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units (https://www.delphipraxis.net/134494-frage-zu-loesungsmoeglichkeiten-bei-kreuzverweis-von-units.html)

Synollus 23. Mai 2009 09:36


Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Hallo,

ich habe 2 Klassen die auf sich selbst verweisen:

Delphi-Quellcode:
unit uKnot;

interface

uses uEdge;

type
  TKnot = class(TObject)
  private
    Next: TKnot;
    Edge: TEdge;
    Data: String;
    ....
  public
    ...
  end;
Delphi-Quellcode:
unit uEdge;

interface

uses uKnot;

type
  TEdge = class(TObject)
  private
    ToAd : TKnot;
    Next : TEdge;
    Weight: Integer;
  public
    ...
  end;
Ich habe jetzt 2 Lösungsmöglichkeiten gefunden.

1.: Alles in eine Unit:

Delphi-Quellcode:
unit uKnotEdge;

interface

type
  TKnot = class(TObject)
  private
    Next: TKnot;
    Edge: TEdge; // [Fehler] uKnotEdge.pas(9): Undefinierter Bezeichner: 'TEdge'
    Data: String;
    ...
  public
    ...
  end;

  TEdge = class(TObject)
  private
    ToAd : TKnot;
    Next : TEdge;
    Weight: Integer;
  public
    ...
  end;

implementation

...
Er erkennt (bei dem Kommentar) TEdge nicht, weil es erst später in der Unit kommt. Tausche ich die beiden Klassen, habe ich dasselbe Problem in Grün mit TKnot.

2.: Eine 3. Unit. Das habe ich noch nicht verstanden. Ich habe einiges rumprobiert, was ich in anderen Threads gelesen habe, aber ich habe das nicht so richtig verstanden. Könnte das einer für mich mal mit meinem Beispiel andeuten? :)

mkinzler 23. Mai 2009 09:37

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
So sollte es funktionieren
Delphi-Quellcode:
unit uKnotEdge;

interface

type

  TEdge = class;

  TKnot = class(TObject)
  private
    Next: TKnot;
    Edge: TEdge; // [Fehler] uKnotEdge.pas(9): Undefinierter Bezeichner: 'TEdge'
    Data: String;
    ...
  public
    ...
  end;

  TEdge = class(TObject)
  private
    ToAd : TKnot;
    Next : TEdge;
    Weight: Integer;
  public
    ...
  end;

implementation

...

Phoenix 23. Mai 2009 10:41

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Jupp, das ganze nennt sich dann 'Forward declaration'. Der Typ wird am Anfang der Unit bekannt gemacht - der Compiler weiss dann, dass es diesen Typen später geben wird und er nimmt den erstmal als bekannt hin.

Synollus 23. Mai 2009 10:45

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Ja, suppi. :) Das funktioniert sogar. :mrgreen:

Jetzt interessiert mich aber noch wie man das mit einer Extra-Unit machen kann. 2 Klassen in einer Unit, die ich in ihren Methoden eh immer durcheinander bringe, sind keine gute Idee. :lol:

mkinzler 23. Mai 2009 10:48

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Zitat:

Ja, suppi. Smile Das funktioniert sogar. Mr. Green
Es ist doch immer schön, dass einem die Benutzer vertrauen :stupid:

Phoenix 23. Mai 2009 11:11

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Zitat:

Zitat von Synollus
Jetzt interessiert mich aber noch wie man das mit einer Extra-Unit machen kann. 2 Klassen in einer Unit, die ich in ihren Methoden eh immer durcheinander bringe, sind keine gute Idee. :lol:

Das wird bei direkter gegenseitiger Referenzierung nicht gehen. Delphi hat nunmal einen single-pass compiler und das ist da technisch nicht möglich. Sorry.

jaenicke 23. Mai 2009 11:12

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Zitat:

Zitat von Synollus
Jetzt interessiert mich aber noch wie man das mit einer Extra-Unit machen kann. 2 Klassen in einer Unit, die ich in ihren Methoden eh immer durcheinander bringe, sind keine gute Idee. :lol:

Dafür musst du eine der Referenzen als TObject deklarieren und dann bei Verwendung auf den konkreten Typ casten.

Oder du benutzt ein Interface, das in einer dritten Unit liegt und implementierst dieses durch die Klasse in der zweiten Unit. Die Unit mit der Deklaration des Interfaces kannst du in beide Units einbinden.

mimi 31. Mai 2009 23:23

Re: Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
 
Du könntest natürlich auch Include Dateien verwenden. Ist zwar nicht so schön, aber währe auch eine Lösung.
Somit könntest du alle Klassen-Header in einer Datei packen und den dazugehörigen Code in eine jeweilige Extra Datei.

In Lazarus gibt es den CodeExplorer sowas müsste Delphi glaube ich auch haben. Der ist Praktisch. In meinen Units ist immer sehr viel Los bzw. sind immer sehr viele Klassen und sowas drin. Aber der CodeExplorer ist hier eine Hilfe.


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