Autor |
Beitrag |
trm
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Mo 01.12.14 21:16
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
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Stundenplan
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: 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
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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 .. 3] of TFelder = (('bibo2eintrag',1,1,True),(),(),()); |
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Stundenplan
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: 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 .. 3] of TFelder = ((FA: 'bibo2eintrag'; FB: 1; FC: 1; FD: True),(),(),()); |
Für diesen Beitrag haben gedankt: trm, Xion
|
|
trm
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Mo 01.12.14 22:28
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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).
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|