Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi F2047 Zirkuläre Unit-Referenz ? (https://www.delphipraxis.net/124762-f2047-zirkulaere-unit-referenz.html)

daredd 24. Nov 2008 21:25


F2047 Zirkuläre Unit-Referenz ?
 
Kann mir einer sagen was der Compiler damit meint:

[DCC Fehler] NewClient.pas(7): F2047 Zirkuläre Unit-Referenz auf 'NewClient'


???
THX

s.h.a.r.k 24. Nov 2008 21:27

Re: F2047 Zirkuläre Unit-Referenz ?
 
du hast halt eine zirkuläre referenz. also... du hast 2 units. du referenzierst in der unit1 unter uses unit2 und in der unit2 in der uses-klausel die unit1, also wie folgt:
Delphi-Quellcode:
// das hier steht in der Unit1.pas
unit Unit1;

uses
  Unit2;

{ ... }

// das hier steht in der Unit2.pas

unit Unit2;

uses
  Unit1;
das darf nicht sein, warum sollte klar sein oder?! was soll der compiler denn machen?! was zuerst einbinden?!

mkinzler 24. Nov 2008 21:27

Re: F2047 Zirkuläre Unit-Referenz ?
 
Weil du Unit1 in Unit2 und umgekehrt einbindest. Entweder gemeinsames auslagern oder einmal im Interface und einmal in der Implementierung einbinden

oki 24. Nov 2008 21:30

Re: F2047 Zirkuläre Unit-Referenz ?
 
Solltest du in einer der Units auf Elemente der anderen Unit nur im Implementation-Teil zugreifen kannst du das Problem damit lösen, dass du diese Unit mit uses hinter implementation einbindest.

Noch alles klar?

Gruß oki

daredd 24. Nov 2008 21:32

Re: F2047 Zirkuläre Unit-Referenz ?
 
ah stimmt danke, hab das total vergessen! habe jetzt in der unit2 die unit1 unter implementations als uses, und es geht!

omata 24. Nov 2008 22:34

Re: F2047 Zirkuläre Unit-Referenz ?
 
Nur weil etwas geht ist es noch lange nicht sinnvoll.

Die Hinweise, die hier gegeben wurden sind zwar richtig, allerdings nicht sinnvoll.
Solche Zirkelschlüsse sind niemals nötig, wenn man so etwas braucht, hat man etwas grundlegendes falsch gemacht.

Sven M. 26. Nov 2008 07:57

Re: F2047 Zirkuläre Unit-Referenz ?
 
Könntest du da mal ein Beispiel nennen? Ich meine, ich habe zwar noch nie zirkulär referenziert, wüsste auch nicht, warum man das machen sollte. Interessieren würde mich aber trotzdem, warum man da was "grundlegendes falsch" gemacht hat...

Hawkeye219 26. Nov 2008 09:47

Re: F2047 Zirkuläre Unit-Referenz ?
 
Hallo Sven,

das Problem bei dieser Art der Programmierung ist, dass du ein undurchsichtiges Netz von Verknüpfungen erstellst, das nur sehr schlecht zu testen und zu warten ist. Das Ersetzen einer Unit ist unter Umständen mit Änderungen in mehreren anderen Units verbunden, wodurch sich neue Fehler einschleichen können.

Bei einer streng hierarchischen Struktur kann ein Test des Programms "von unten" erfolgen. Du fängst mit den Units an, die keine Abhängigkeiten besitzen. Nachdem diese Units getestet wurden, kannst du dich den Teilen zuwenden, die die getesteten Units referenzieren. Beim Netz mit zirkulären Referenzen weißt du von keiner Unit, ob sie tatsächlich korrekt arbeitet, weil du das Netz nur als Ganzes testen kannst.

Gruß Hawkeye

Sven M. 26. Nov 2008 10:48

Re: F2047 Zirkuläre Unit-Referenz ?
 
Hi Hawkeye,
das leuchtet ein. Besten Dank - wieder was gelernt!:)

hanspeter 26. Nov 2008 10:48

Re: F2047 Zirkuläre Unit-Referenz ?
 
Zitat:

Zitat von Sven M.
Könntest du da mal ein Beispiel nennen? Ich meine, ich habe zwar noch nie zirkulär referenziert, wüsste auch nicht, warum man das machen sollte. Interessieren würde mich aber trotzdem, warum man da was "grundlegendes falsch" gemacht hat...

Beispiel:

Ein Datasource für den Datenbankzugriff

Ein Datasource für Reportfunktionen.
Die Reportfunktionen benötigen Connection aus Datasource.

In Datasource wird lediglich ein Zeiger auf den Report declariert, also

Report : TReport;

Ziel ist es von der Datenbankschicht Initialisierungen im Reportteil vornehmen zu können.

Schon hat man ein zirkulären Bezug.

In Net (auch Oxygene) geht so etwas.
Die Ursache das das in Delphi nicht geht, ist der altmodische Einpasscompiler, der solche Bezüge nicht auflösen kann.

Gruß Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 Uhr.
Seite 1 von 3  1 23      

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