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 Zirkuläre Unit Reference (https://www.delphipraxis.net/81293-zirkulaere-unit-reference.html)

Koolance 24. Nov 2006 08:50


Zirkuläre Unit Reference
 
Hi,
ich schreibe gerade einen Quellcodegenerator der aus einer Datenbank eine Mittelschicht erzeugt (oder besser die Grundlage dafür).
Für jede Klasse wird eine eigene Unit erzeugt.

Beispiel für mein Problem.

Tabellen
Adresse------<Matchcode
Eine Adresse hat N Matchcodes. Ein Matchcode aber immer nur eine Adresse.

Lösung für die Zwischenschicht
Adresse.Liste_Matchcodes.Matchcode (in Adresse wird in der uses Liste_Matchcodes verwendet, in der uses von List_Matchodes Matchcode)
Matchcode.Adresse (in Matchcode wird in der uses Adresse Verwendet)

Probleme
Ich will die oben beschrieben Funktionalität, aber nicht alle Klassen in eine Unit schreiben.
Die Uses müssen im Interface-Bereich stehen da ich die Objekte als Klassenvariablen verwende.

Lösungsansätze

http://www.delphipraxis.net/internal...rkul%E4re+unit
Zitat:

Zudem kann man die Typdeklaration in eine Dritte Unit auslagern, die dann beide nutzen.
Habe mir eine Unit declarations erstellt alles in sie eingebunden und sie in meinen Klassen verwendet, das klappt aber überhaupt nicht.


http://www.delphipraxis.net/internal...rkul%E4re+unit
Zitat:

bei einem von beiden muss die Uses-Klausel dann in den implementation-Teil...allerdings kannst du dann die Klassendeklaration nicht mehr verwenden

ich glaube du kannst eine Art "Vordeklaration" machen, indem nur nur bekanntgibst, das es so eine Klasse gibt (type Elternklasse = class;) ohne eine richtige Deklaration, und dann die wirkliche Deklaration erst im implementation-Teil via uses includes....

bin mir aber nicht sicher...
Klingt gut, habe aber leider nichts dazu gefunden.

mkinzler 24. Nov 2006 08:53

Re: Zirkuläre Unit Reference
 
Zitat:

Klingt gut, habe aber leider nichts dazu gefunden.
Wurde doch beschrieben: Einfach

Delphi-Quellcode:
type TKlassenNamen = class;
und später richtig deklarieren.

Koolance 24. Nov 2006 09:06

Re: Zirkuläre Unit Reference
 
So einfach das klingt ich mache es wohl falsch.
Beispiele

Delphi-Quellcode:
unit ADDRESS;

interface
uses
  Classes, DBXpress, SqlExpr, db, SysUtils ,base,sqlparser,
  datastructs;

type list_ADD_MATCHCODE = class;
type


//***********************
//****Kopf Basisklasse***
//***********************
  TADDRESS = class(TBase)

....

implementation
uses list_ADD_MATCHCODE;
Fehlermeldung: Typ list_ADD_MATCHCODE ist nicht vollständig definiert.

Delphi-Quellcode:
unit ADDRESS;

interface
uses
  Classes, DBXpress, SqlExpr, db, SysUtils ,base,sqlparser,
  datastructs;


type
type list_ADD_MATCHCODE = class;

//***********************
//****Kopf Basisklasse***
//***********************
  TADDRESS = class(TBase)
....

implementation
uses list_ADD_MATCHCODE;
Fehlermeldungen:
Bezeichner erwartet aber Type gefunden.
Typ list_ADD_MATCHCODE ist nicht vollständig definiert.

[edit=SirThornberry]Zitat-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

SirThornberry 24. Nov 2006 09:09

Re: Zirkuläre Unit Reference
 
Heißt deine Unit genauso wie der Typ? :gruebel:

Verwendet TAddress die Klasse list_ADD_MATCHCODE oder warum muss list_ADD_MATCHCODE vorher definiert werden?
Ich glaub mit einer dritten Unit wäre das lösbar.

Koolance 24. Nov 2006 09:13

Re: Zirkuläre Unit Reference
 
Delphi-Quellcode:
unit ADDRESS;

interface
uses
  Classes, DBXpress, SqlExpr, db, SysUtils ,base,sqlparser,
  datastructs;


type
Tlist_ADD_MATCHCODE = class;

//***********************
//****Kopf Basisklasse***
//***********************
  TADDRESS = class(TBase)
....

implementation
uses list_ADD_MATCHCODE;
Klappt auch nicht sieht aber richtiger aus.

Unitname: list_ADD_MATCHCODE
Typname: Tlist_ADD_MATCHCODE

SirThornberry 24. Nov 2006 09:15

Re: Zirkuläre Unit Reference
 
Ja, klappen wird das so nicht. Die Declaration muss vollständig im Interfaceteil abgeschlossen werden.

Koolance 24. Nov 2006 09:20

Re: Zirkuläre Unit Reference
 
Dann wäre es ja so richtig:
Delphi-Quellcode:
unit ADDRESS;

interface
uses
  Classes, DBXpress, SqlExpr, db, SysUtils ,base,sqlparser,
  datastructs;

type Tlist_ADD_MATCHCODE = class;
type


//*********************** 
//****Kopf Basisklasse*** 
//*********************** 
  TADDRESS = class(TBase)
....

implementation
uses list_ADD_MATCHCODE;
Bringt aber die Fehlermeldung: Typ list_ADD_MATCHCODE ist nicht vollständig definiert.

xaromz 24. Nov 2006 09:36

Re: Zirkuläre Unit Reference
 
Hallo,

der Ansatz in Beitrag #3 war schon richtig. Du darfst aber nicht Folgendes machen:
Delphi-Quellcode:
type
  TClass1 = class;

type
  TClass2 = class(TObject)
    FClass1: TClass1;
  end;

  TClass1 = class(TObject)
    FClass2: TClass2;
  end;
sondern Folgendes:
Delphi-Quellcode:
type
  TClass1 = class;

  TClass2 = class(TObject)
    FClass1: TClass1;
  end;

  TClass1 = class(TObject)
    FClass2: TClass2;
  end;
Beachte: Es gibt nur eine Deklaration (ein "type").

Gruß
xaromz

Koolance 24. Nov 2006 09:47

Re: Zirkuläre Unit Reference
 
Das entspricht meinem Beitrag 5, funktioniert aber leider auch nicht.

Aber ich weiß jetzt warum, ich hatte bei der deklaration vergessen das alle Klassen von TBase abgeleitet sind. Habe es gerade geändert und es funktioniert.

Delphi-Quellcode:
unit ADDRESS;

interface
uses
  Classes, DBXpress, SqlExpr, db, SysUtils ,base,sqlparser,
  datastructs;


type
Tlist_ADD_MATCHCODE = class(TBASE);

//*********************** 
//****Kopf Basisklasse*** 
//*********************** 
  TADDRESS = class(TBase)
....

implementation
uses list_ADD_MATCHCODE;
Vielen Dank euch allen

Muetze1 24. Nov 2006 09:51

Re: Zirkuläre Unit Reference
 
Zitat:

Zitat von Koolance
Das entspricht meinem Beitrag 5, funktioniert aber leider auch nicht.

Hinweis: Unter Umständen kann es passieren, dass Delphi die Klassen-Forward Deklarationen nicht anerkennt, wenn die Deklaration der Klasse entgegen der Forward Deklaration mit einem neuen Type eingeleitet wurde.


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