Avatar billede hugopedersen Nybegynder
14. december 2009 - 13:47 Der er 3 kommentarer og
1 løsning

Enum - hvordan i Delphi

I VBA kan man lave en type som f.eks.

Public Enum hpNumbering_Type
  hpNumbering_Device = 1
  hpNumbering_Customer = 2
  hpNumbering_Supplier = 3
  hpNumbering_Documents = 30
  hpNumbering_Change_Requests = 40
End Enum

Så har jeg en funktion der hedder fhpNumbering_Prefix(bytType As hpNumbering_Type)
Og i den kan jeg Select case på de værdier (1, 2, 3, 30, 40 i dette tilfælde)
I Access får jeg også en fin liste med navnene når jeg taster fhpNumbering_Prefix( - det er en fin dropdown hvor jeg kan vælge fra.

Hvad kan man lave ud i den retning i Delphi?
Avatar billede hrc Mester
14. december 2009 - 14:02 #1
Hej Hugo. Det er meget nemt (mon ikke Pascal faktisk var først med den konstruktion):

type
  ThpNumbering_Types =
    (hpNumbering_Device = 1,
    hpNumbering_Customer = 2,
    hpNumbering_Supplier = 3,
    hpNumbering_Documents = 30,
    hpNumbering_Change_Requests = 40);

Du behøver ikke sætte værdier på; så starter de fra 0. Værdierne kan godt, men bør ikke være negative. Der er funktioner som antager at det er positive heltal.
Avatar billede hrc Mester
14. december 2009 - 14:12 #2
fortsat..
const
  HPNumberingText: array[ThpNumbering_Types] of string =
    ('Device',
    'Customer',
    'Supplier',
    'Documents',
    'Change requests');

Inkluderer du types, kan du bruge en funktion der til at skrive teksten direkte - kommer om et øjeblik.

procedure FillStrings(aStrings: TStrings);
var
  Nums: ThpNumbering_Types;
begin
  aStrings.BeginUpdate;
  try
    aStrings.Clear;
    for nums := low(ThpNumbering_Types) to high(ThpNumbering_Types) do
      aStrings.AddObject(HPNumberingText[Nums],TObject(Nums));
  finally
    aStrings.EndUpdate;
  end;
end;

Du kan også finde strengværdien via GetEnumName (inkludér unit Types):
NumsName := GetEnumName(TypeInfo(ThpNumbering_Types),integer(Nums));

Egentlig burde man kunne gøre dette - men selvom dokumentationen påstår at det fungerer på ennumeringer så kan jeg ikke få det til at virke:
for nums in ThpNumbering_Types do
  aStrings.AddObject(HPNumberingText[Nums],TObject(Nums));
Avatar billede hrc Mester
14. december 2009 - 14:14 #3
Skal du have værdien fra en combobox:
with MyCombo do
  if ItemIndex >= 0 then
    Nums := ThpNumbering_Types(Items.Objects[ItemIndex]);

I øvrigt er comboerne ikke glade for negative værdier i objects-listen (bruges internt til at indikere fejl)
Avatar billede hugopedersen Nybegynder
14. december 2009 - 14:28 #4
OK - så skal jeg bare se om jeg kan få det til at virke i mit setup :-)

( http://www.eksperten.dk/spm/893555 )
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester