Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Label-Array füllen


Mitmischer 1703 - Do 09.07.09 10:29
Titel: Label-Array füllen
Hi DF!

Folgendes hab ich in meiner Unit stehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  MainForm: TMainForm;

const Lbl_name : String = 'Lbl';
      ready : String = 'Fertig stellen';
      Labels : array of TLabel = [MainForm.Welcome, MainForm.Sys_Check,
                              MainForm.Setuptype, MainForm.Path, MainForm.Components,
                              MainForm.Summary, MainForm.Install, MainForm.Lbl_ready];


Doch Delphi sagt mir:

[DCC Fehler] Unit2.pas(53): E2001 Ordinaltyp erforderlich
[DCC Fehler] Unit2.pas(53): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(54): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(54): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(54): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(55): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(55): E2010 Inkompatible Typen: 'Integer' und 'TLabel'
[DCC Fehler] Unit2.pas(55): E2010 Inkompatible Typen: 'Integer' und 'TLabel'

Wieso brauch ich da einen Integer? Es ist doch ein Label-Array! Und wenn ich versuche es im FormCreate zu erzeugen,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Labels[0] := Welcome;
  Labels[1] := Sys_Check;
  Labels[2] := Setuptype;
  Labels[3] := Path;
  Labels[4] := Components;
  Labels[5] := Summary;
  Labels[6] := Install;
  Labels[7] := Lbl_ready;


krieg ich eine Zugriffsverletzung. Allerdings greife ich im FormCreate auch auf eine Komponente zu - was reibungslos funktioniert!

Help!!


Gausi - Do 09.07.09 10:39

Hallo,

Erstens sollten bei der Konstanten-Deklaration runde Klammern, nicht eckige. Zweitens bin ich mir grade nicht sicher, ob man da dynamische Arrays so deklarieren darf. :gruebel:
So sollte es klappen:

Delphi-Quelltext
1:
2:
3:
Labels : array[0..7of TLabel = (MainForm.Welcome, MainForm.Sys_Check,
                              MainForm.Setuptype, MainForm.Path, MainForm.Components,
                              MainForm.Summary, MainForm.Install, MainForm.Lbl_ready]);


Bei der zweiten Variante hast du wohl vergessen, die Länge des dynamischen Arrays vorher zu setzen. Dann sollte Labels aber afaik auch eine Variable sein, keine Konstante.

Delphi-Quelltext
1:
2:
SetLength(Labels, 8);
// ...


BenBE - Do 09.07.09 11:10

Man darf Konstanten zwar so deklarieren (allerdings nur für statische Größenangaben), muss dann aber auch konstante Ausdrücke als Werte angeben. Dies ist bei Membern des Forms nicht der Fall. Nimm lieber die zweite Variante der Initialisierung und setz mit SetLength die Größe richtig ...


Mitmischer 1703 - Do 09.07.09 11:14

Die Idee war, dass man jederzeit mit einer kurzen Änderung (Label dazu / weg) was ändern kann, ohne die Länge setzen zu müssen

Hmm... Bei der ersten Variante kommt dann

[DCC Fehler] Unit2.pas(55): E2026 Konstantenausdruck erwartet
[DCC Fehler] Unit2.pas(55): E2026 Konstantenausdruck erwartet
...

Bei der zweiten Variante klappts!