AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Integer-Aufzählungstyp deklarieren

Ein Thema von MatthiasR · begonnen am 24. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 09:15
Gibt es eine Möglichkeit, in Delphi einen eigenen Typ zu deklarieren, der nur aus einer bestimmten Menge aus Integerwerten besteht? Also so in der Art:
type TMyType = (1, 5, 48, 1337, 4711); Und wenn ich mir dann von diesem Typ eine Variable erzeuge und der dann zur Laufzeit einen andren Wert zuweisen möchte (bspw: 123), dass ich dann eine Exception bekomme? So in der Art hatte ichs schon probiert:
type TMyType = (myValue1 = 1, myValue2 = 5, myValue3 = 48, myValue4 = 1337, myValue5 = 4711); Danach dann die Bereichsüberprüfung von Delphi angeschaltet mit {$R+}, aber zur Laufzeit ging das trotzdem noch:
Delphi-Quellcode:
var
  myType: TMyType;
  // ...

procedure blabla;
begin
  myType := TMyType(123);
end;
Und danach hat die Variable myType wirklich auf ein nicht vorhandenes Element mit Index 123 gezeigt.
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
463 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 09:53
Hallo,

ich bin mir da nicht sicher, aber vieleicht sollte man das mit const machen, also eine Konstante verwenden. Meines Wissens lassen sich Konstanten nicht ändern. Ob dann auf ein nicht vorhandenes Array der Zugriff erlaubt ist weis ich auch nicht. Mußt halt mal probieren.

Notfalls könntest dus auch mit ner Krücke machen, also nicht so elegant aber mit sicherheit funktionierts. Also die Werte mit trennzeichen in einen WideString schreiben und per pos suchen etwa so:

Delphi-Quellcode:
var ws:widestring;
..
.
ws:='-'+inttostr(myint1)+'-'+inttostr(myint2)+'-'+inttostr(myint3)'-'+
.
..
if pos('-'+suchstring+'-')>0 then blabla else blabla

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#3

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 10:40
Wie meinst du das mit der Konstante? Und was meinst du mit dem Array? Ich verwende hier doch überhaupt kein Array.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 10:52
Wie wärs mit ner Klasse.

Das ist sicherlich ausbaufähig:
Delphi-Quellcode:
type TIntArray=array of integer;
type MyIntegerException=class(Exception);
type TMyInteger=class
       constructor Create(values:array of integer);
       destructor Destroy; override;
      private
       FAllowedValues:TIntArray;
       FValue:Integer;
       procedure setvalue(newValue:integer);
       procedure setAllowedValues(newvalues:TIntArray);
       function inside(value:integer):boolean;
      public
        property AllowedValues:TIntArray read FAllowedValues write setAllowedValues;
        property Value:Integer read FValue write setvalue;
        class function Array2IntArray(values:array of integer):TIntarray;
end;
Delphi-Quellcode:
constructor TmyInteger.Create(values:array of integer);
begin
  inherited create;
  FValue:=0;
  Allowedvalues:=Array2IntArray(values);
end;
destructor TmyInteger.Destroy;
begin
  finalize(FAllowedValues);
  inherited;
end;
function TMyInteger.inside(value:integer):boolean;
var i:integer;
begin
  result:=false;
  for i:=0 to high(FAllowedvalues) do begin
    result:=result or (Fallowedvalues[i]=value);
    if result then break;
  end;
end;
procedure TMyInteger.setAllowedValues(newvalues:TIntArray);
begin
  FallowedValues:=copy(newvalues);
  if (not inside(FValue))and(length(FAllowedValues)>0)
   then Fvalue:=FAllowedValues[0];

end;
procedure TmyInteger.setvalue(newValue:integer);
begin
  if inside(newvalue) then FValue:=newvalue
  else raise MyIntegerException.CreateFmt('%d ist kein %s-Typ!',[newvalue,self.ClassName]);
end;
class function TmyInteger.array2IntArray(values:array of integer):TIntArray;
var i:integer;
begin
  setlength(result,length(values));
  for i:=0 to high(values) do result[i]:=values[i];
end;
Anwendung:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var int:tmyinteger;
begin
  int:=tmyinteger.Create([1,2,3,4]);
  try
    int.Value:=3;

    //int.Value:=5;

    int.AllowedValues:=int.Array2IntArray([10,20,30]);
    int.Value:=10;
    int.Value:=int.value+2;

  finally
    int.free;
  end;

end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
463 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 11:30
Ich hoffe ich hab das Problem richtig begriffen.

du definierst hier einen Type=(1,2,3,4)

damit hast du ja schon ein array und zwar mit 1,2,3,4 oder sehe ich da was falsch...

unter Pascal=Delphi gibt es doch neben
var a:string;
auch
const a:string='Hallo';
und const können nicht verändert werden

wenn man also den schnippsel
Delphi-Quellcode:
var
  myType: TMyType;
  // ...
hier also das ganze so einbindet

const maytype:Tmytype=(12,123,145,210) dann können die werte nicht geändert werden.

aber wie gesagt du mußt es ausprobieren, bin mir nicht sicher ob das funzt


@sirius: Ist das Bilden einer Klasse nicht ein größerer Aufwand und wesentlich mehr Text?
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 12:07
Zitat:
@sirius: Ist das Bilden einer Klasse nicht ein größerer Aufwand und wesentlich mehr Text?
War ja nur ne Idee. Wenn du was einfacheres hast.....nur zu
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 12:43
Hallo,

noch ein Vorschlag:

Delphi-Quellcode:
// uses TypInfo

type
  TMyType = (vNAN, v1, v5, v48, v1337, v4711);

function IntToMyType (aValue: Integer): TMyType;
begin
  aValue := GetEnumValue(TypeInfo(TMyType), 'v' + IntToStr(aValue));
  if (aValue >= 0) then
    Result := TMyType(aValue)
  else
    Result := vNAN;
end;

function MyTypeToInt (aValue: TMyType): Integer;
var
  s : string;
begin
  s := GetEnumName(TypeInfo(TMyType), Ord(aValue));
  Result := StrToIntDef(Copy(s, 2, MaxInt), -1);
end;

// Anwendung

var
  myValue : TMyType;
  intValue : Integer;
begin
  myValue := IntToMyType(48);
  myValue := IntToMyType(100);

  intValue := MyTypeToInt(v1337);
  intValue := MyTypeToInt(vNAN);
end;
Es sollte aber klar sein, daß solche Operationen eine Laufzeitverschlechterung mit sich bringen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#8

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 12:56
Erstmal danke für eure Bemühungen!

Die gebrachten Ansätze sind aber für meinen Zweck zu komplex. Das qäre quasi mit Kanonen auf Spatzen geschossen. Aber nun weiß ich zumindest, dass es so eine Möglichkeit, wie ich sie gesucht habe, wohl nicht gibt. Dann belasse ich wohl bei meiner Möglichkeit mit
type TMyType = (myValue1 = 1, myValue2 = 5, myValue3 = 48, myValue4 = 1337, myValue5 = 4711) und überprüfe anschließend per Hand, ob die Werte auch wirklich erlaubt sind.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Integer-Aufzählungstyp deklarieren

  Alt 24. Apr 2007, 23:16
Das Problem oben in deinem Code ist ausschliesslich, dass du mit TMyType(123); einen harten Typecast machst und damit die Typprüfung von Delphi explizit umgehst bzw. aussen vorlässt. Wenn du aber dem Typ etwas zuweisen willst, was in der Definitionsliste deines Enums nicht auftaucht, dann erscheint auch eine entsprechende Compilermeldung.

Deine Zuweisung sagt Delphi: "Schreib mit da 123 in die Variable - mir egal, dass es der Typ ist". Wenn du aber zur Laufzeit eine so wie vorne zugewiesene Variable zuweist auf einen anderen vom Typ TMyType, dann wird nur der Inhalt kopiert bzw. zugewiesen und keine Typprüfung durchgeführt...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 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