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

user profile icong1o2k4 hat folgendes geschrieben Zum zitierten Posting springen:
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.


BenBE - Do 25.12.08 20:05

Ich hab auf einen Hack angespielt, mit dem man ReadOnly-Properties schreiben kann, die direkt auf ein Feld verweisen. Siehe http://www.swissdelphicenter.ch/de/showcode.php?id=665


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

user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
Noch nie im Stehen gerannt? :mrgreen:

:lol:


alzaimar - Do 25.12.08 22:02

user profile icong1o2k4 hat folgendes geschrieben Zum zitierten Posting springen:
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.