Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Konstante oder Typenbezeichner erwartet Typ in ext. Units


marvin190 - Sa 02.05.15 19:21
Titel: Konstante oder Typenbezeichner erwartet Typ in ext. Units
Hallo zusammen,

ich bekomme vom Compiler einen E2007 Konstante oder Typenbezeichner erwartet Fehler. Leider kann ich mir keinen Reim darauf machen wieso, da der Name dort durchaus ein Typenbezeichner ist und die Unit, die diesen beinhaltet, im Interface Teil bei Uses steht. Mein Code:

uMieterverwaltung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
unit uMieterverwaltung;

interface

uses
  [viele Andere], uTypen;

type
  TFormMieterverwaltung = class(TForm)
    [...]
  private
    AktuellerMieter: Mietpartei;
    procedure UpdateTree;
    [...]
  public
    { Public-Deklarationen }
  end;

var
  FormMieterverwaltung: TFormMieterverwaltung;

implementation

uses
  [...];

{$R *.dfm}

[...]

procedure TFormMieterverwaltung.UpdateTree;
var
  [...]
  Häuserliste: Häuser;
begin
  [...]
end;

end.


uTypen.pas


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
unit uTypen;

interface

type
  Haus = record
  [...]
 end;

  Häuser = array of Haus;

  Mietpartei = record
  [...]
  end;

  [...]

implementation

end.


Was mache ich falsch? Die uTypen in das Implementation-Uses verschieben geht nicht, weil eine Methode ebenfalls einen dort definierten Typ zurückgibt.

Danke für Eure Hilfe!


platzwart - Sa 02.05.15 19:47

Anstatt dem "ä" bitte mal "ae" ausprobieren


marvin190 - So 03.05.15 08:56

Das hat leider keinen Effekt.


jaenicke - So 03.05.15 09:10

Kannst du vielleicht ein wenig mehr von dem Code posten?

Zumindest ein paar Zeilen vor und nach dem Fehler und die genaue Position, die nach dem Kompilieren als Fehler markiert wird, oder einen Screenshot von dem markierten Fehler.


marvin190 - So 03.05.15 09:44

Na klar, gar kein Problem, ich wollte es nur übersichtlich halten :)

Hier ist der Teil der uMieterverwaltung.pas, in der der Fehler auftritt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TFormMieterverwaltung.UpdateTree;
var
  Haus: TPair<Integer, TTreeNode>;
  Wohneinheiten: TDictionary<Integer, TTreeNode>;
  Wohneinheit: TPair<Integer, TTreeNode>;
  Häuserliste: Häuser;   // FEHLER HIER
  Wohneinheitenliste: Wohneinheiten;
  Mieterliste: Mietparteien;
  i:Integer;
begin
  // Tree, Hashmaps löschen, Init
  Tree.Items.Clear;
  [...]


Derselbe Fehler tritt übrigens auch eine Zeile später mit dem Typ "Wohneinheiten" auf.

Und hier die beiden Records, um die es geht, aus der uTypen.pas:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  [...]
  Haus = record
    Haus_ID: Integer;                  
    Name: String;               
    AnschriftZeile1: String;       
    AnschriftZeile2: String;       
  end;

  Häuser = array of Haus;            

  Wohneinheit = record
    Wohneinheit_ID: Integer;       
    Haus_ID: Integer;                 
    Bezeichnung: String;     
    Wohnfläche: Integer;            
  end;

  Wohneinheiten = array of Wohneinheit;
  [...]


icho2099 - So 03.05.15 09:57

Moin
Haus und Wohneinheit hast du erst als Type und dann nochmal als Variable,
Da fällt es dem Compiler schwer zu unterscheiden.


jaenicke - So 03.05.15 10:30

Deshalb ist es in Delphi auch schlechter Programmierstil Typen wie Klassen nicht mit T anfangen zu lassen. Sprich THaus, THäuser, ...
Dann passiert das auch nicht so leicht.

// EDIT:
Private Felder in Klassen sollten zum Beispiel mit F anfangen (für deine Records gilt das also nicht).

Für die Schreibweise von Delphi-Quelltext gibt es hier auch einen Styleguide, falls es dich interessiert: ;-)
http://edn.embarcadero.com/article/10280 (englisch)
http://www.delphi-treff.de/object-pascal/styleguide/ (deutsch)


marvin190 - So 03.05.15 11:18

Ich bin ja vielleicht blind -.- Natürlich sollte ich die Bezeichnung nicht zweimal verwenden ...

Danke an alle :)