Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Typendeklaration, Constanten und Belegung der Felder


trm - Mo 01.12.14 21:16
Titel: Typendeklaration, Constanten und Belegung der Felder
Huhu.

ich habe mal wieder eine eigenartige Knackwurst, die ich nicht durchbekomme.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  THead = record
    A: String;
    B: Integer;
    C: Boolean;
  end;

type
  TFelder = record
    FA: String;
    FB: Byte;
    FC: Integer;
    FD: Boolean;
  end;

type
  TDBStruktur = record
    Head: THead;
    Felder: array of TFelder;
  end;


Das ist die Typenzuweisung (und JA, es sind im Moment einfach nur TEST-Bezeichner).

Im Folgenden möchte ich die Felder als Constanten festlegen, der Kopf wird zur Laufzeit jedoch erst generiert.

Wenn ich nun versuche Felder[0] .. Felder[n] vorzubelegen, kommt immer wieder eine Fehlermeldung.


Delphi-Quelltext
1:
2:
Const
 FeldNamen_version:TDBStruktur=( ??? ) ;


Wie sieht so eine Zuweisung denn korrekt aus? Ist das überhaupt möglich, dass ein Teil eines Type-Records variabel und ein anderer Teil als Constante definiert/angesprochen wird?

LG Mathias


Stundenplan - Mo 01.12.14 21:37

Du könntest Zuweisbare typisierte Konstanten (Compilerswitch {$J+}) verwenden. Den Head könntest du mit Dummy-Daten in der Konstante deklarieren und zur Laufzeit neu zuweisen.
Sauberer wäre es sicher, das Felder-Array als Konstante zu haben und zur Laufzeit eine TDBStruktur mit den konstanten Feldern und dem frischen Head zu belegen.


trm - Mo 01.12.14 21:54

Danke, das hatte ich mir auch schon überlegt.

Mein Problem ist, dass der Compiler mir nicht erlaubt die Constanten zu definieren:



Delphi-Quelltext
1:
2:
3:
4:
5:
[dcc32 Fehler] UnitConstanten.pas(36): E2029 ')' erwartet, aber String-Konstante gefunden

Const
  FeldNamen_version: array [0 .. 3of TFelder =
    (('bibo2eintrag',1,1,True),(),(),());


Stundenplan - Mo 01.12.14 22:06

Du musst den Namen des Recordfeldes, das du belegen möchtest, dazu schreiben, in etwa so:

Delphi-Quelltext
1:
2:
3:
Const
  FeldNamen_version: array [0 .. 3of TFelder =
    ((FA: 'bibo2eintrag'; FB: 1; FC: 1; FD: True),(),(),());


trm - Mo 01.12.14 22:28

user profile iconStundenplan hat folgendes geschrieben Zum zitierten Posting springen:
Du musst den Namen des Recordfeldes, das du belegen möchtest, dazu schreiben, in etwa so:

Delphi-Quelltext
1:
2:
3:
Const
  FeldNamen_version: array [0 .. 3of TFelder =
    ((FA: 'bibo2eintrag'; FB: 1; FC: 1; FD: True),(),(),());


So ein Quatsch. Das habe ich noch nie gesehen.

Herzlichen Dank!


Xion - Mo 01.12.14 22:28

Normalerweise bin ich auch für schlanke Records, aber in diesem Fall: Wieso benutzt du keine Klasse? Dort kannst du im Constructor alles anlegen, wie du es möchtest. Wenn du dann alle properites nur als read definierst, dann sind sie auch konstant...mit der Option, später noch erweitert zu werden.

Der Sinn von Konstanten ist ja eigentlich nur, dass sie im Code gleich eincompiliert werden und daher etwas schneller sind (mal davon abgesehen, dass man ihnen nichts zuweisen kann, was mit der Klasse ja auch der Fall wäre).