Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Enumeration nach Delphi 5 geändert? (https://www.delphipraxis.net/153159-enumeration-nach-delphi-5-geaendert.html)

Bomberbb 23. Jul 2010 07:35

Delphi-Version: 2005

Enumeration nach Delphi 5 geändert?
 
Hallo,

ich möchte einen fremden Quelltext mit Delphi 5 kompilieren. Da meckert der Compiler folgendes an:
Delphi-Quellcode:
 type
   TSuit = (Hearts=13, Diamonds, Clubs=22, Spades);
Es scheint so, als ob D5 mit den Zuweisungen nicht klar kommt. Ab welcher Version geht das? Und wie bekomme ich das unter D5 zu laufen?
p.s.: Es handelt hierbei um eine automatisch generierte Unit, die den Zugriff auf eine DLL ermöglicht.

Gruß

BBB

mkinzler 23. Jul 2010 07:44

AW: Enumeration nach Delphi 5 geändert?
 
Wie lautet die genaue Fehlermeldung?

fkerber 23. Jul 2010 07:47

AW: Enumeration nach Delphi 5 geändert?
 
Hi!

Redest du wirklich von D5 oder D2005 wir oben angegeben?


Liebe Grüße,
Frederic

Bomberbb 23. Jul 2010 07:49

AW: Enumeration nach Delphi 5 geändert?
 
Sorry, ist definitiv D5. Wir haben zwar die 2005 hier liegen, sie aber nie wirklich installiert...

Die Fehlermeldung ist:
[Fehler] UnitDll.pas(406): ',' oder ')' erwartet, aber '=' gefunden

DeddyH 23. Jul 2010 08:23

AW: Enumeration nach Delphi 5 geändert?
 
Wird denn irgendwo im Quelltext mit Ord() auf die zugewiesenen Werte zugegriffen? Ansonsten lass die Zuweisung doch testhalber ganz weg.

sx2008 23. Jul 2010 08:28

AW: Enumeration nach Delphi 5 geändert?
 
Zitat:

Zitat von Bomberbb (Beitrag 1036994)
Delphi-Quellcode:
 type
   TSuit = (Hearts=13, Diamonds, Clubs=22, Spades);

Bei Delphi 5 ist es leider nicht möglich, die Werte bei einem Aufzählungstyp vorzugeben.
Workaround:
Delphi-Quellcode:
const
 Hearts=13;
 Diamonds=14;
 Clubs=22;
 Spades=23;
type
   TSuit = Integer;
Das kann natürlich im Code weitere Änderungen nötig machen.

DeddyH 23. Jul 2010 08:43

AW: Enumeration nach Delphi 5 geändert?
 
Oder man schreibt sich 2 Mapping-Funktionen.
Delphi-Quellcode:
type
   TSuit = (Hearts, Diamonds, Clubs, Spades);

function OrdValue(Suit: TSuit): integer;
begin
  case Suit of
    Hearts:  Result := 13;
    Diamonds: Result := 14;
    Clubs:   Result := 22;
    else
      Result := 23;
  end;
end;

function SuitValue(Value: integer): TSuit;
begin
  case Value of
    0, 13: Result := Hearts;
    1, 14: Result := Diamonds;
    2, 22: Result := Clubs;
    else
      Result := Spades;
  end;
end;

himitsu 23. Jul 2010 09:19

AW: Enumeration nach Delphi 5 geändert?
 
oder
Delphi-Quellcode:
TSuit = (dummy0, dummy1, dummy2, dummy3, dummy4, dummy5, dummy6, dummy7,
  dummy8, dummy9, dummy10, dummy11, dummy12, Hearts, Diamonds, dummy15,
  dummy16, dummy17, dummy18, dummy19, dummy20, dummy21, Clubs, Spades);
@DeddyH: die 0..2 sind Falsch und auch der Else-Block ist nicht sicher, vorallem in SuitValue :warn:

Delphi-Quellcode:
function OrdValue(Suit: TSuit): integer;
begin
  case Suit of
    Hearts:  Result := 13;
    Diamonds: Result := 14;
    Clubs:   Result := 22;
    Spades   Result := 23;
    else     raise exception // oder notfalls 'nen defaultwert
  end;
end;

function SuitValue(Value: integer): TSuit;
begin
  case Value of
    13: Result := Hearts;
    14: Result := Diamonds;
    22: Result := Clubs;
    23: Result := Spades;
    else raise exception // oder notfalls 'nen defaultwert
  end;
end;
aber besser so:
Delphi-Quellcode:
function OrdValue(Suit: TSuit): integer;
begin
  Result := Byte(Suit);
end;

function SuitValue(Value: integer): TSuit;
begin
  Result := TSuit(Byte(Value));
  // eventuell auch Result := TSuit(Value);
end;

// Byte eventuell an die Datengröße anpassen (Word, LongWord, Integer, ...)

DeddyH 23. Jul 2010 09:28

AW: Enumeration nach Delphi 5 geändert?
 
Die 0..2 hatte ich deshalb mit drin, falls doch versehentlich der tatsächliche Ordinalwert und nicht der gemappte übergeben wird. Und Defaultwerte hab ich schließlich auch, alles, was nicht passt, wird zu Pik.

Bomberbb 23. Jul 2010 10:13

AW: Enumeration nach Delphi 5 geändert?
 
na, so ein mist. hab jetzt gedacht, ich installier mir fix D2005, aber das hat wohl probleme mit win7x64. Mal schauen, ob ich es irgendwann schaffe den quelltext zu kompilieren.

An diese definition
Code:
TSuit = (dummy0, dummy1, dummy2, dummy3, dummy4, dummy5, dummy6, dummy7,
  dummy8, dummy9, dummy10, dummy11, dummy12, Hearts, Diamonds, dummy15,
  dummy16, dummy17, dummy18, dummy19, dummy20, dummy21, Clubs, Spades);
hab ich auch schon gedacht, allerdings gibt es auch solche Definitionen in der Unit:

Code:
TPlatformid = (ePlfmNone = $00000000,ePlfmAll = $0001013F);
und spätestens da stehe ich dumm da...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz