Solved

About "Enumerated types"

Posted on 2000-03-02
15
135 Views
Last Modified: 2010-05-18
Sample :

procedure xxxxx...
type
 Tet = (MyFirst, MySecond, MyThird);
var
 ET : Tet;
begin
 ET:=MySecond;
 label1.Caption:=inttostr(ord(ET)); //this is no problem
 label1.Caption:=ET; //this is a problem..
end;

I would like to write the string "MySecond" in the labels caption. Is it possible to do that - and how ??
Object Inspector does something like this - i just dont know how.

Regards
Peter
0
Comment
Question by:PeterLarsen
15 Comments
 
LVL 13

Expert Comment

by:Epsylon
ID: 2576415
The Members of Tet are only known by name to the compiler. After compiling they are only numbers (0, 1, 2).
0
 
LVL 3

Expert Comment

by:raidos
ID: 2576423
As Epsylon said they are only numbers...

so something like this would be the only way to solve it?

If ET = MySecond then Label1.Caption := 'MySecond';

I suppose..

Good Luck

//raidos
0
 
LVL 1

Accepted Solution

by:
wmckie earned 100 total points
ID: 2576465
Try this:

uses
  TypInfo;

type
 Tet = (MyFirst, MySecond, MyThird);

procedure xxxxxxx;
var
 ET : Tet;
begin
 ET:=MySecond;
 //label1.Caption:=inttostr(ord(ET)); //this is no problem
 Label1.Caption := GetEnumName(TypeInfo(Tet), ord(et));
end;

Walter McKie
0
 
LVL 17

Expert Comment

by:inthe
ID: 2576501
Hi
or :

procedure xxxx ;
type
 Tet = (MyFirst, MySecond, MyThird);
 const
    TetStrings : array [Tet] of string = ('MyFirst','MySecond','MyThird');
 var
 ET : Tet;
begin
 ET:= MyThird;
 label1.Caption:= TetStrings[ET] ;
end;
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2576527
Thanks Walter.

But it is only possible to do that if the Enum type is public or published, right ?

Thanks to you all.
Peter
0
 
LVL 1

Expert Comment

by:wmckie
ID: 2576531
Yes I believe that is correct.

Walter
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2576637
I need one more information.
How do i get the count from the enum type, like :

For i:=0 to high(Tet)-1 do
 something

Thanks
Peter
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 1

Expert Comment

by:wmckie
ID: 2579317
Peter

If you've created an enumerated type then you already know its count or max value so why not why not create a constant and give it the appropriate value:
 
Type
  TNumbers  = (One, Two, Lots, Many);

Const
  Max_Numbers = 4;

Then you could use:

for C := 0 to Max_Numbers - 1 do
 // something

or you could add an extra "dummy" value to your type i.e.:

Uses
  TypInfo;

Type
  TNumbers  = (One, Two, Lots, Many, Max_Numbers)

Then you could use:

for C := 0 to GetEnumValue(TypeInfo(TNumbers), 'Max_Numbers') - 1 do
 // something

Using GetEnumValue like this will return the number of "real" values in your type.

Is this any use?

Walter
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2579333
Thanks,

It is very useful to calculate the 'count' at run-time, because the enum declaration may be created by one programmer and used by another.

Also it is very easy to forget to change a constant.

Regards
Peter
0
 
LVL 1

Expert Comment

by:wmckie
ID: 2579780
Peter

Yes I agree about forgetting to update the const value.

Is the other option acceptable, if not I have another suggesstion. In the TypInfo unit source there is function called GetTypeData which is not in the interface section. Its very short (only 3 asm instructions) I copied this and ran it against an enum type then looked at the returned PTypeData.MaxValue and you get the maximum value of that type! Have a try, see what you think.

As a matter of interest I've used this type enumeration stuff to "use strings" in a case statement, I got the details from an old copy of The Delphi Magazine, can't remember which month.

Uses
  TypInfo;

Type
  TNumbers = (One, Two, Lots, Many);

Procedure xxxxxx
begin
  // Get a string from somewhere
  case TNumbers(GetEnumValue(TypeInfo(TNumbers), aString)) of
    One: ListBox1.Items.Add('One');
    Two: ListBox1.Items.Add('Two');
    Many: ListBox1.Items.Add('Many');
    Lots: ListBox1.Items.Add('Lots');
    else ListBox1.Items.Add('Eh?');
  end;
end;

Cheers - Walter
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2579874
Thanks Walter,

Well, i have chosen the constant solution - until a better one is found.

I know it is possible to get the 'count' somewhere - or i think it's possible. Otherwise i dont understand how the Object Inspector is capable of showing the enum type.

Also take a look at Inthe's sample :

type
Tet = (MyFirst, MySecond, MyThird);
const
 TetStrings : array [Tet] of string = ('MyFirst','MySecond','MyThird');

"Array [Tet] of string".... Somehow the 'count' is passed to the array.

-i like your case-of sample - very nice :-)

Peter
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2579909
Hi Walter,

>> or you could add an extra "dummy" value to your type i.e.:

Your "dummy" idea is ok, but if it is for use in published properties, it will confuse the programmer - i think.

But i think i will consider using this method in private properties.

Peter
0
 
LVL 1

Expert Comment

by:wmckie
ID: 2579984
Peter

I made a mistake in me last comment the function GetTypeData is in the interface section of the TypInfo unit.

My guess is that a count might not available but rather the maximum value is the key. Since enum types are always ordinal values 0, 1, 2, ... maxvalue then the count of elements is maxvalue + 1.

Therefore the following will work:

Uses
  TypInfo;

Type
  TNumbers = (One, Two, Lots, Many);

procedure xxx;
var
  C: word;
begin
   for C := 0 to PTypeData(GetTypeData(TypeInfo(TNumbers))).MaxValue do
     ListBox1.Items.Add(GetEnumName(TypeInfo(TNumbers), C));
end;

Thanks - Walter
0
 
LVL 2

Author Comment

by:PeterLarsen
ID: 2591905
I have tried the sample from your latest comment and it's perfect.

Thanks
Peter
0
 
LVL 1

Expert Comment

by:wmckie
ID: 2594971
Your welcome.

Walter
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
I designed this idea while studying technology in the classroom.  This is a semester long project.  Students are asked to take photographs on a specific topic which they find meaningful, it can be a place or situation such as travel or homelessness.…
A company’s greatest vulnerability is their email. CEO fraud, ransomware and spear phishing attacks are the no1 threat to a company’s security. Cybercrime is responsible for the largest loss of money to companies today with losses projected to r…

929 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now