Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Units überkreuzen (https://www.delphipraxis.net/110271-units-ueberkreuzen.html)

Christian18 15. Mär 2008 21:22


Units überkreuzen
 
Hallo,

bisher habe ich immer gedacht, dass man zwei Units nicht überkreuzen kann. Heute wurde ich eines besseren belehrt.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;

...
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit1;
--> So kannte ich es bisher immer. Das funktioniert auch nicht. Es kommt folgende Meldung:
[Pascal Fataler Fehler] Unit1.pas(7): F2047 Zirkuläre Unit-Referenz auf 'Unit1'

Wenn ich es aber so mache, dann funktioniert es:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

end.
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

end.
Meine Frage ist nun, ob das ein Bug in Delphi ist oder steckt das vieleicht auch ein sinn dahinter?

Warum gehte es nicht wenn ich die Unit oben einbinde und wenn ich es unten mache, dann geht es?!?!?!

Das verwirrt mich jetzt ein bisschen...

Wer kann meine dunklen stellen ein bisschen beleuchten?

MFG Christian18

mkinzler 15. Mär 2008 21:25

Re: Units überkreuzen
 
So geht es zwar. Man sollte es aber vermeiden und gemeinsam Verwendetes in eine Unit auslagern, welche man dann in die anderen einbindet.

1234588 15. Mär 2008 21:29

Re: Units überkreuzen
 
hat soweit ich weiß mit der initialisierung der units zu tun. soll angeblich in einer endlosschleife ausarten. kann mich aber auch irren, bin mir da nicht sicher

Andy090778 16. Mär 2008 00:17

Re: Units überkreuzen
 
Die Antwort ist einfach:

Die Uses-Klausel im Abschnitt Interface sorgt dafür, dass in jeder anderen Unit überall alle Deklarationen der betreffenden Unit gültig sind. Erfolgt hier eine Überkreuzung, würde dies zu einer Endlosschleife führen.

Im Abschnitt Implemenatation gilt dies nur für den darin liegenden Code - und die Funktionen darin haben keine Typdeklaration von außen...

Corpsman 16. Mär 2008 08:48

Re: Units überkreuzen
 
Man kann diese überkreuzenden Units aber immer ausbauen.

Selbst wenn du Klassenmethoden hast die Varaiblentypen aufrufen die sich dann überkreuzen würden.

Ist mir daletzt passiert.

Du bindest die Unit dann unterhalb von Implementation ein und machst nur Pointer mit Type casts ( Unschön )

besser ist aber mkinzlers vorschlag das entsprechend in nur eine Unit aus zu lagern.


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