[Delphi] Enumerated type waarde ophalen

Pagina: 1
Acties:

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik ben een overzicht aan het maken voor verhuur van artikelen. Voor de grafische weergave komt er een soort Gant-diagram dat voor een aantal tijdsdelen van lengte t de aantallen uitgeleende artikelen weergeeft. De tijdsdelen hebben een vaste lengte die oploopt van 5 minuten tot 4 uur per blok welke ik heb gedefinieeerd als enumerated type. Daarbij heb ik ook direct het aantal seconden gedeclareert dat in zo'n tijdsdeel zit.

Delphi:
1
2
3
4
5
6
7
8
type
  TTimeScale = (ts5Minutes = 300,
    ts10Minutes = 600,
    ts15Minutes = 900,
    tsHalfOur   = 1800,
    tsHour      = 3600,
    ts2Hour     = 7200,
    ts4Hour     = 14400);


Het aantal seconden gebruik ik op een opgegeven start tijd af te ronden naar een factor van TTimeScale, dus als deze is ingesteld op tsHour en een tijd van 14:23 wordt gegeven, start het overzicht op 14:00h.

Ik loop echter tegen een probleem aan dat de functies om het volgende/vorige item op te halen. Als je geen waarde declareert kun je met Succ(timeScale) naar het volgende item en TTimeScale(2) geeft ts10Minutes. Met TTimescale zoals hierboven, timeScale = ts10Minutes en Succ wordt uitgevoerd dan zoekt Delphi naar index 601 wat niet bestaat.

Ik heb bijna alle links op de eerste 2 pagina's van google bekeken maar ik kom er ff niet uit. Ook met de TypInfo lukt het niet. Ik kan wel een constante array maken met de waarden maar dat vindt ik niet zo heel netjes. Hoe kan ik met de declaratie toch simpel de waarde op een gegeven index ophalen?

[ Voor 3% gewijzigd door FendtVario op 22-03-2005 14:48 . Reden: uitleg iets verbeterd ]

www.fendt.com | Nikon D7100 | PS5


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 04:01

Tomatoman

Fulltime prutser

Ik kan niet helemaal volgen wat je probleem nou precies is, maar volgens mij heeft het ermee te maken dat je de elementen van TTimeScale niet logisch gebruikt. Hoewel de typedeclaratie die jij doet niet fout is, maak je het jezelf onnodig moeilijk. Door expliciet ordinale waarden aan de elementen toe te kennen, gebruik je de elementen van TTimeScale eigenlijk alsof het constantes zijn. Je kunt beter TTimeScale declareren als een reeks elementen die bij 0 begint en het aantal seconden voor ieder element declareren in een aparte array.
Delphi:
1
2
3
4
5
6
7
type
  TTimeScale = (ts5Minutes, ts10Minutes, ts15Minuts, tsHalfHour, tsHour,
    ts2Hour, ts4Hour);

const
  ScaleUnits: array[ts5Minutes..ts4Hour] of Integer = (300, 600, 900, 1800,
    3600, 7200, 14400);

Een goede grap mag vrienden kosten.


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
De array had ik inmiddels gemaakt. Ik vond het juist wel handig dat ik uit de enumeration direct de waarde kon halen. De problemen met Dec, Succ en Inc kwam ik soort van bij toeval tegen bij het maken een een demo app. Er is dus niet een manier waarop ik maar een declaratie kan gebruiken voor enumeration en de waarden met behoudt van het gebruik van Dec etc?

www.fendt.com | Nikon D7100 | PS5


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 04:01

Tomatoman

Fulltime prutser

FendtVario schreef op dinsdag 22 maart 2005 @ 18:02:
Ik vond het juist wel handig dat ik uit de enumeration direct de waarde kon halen.
Dit is een prachtig voorbeeld van verkeerde 'handigheid'. Op het eerste gezicht lijkt het handig, maar je code wordt er uiteindelijk alleen maar ingewikkelder door, zoals je zelf al had gemerkt.
Er is dus niet een manier waarop ik maar een declaratie kan gebruiken voor enumeration en de waarden met behoudt van het gebruik van Dec etc?
Nee. Waarom zou je dat trouwens willen? Wat is er mis met constantes? Als je het aantal seconden wilt weten dat geassocieerd is met tsl5Minutes, typ je bij jouw definitie van TTimeScale:
Delphi:
1
  AantalSeconden := Ord(tsl5Minutes);
en bij mijn definitie van TTimeScale:
Delphi:
1
  AantalSeconden := ScaleUnits[tsl5Minutes];
Ik heb nou niet bepaald de indruk dat jouw code zo veel simpeler is.

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 09-05 23:44

alienfruit

the alien you never expected

Je zou misschien gebruik kunnen maken van de TypeInfo.pas (RTTI) unit, om je waarde te achterhalen.

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Zoals ik aal aangaf heb ik die optie geprobeert maar kwam daar niet uit. De constante array heb ik ook genoemd in mijn eeste post. Ik dacht sneller af te zijn met de combinatie maar helaas. Zoals tomatoman aangeeft een verkeerde 'handigheid'.

www.fendt.com | Nikon D7100 | PS5

Pagina: 1