Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Konstante Variablen zur Laufzeit erstellen
g1o2k4 - Do 25.12.08 01:54
Titel: Konstante Variablen zur Laufzeit erstellen
nabend
es geht um folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TData = record a: double; b: integer; c: char; end;
TKlasse = class private Werte: array of TData; public
published
end; |
ich möchte, dass der klassenbenutzer den inhalt des arrays Werte lesen, aber nicht überschreiben kann. nun ist das mit der übergabe von dynamischen arrays leider nicht so einfach. bzw der aufwand dafür scheint mir nicht gerechtfertigt.
besser fände ich, wenn man ein array was man nur lesen kann als puplic deklariert, in das man dann das Werte array reinkopiert.
kann man const variablen zur laufzeit deklarieren ? oder ist const nur dazu da, dass der compiler weiß, dass niemand darauf zugreifen kann ?
fällt vielleicht jemandem ne andere einfache lösung für die übergabe/das lesen des Werte arrays ein ?.
BenBE - Do 25.12.08 01:57
Zwei Wege:
1. Array über Read-Only-Property rausreichen
2. Array als Konstante deklarieren, über ein wenig Pointer-Fun initialisieren und dann diese Konstante weiterreichen ...
g1o2k4 - Do 25.12.08 02:53
zu read-only-property fällt mir jetzt nur sowas ein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ... TKlasse = class private Werte: array of TData; public property GetWerte: array of TData read Werte; published
end; |
meintest du das oder ist read-only-property was anderes ?
der code funktioniert nicht, d.h. der compiler meckert über das "array" nach ':' in der public section. falls das die read-only-property ist, kann ichs wohl vergessen.
BenBE - Do 25.12.08 02:59
Du kannst auch Array-Properties in Delphi deklarieren.
g1o2k4 - Do 25.12.08 03:07
aber damit kann ich doch nur immer ein element auslesen oder ?
ich brauche aber das gesamte array.
GTA-Place - Do 25.12.08 03:10
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TDataArray: Array of TData;
[...]
property Blup: TDataArray read Blap; |
T(d)ada :mrgreen:
Anmk.: Etwas mehr muss man noch tun. Entsprechende Setter und Getter könnten gebraucht werden.
g1o2k4 - Do 25.12.08 03:15
na toll. da sieht man wieder was delphi für eine explizite sprache ist...
genau den ansatz hatte ich mir als erstes gedacht und folgendes geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TAoData = array of TData;
TKlasse = class private Werte: array of TData;
public property GetWerte: TAoData read Werte; published constructor Create(); end; |
das klappte nicht, aber mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TAoData = array of TData;
TKlasse = class private Werte: TAoData;
public property GetWerte: TAoData read Werte; published constructor Create(); end; |
geht es logischerweise. 2 uhr nachts ist >>bei mir<< einfach nicht mehr die zeit, um auf solche kleinigkeiten zu achten.
thx für den denkanstoß, das hab ich gebraucht!
edit: get und set funktionen brauch ich nichtmal.
BenBE - Do 25.12.08 04:03
g1o2k4 hat folgendes geschrieben : |
edit: get und set funktionen brauch ich nichtmal. |
Dann kann man mit deinem Object die Daten aber ändern, weil man den Getter umgehen kann ;-)
g1o2k4 - Do 25.12.08 15:44
wie das ?
sollte ich dann besser folgendes machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| TAoData = array of TData;
TKlasse = class private Werte: TAoData; function GetWerte():TAoData; public property GetWerte: TAoData read GetWerte; published constructor Create(); end;
implementation ... function GetWerte():TAoData; begin result := Werte; end; |
oder das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| TAoData = array of TData;
TKlasse = class private Werte: TAoData; public function GetWerte():TAoData; published constructor Create(); end;
implementation ... function GetWerte():TAoData; begin result := Werte; end; |
wäre doch im prinzip dasselbe !? ich dachte propertys wären dazu gut um den zugriff direkt bereitszustellen bzw zu verhindern, ohne es noch in funktionen zu kapseln.
turboPASCAL - Do 25.12.08 21:24
"Konstante Variablen" Was 'sn dat ? :gruebel:
mkinzler - Do 25.12.08 21:28
Zitat: |
"Konstante Variablen" Was 'sn dat ? :gruebel: |
Noch nie im Stehen gerannt? :mrgreen:
turboPASCAL - Do 25.12.08 21:56
mkinzler hat folgendes geschrieben : |
Noch nie im Stehen gerannt? :mrgreen: |
:lol:
alzaimar - Do 25.12.08 22:02
g1o2k4 hat folgendes geschrieben : |
ich dachte propertys wären dazu gut um den zugriff direkt bereitszustellen bzw zu verhindern, ohne es noch in funktionen zu kapseln. |
Das Array kann auch nicht verändern, den Inhalt schon. Die Property liefert ja nur den Zeiger auf das Array, und dieser Zeiger kann nicht verändert werden.
Du kannst das dynamisch Array als Eigenschaft einer Klasse nicht 'read only' machen. Das bietet Delphi nicht. Du kannst nur den Zugriff auf die einzelnen Elemente eines Arrays über Array-Properties schützen. Dann kannst Du aber das dynamische Array in Gänze nicht als Read-Only Eigenschaft zur Verfügung stellen und erwarten, das die Elemente auch nicht verändert werden können.
Vielleicht geht es mit statischen Arrays.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!