Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Aufzählungstyp aus Operatoren (https://www.delphipraxis.net/171266-aufzaehlungstyp-aus-operatoren.html)

Mojito 29. Okt 2012 10:26

Aufzählungstyp aus Operatoren
 
Hallo Liebe Delphi-Freunde,

Ich bin recht neu in Delphi und habe eine Frage. Ich muss einen Aufzählungstyp definieren, der nur aus Operatoren besteht(+,-,/,*). Dazu habe ich Folgendes probiert:

type
TFrmSettings = class(TForm)
GroupBox2: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
SpnEdtTaskNumber: TSpinEdit;
RdGrpOperator: TRadioGroup;

type
TOperator= ('+','-','*','/');


Ich habe es auch ohne Anführungzeichen probiert. Leider bekomme ich die Fehlermeldung

[DCC Fehler] UParameters.pas(24): E2029 Bezeichner erwartet, aber String-Konstante gefunden

Gibt es vielleicht einen eigenen Typen für Operatoren? Oder habe ich was grundsätzliches Falsch gemacht?

Vielen Dank für eure Hilfe

DeddyH 29. Okt 2012 10:30

AW: Aufzählungstyp aus Operatoren
 
Wenn Du keine Stringvergleiche anstellen willst, kannst Du es so versuchen:
Delphi-Quellcode:
type
  TOperator = (opPlus, opMinus, opMultiply, opDivide);
Kommen doch String- bzw. Zeichenvergleiche ins Spiel, könnte man sich z.B. so behelfen:
Delphi-Quellcode:
const
  OPCHARS: array[TOperator] of char = ('+', '-', '*', '/');
[edit] P.S.: Sorry, Willkommen in der DP :dp: [/edit]

Mojito 29. Okt 2012 10:43

AW: Aufzählungstyp aus Operatoren
 
Danke für die schnelle Antwort DeddyH und freue mich Teil der Community zu sein!

Die Operatoren benötige ich für eine Funktion, die einen Operator zum Rechnen auswählt:

// gibt die Einstellung fuer den Operator zurueck
function TFrmSettings.getOperator:TOperator;
begin
getOperator:= RdGrpOperator.ItemIndex
end;


Bei deinem ersten Vorschlag erhalte ich dann jedoch bei dieser Funktion den Fehler, den ich auch nachvollziehen kann:

[DCC Fehler] UParameters.pas(87): E2010 Inkompatible Typen: 'TFrmSettings.TOperator' und 'Integer'

Hast du/ihr eine Idee wie es anders gehen könnte? DieFunktion muss vom Typ TOperator sein, wobei nicht näher beschrieben ist, was TOperator beinhalte muss, logisch wäre jedoch nur Operatoren. Da ItemIndex jedoch Zahlen zurückgibt kann das ja eigentlich nicht gehen..
Nochmals Vielen Dank

DeddyH 29. Okt 2012 10:49

AW: Aufzählungstyp aus Operatoren
 
Da die Indizes nicht selbst vergeben wurden, hat opPlus den Index 0, opMinus Index 1 etc. Stehen also Deine Radiobuttons (anhand der Bezeichner denke ich, um solche handelt es sich) in exakt der Reihenfolge, wie sie in der Enumeration deklariert wurden, könntest Du einfach einen harten Cast anwenden.
Delphi-Quellcode:
getOperator:= TOperator(RdGrpOperator.ItemIndex);
Ich hoffe, ich habe jetzt keinen Denkfehler gemacht, aber das sollte eigentlich funktionieren.

[edit] Zur Not kann man das aber auch als "Übersetzungsfunktion" realisieren:
Delphi-Quellcode:
case RdGrpOperator.ItemIndex of
  0:
    Result := opPlus;
  1:
    Result := opMinus;
  2:
    Result := opMultiply;
  3:
    Result := opDivide;
  else
    raise Exception.Create('Ungültiger Operator');
end;
[/edit]

Mojito 29. Okt 2012 11:03

AW: Aufzählungstyp aus Operatoren
 
Danke das hat geklappt!

Eine Frage dazu habe ich noch. Was genau steckt hinter opMultiply, opMinus, etc. ? Wieso geht das so aber nicht mit den eigentlichen Zeichen?

DeddyH 29. Okt 2012 12:06

AW: Aufzählungstyp aus Operatoren
 
Die eigentlichen Zeichen sind ja bereits Operatoren und somit nicht als Bezeichner zugelassen, das ist im Prinzip der ganze Grund.

[edit] Außerdem habe ich vergessen zu erwähnen: Ein Bezeichner muss mit einem Buchstaben oder dem Unterstrich (_) beginnen. Von daher scheiden die Operatoren automatisch aus. [/edit]

nuclearping 29. Okt 2012 12:48

AW: Aufzählungstyp aus Operatoren
 
Zitat:

Zitat von Mojito (Beitrag 1188876)
Danke das hat geklappt!

Was anderes: Wenn du Quellcode postest, verpacke diesen bitte in Delphi-Tags:

[ delphi ]...[ /delphi ] (ohne Leerzeichen)

->

Delphi-Quellcode:
procedure Test;
begin
  WriteLn('Hallo Welt');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 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