AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units

Offene Frage von "Synollus"
Ein Thema von Synollus · begonnen am 23. Mai 2009 · letzter Beitrag vom 1. Jun 2009
Antwort Antwort
Synollus

Registriert seit: 29. Dez 2008
49 Beiträge
 
#1

Frage zu Lösungsmöglichkeiten bei Kreuzverweis von Units

  Alt 23. Mai 2009, 10:36
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 23. Mai 2009, 10:37
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

...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#3

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

  Alt 23. Mai 2009, 11:41
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Synollus

Registriert seit: 29. Dez 2008
49 Beiträge
 
#4

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

  Alt 23. Mai 2009, 11:45
Ja, suppi. Das funktioniert sogar.

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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 23. Mai 2009, 11:48
Zitat:
Ja, suppi. Smile Das funktioniert sogar. Mr. Green
Es ist doch immer schön, dass einem die Benutzer vertrauen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#6

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

  Alt 23. Mai 2009, 12:11
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.
Das wird bei direkter gegenseitiger Referenzierung nicht gehen. Delphi hat nunmal einen single-pass compiler und das ist da technisch nicht möglich. Sorry.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 23. Mai 2009, 12:12
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.
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 1. Jun 2009, 00:23
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:48 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