Autor Beitrag
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Fr 20.08.10 19:58 
Hi alle zusammen,

hab mir mittlerweile zum dritten Male an meinem Projekt versucht und habe bisher keine Idee mehr.
Der Quelltext ist folgender (gekürzt):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
const
  right:Integer=0;
  up:Integer=1;
  left:Integer=2;
  down:Integer=3;

[..]

type

  [..]

  TArrow = class
  private
    PosX,PosY:Integer;
    Typ:Integer;
    Item:TBitMap;
  public
    constructor Create(const APath:String;ATyp:Integer);
    procedure Paint(APaintbox:TPaintbox;AEckeX,AEckeY:Integer);
  end;

[..]

constructor TArrow.Create(const APath:string;ATyp:Integer);
begin
  Typ:=ATyp;
  Item:=TBitMap.Create;
  Item.Width:=34;
  Item.Height:=32;
  case Typ of
  right:begin
      Item.LoadFromFile(APath+'Items\PfeilRechts.bmp');
      PosX:=593;
      PosY:=274;
    end;
  up:begin
      Item.LoadFromFile(APath+'Items\PfeilOben.bmp');
      PosX:=349;
      PosY:=100;
    end;
  left:begin
      Item.LoadFromFile(APath+'Items\PfeilLinks.bmp');
      PosX:=100;
      PosY:=275;
    end;
  down:begin
      Item.LoadFromFile(APath+'Items\PfeilUnten.bmp');
      PosX:=349;
      PosY:=446;
    end;
  end;
end;


mein Problem ist der Error: constant expression expected. Gilt nicht nur für das markierte "right", sondern auch für "up","left" und "down".

Sind die Konstanten nicht konstant genug?

Gruss, Lukas

EDIT: Umbennen der Konstanten hat auch nicht geklappt.

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 20.08.10 20:13 
Hi, wo soll Typ denn hinspringen wenn es keinen Wert besitzt, also weder 0 noch 3 ist

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 20.08.10 20:17 
Dann wird die Case-Struktur einfach nicht ausgeführt. ;) Das hier funktioniert zb ohne mussen und knurren des compilers:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  var a: integer;
begin
  a := 4;
  case a of
    1: Showmessage('a');
    2: Showmessage('b');
    3: Showmessage('c');
  end;
end;


So, zum fehler. Definiert Up, Down usw so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
RIGHT = 0;
UP = 1;
LEFT = 2;
DOWN = 3;


Grund ist der, weil du mit dem Integer dazwischen keine Konstanten im eigentlichen Sinn hast sondern typisierte Konstanten und diese kann man in Prozeduren verändern wie Variablen. ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.

Für diesen Beitrag haben gedankt: der organist
der organist Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Fr 20.08.10 20:28 
danke Elundril, das funzt. Man lern nie aus, auch bei simpelsten Dingen. An Alf, Typ wird ja gesetzt, durch die übergeben Variabel ATyp. Und die liegt garantiert [0..3]. ;)

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 20.08.10 20:43 
Historisch bedingt ist so ein const eher eine Variable mit Initialwert, bei der zur Compilezeit nicht erlaubt ist darauf zu schreiben. Zur Laufzeit unterscheiden sich die Dinger nicht von normalen Variablen. Wenn du das zu einem Pointer castest kannst du sehr wohl darauf schreiben. Da der Compiler keine Jumptabelle o.ä. daraus basteln kann und auch nicht doppelte Werte ausschliessen kann, lässt er dies nicht zu. Der Compiler kann case-Statements nur erstellen, wenn alles zur Compilezeit bekannt ist. Vielleicht unverständlich aber ist leider einfach so ;)

Wenn du das ":Integer" weglässt sollte es aber klappen. Das ist dann eine "richtige" Konstante ;)