Results 1 to 10 of 10

Thread: Enumeratie met gaten doorlopen middels (for)-loop

  1. #1
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Enumeratie met gaten doorlopen middels (for)-loop

    Goedenavond Dames en Heren,

    Hierbij een kort vraagje van deze kant, ik 'schaam' me bijna om het te vragen maar op dit moment geraak ik er even niet uit. (het lijkt erop alsof we een beetje 'leeg' zijn toe aan vacantie ofzo)

    Heeft iemand enig idee wat de makkelijkste manier is om een Enumeratie te doorlopen om elke item te kunnen doorgeven aan een andere methode. Ik dacht dat we aardig op weg waren met Low en High echter gaat dit niet helemaal goed als de enumeratie 'gaten' bevat.

    Hier een klein stukje vb code.
    Code:
    const
      csMyConstValueA = 10;
      csMyConstValueB = 20;
      csMyConstValueC = 30;
    
    type
      TMyEnum = (meValueA = csMyConstValueA,
                 meValueB = csMyConstValueB,
                 meValueC = csMyConstValueC);
    
    
    procedure Test;
    var
      enum: TMyEnum;
    begin
      for enum := Low(TMyEnum) to High(TMyEnum) do
      begin
        memo.Lines.Add(IntToStr(Ord(enum)));
      end;
    end;
    M.b.v. bovenstaande worden er 30 regels in de memo geschreven, dit terwijl ik had verwacht/gehoopt dat alleen de getallen 10, 20 en 30 in de memo zouden verschijnen.

    Ik heb nog even gekeken naar For In maar deze lijkt niet echt te werken, althans de compiler vindt dit niet valide voor een enumeratie.
    Iemand suggestie's / ideen om toch middels een simpel loopje alleen de drie waardes uit de enumeratie te halen.

    Alvast bedankt,
    RLD

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    vziw kan het niet.

  3. #3
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Daar was ik stiekem al een klein beetje bang voor.
    RLD

  4. #4
    Bob Swart drbob42's Avatar
    Join Date
    May 2004
    Location
    Helmond Brandevoort
    Posts
    514
    Prutsers ;-)

    Natuurlijk kan het wel...
    Code:
    program GatenKaas;
    uses
      SysUtils;
      
    {$APPTYPE CONSOLE}
    
    const
      csMyConstValueA = 10;
      csMyConstValueB = 20;
      csMyConstValueC = 30;
    
    type
      TMyEnum = (meValueA = csMyConstValueA,
                 meValueB = csMyConstValueB,
                 meValueC = csMyConstValueC);
    
      TMyEnumValues = Set of TMyEnum;
    
    const
      AllMyEnumValues: TMyEnumValues = [meValueA,meValueB,meValueC];
    
    
    var
      enum: TMyEnum;
    begin
      for enum in AllMyEnumValues do
      begin
        writeln(IntToStr(Ord(enum)));
      end;
      readln;
    end.
    Zeg nooit nooit - dan wordt het een uitdaging ;-)
    Groetjes,
    Bob Swart

  5. #5
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Nou, het is wel een antwoord, maar niet op de vraag.
    Je itereert over een set (waarom dan overigens niet een array?).
    All methodologies are based on fear. -- Kent Beck.

  6. #6
    Bob Swart drbob42's Avatar
    Join Date
    May 2004
    Location
    Helmond Brandevoort
    Posts
    514
    Hoezo niet op de vraag? Als je een enumeratie hebt met gaten, dan stop je al die waarden in een set (van het juiste type) en loop je daar doorheen. Als dat het antwoord niet is, dan snap ik de vraag niet ;-)
    Groetjes,
    Bob Swart

  7. #7
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Omdat je zo gewoon simpelweg een tweede datastructuur (de set) invoert waar de informatie in zit.

    Je loopt dus over de set heen, die je handmatig synchroon moet houden, en niet over de enumeratie, wat de vraag was.

    Als je die set gedefieerd krijgt zonder de identifiers van de waarden in de enum te gebruiken, dan kom je pas ergens.

  8. #8
    Bob Swart drbob42's Avatar
    Join Date
    May 2004
    Location
    Helmond Brandevoort
    Posts
    514
    Het automatisch vullen van de set (of array als je die wilt gebruiken) kan inderdaad niet, want een dergelijke enumerated type heeft geet RTTI (zoals ook al in de andere thread was geconstateerd)...
    Groetjes,
    Bob Swart

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Een slimme manier om een compiletime te vullen heeft geen RTTI nodig. Maar ik ken zo'n manier niet onder Delphi.

    (Onder FPC kan je de macro truck uithalen die ook hier staat voor C:
    http://www.nldelphi.com/forum/showthread.php?t=28870

    IOW dezelfde opsomming van elementen zowel voor de enumeratie als de set definitie gebruiken)

    enums met gaten zijn iirc origineel ingevoerd voor headergebruik. Terwijl normale enumeraties RTTI hebben vanwege hun gebruik in de designer editors. (al zou het misschien netter geweest zijn als je dit ook met een directive lokaal aan en uit kon zetten)

  10. #10
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    @Bob
    Hehe... als er een prutser is dan ben ik het wel.. moi = ?£ber prutser eerste class.
    Maar zonder dollen, je suggestie zou inderdaad een oplossing kunnen zijn. Echter de punten welke Dirk en Marcov aanhalen (oa. het synchroon houden v/d set) zijn mij het niet 'waard' om het op deze manier te doen.

    @Bob, Dirk en Marcov allen bedankt voor het mee denken, bij nader inzien gaan we kijken:
    a) of het wel echt nodig is om over de enum te ittereren (voor nu alleen nodig gehad voor debug/testing output)
    b) of het wel echt noodzakelijk is om een enum met const values te gebruiken.
    RLD

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •