|
------Delphi7 --这里只对正常情况下的枚举举例子,Delphi正常情况下的枚举类型占用一个字节, C中的枚举不是占一个字节,C可能要用到Delphi的枚举,所以Delphi用编译指令可以把枚举类型的大小改变,也可能占用2字节、4字节
请参考:https://bbs.csdn.net/topics/320097250?list=10622938 type {$Z+}// 4字节
TMyEnum = (.....);
{$Z-} // 还原1字节
{$A4} // 4字节对其
TMyRecord = record ..... end;
{$A-} //还原
需要引用:TypInfo单元

----------------- --Unit开始-- unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TypInfo;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
EMyEnum=(AA,BB,CC,DD,EE,FF);//声明枚举 var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var vEnumStr:string; venum:EMyEnum; vP:PTypeInfo; i:Integer; begin Memo1.Clear; //遍历枚举 vP:=TypeInfo(EMyEnum); for venum:=Low(EMyEnum) to High(EMyEnum) do begin vEnumStr:=GetEnumName(vP,Byte(venum));//枚举最多256个元素,因为只占一个字节,为此猜测Byte(venum)可以得到下标 Memo1.Lines.Add(vEnumStr); end; //测试别的 Memo1.Lines.Add('-----------------'); i:=GetEnumValue(vp,'CC'); Memo1.Lines.Add(IntToStr(i)); if EMyEnum(i)=CC then Memo1.Lines.Add('CC'); end;
end.
--Unit结束
-----Form开始------ object Form1: TForm1 Left = 498 Top = 418 BorderStyle = bsDialog Caption = 'Form1' ClientHeight = 327 ClientWidth = 218 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 8 Top = 8 Width = 185 Height = 225 ImeName = '中文(简体) - 搜狗拼音输入法' TabOrder = 0 end object Button1: TButton Left = 72 Top = 264 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 1 OnClick = Button1Click end end -----Form结束-----
---------------------------------------------------其他资料--------------------------------------------- 来源:Delphi整理五(枚举、子界、集合) http://www.delphitop.com/html/jichu/3345.html 枚举、子界与集合
枚举
type <类型名称>=(<标识符1>,<标识符2>...<标识符n>); 1 2 1)类型名称:自定义枚举类型名称 2)标识符:常量元素,个数有限 3)一个枚举类型中,枚举常量不允许重复出现,也不允许同一枚举出现在不同类型中 例如,自动以7个常量的枚举类型
Type Weekday=(Sun,Mon,Tue,Wed,Thu,Fri,Sat) 1 2 枚举规则:先定义类型在定义变量
var w1,w2,w3:weekday; a,b,c:integer; 1 2 枚举运算:
1)用pred函数求枚举值的前导。pred(mon)的值为sun,sun没有前导 2)用succ函数求枚举值的后继。succ(sun)的值为mon,sat没有后继 3)用ord函数求枚举值的序号。ord(sun)为0 4)用low函数得第一个枚举值。low(weekday)的值为sun.low(w1)和low(w2)也为sun 5)用high函数求最后一个枚举值 6)使用关系运算符比较枚举值的大小。sun>mon的值为false;tue>=sun的值为true。
子界类型
type <类型名称>=<常量1>...<常量2>; 1 2 1)<类型名称>是子界类型的名称。 2)<常量1>是子界的下界,<常量2>是子界类型的上界,之间为相同的有序类型(同为整型或同为字符型) 3)子界的上界大于或者等于下界 例,
type month=1..12; weekday=(sun,mon,tue,wed,thu,fri,sat); workday=mon..fri; 1 2 3 4 子界类型变量的定义
规则:先定义类型,再定义变量
type month=1..12; weekday=(sun,mon,tue,wed,thu,fri,sat); workday=mon..fri; var m1,m2:month; w1,w2:workday; 1 2 3 4 5 6 7 不建议:m1,m2:1..12;
集合整型
1)集合中的元素是相异的。(不重复) 2)集合中的元素是没有顺序的 3)集合中的元素不能超过256个
集合的定义:
type <类型名称>=set of<基类型>; 1 2 1)<类型名称>是用户所定义的集合类型的名称 2)<基类型>是集合中元素的类型,可以是字符、布尔、枚举、子界等类型,不能是整型、实型 例,
type days=set of 28..31; ch=set of 'A'..'Z'; weekday=(sun,tue,wed,thu,fri,sat); workday=set of weekday; 1 2 3 4 5 集合类型变量的定义:
先定义集合类型
type days=set of 28..31; ch=set of 'A'..'Z'; weekday=(sun,...,sat); workday=set of weekday; 1 2 3 4 5 再定义集合类型的变量
var ch1,ch2:ch; wo1,wo2:workday; d1,d2:days; 1 2 3 4 集合类型的取值和运算
集合的取值称之为集合的值。
type weekday=(sun,mon,tue,wed,thu,fir,sat); workday=set of weekday; var wo1,wo2:workday; wo1的值可以为[]、[sun]、[sun,mon]... 1 2 3 4 5 6 1)一个集合的基类型有n个值,那么集合变量的取值有2的n次方个。 2)[]是空集合 3)集合元素连续出现,可以写成子界形式。1..12等价于1到12
集合的运算
交、差、并运算和集合间的关系运算 前者得到的集合类型或者是boolean类型 1)集合的并。两个集合的所有元素组成(去掉重复的) 2)集合的交运算。两集合公有的 3)集合的差。一个集合去掉公有的 []() 4)相等运算返回false or true 5)不相等运算(<>)返回false or true 6)包含运算。后者有的前者全有都有(>=)false or true 7)被包含运算。前者有的后者都有(<=)false or true 8)元素与集合的运算,判断元素是否在集合中。2 in[1,2,3]的值为true
------------ 发现这个也有遍历枚举:Delphi7遍历枚举,子界 - kiny - 博客园 https://www.cnblogs.com/kiny/articles/2676628.html
-------------------------------------------------------
-----------------------结束---------------------------------
-----新篇------------ -------------------------------------------------------------------------------------
--------------------字符串转枚举(利用泛型)----------------
需要Uses: TypInfo, SysConst
1 TEnumConvert<T> = class
2 public
3 class function StrToEnumType(const S: string): T; overload;
4 class function StrToEnumType(const S: string; Default: T): T; overload;
5 class function EnumToString(Value: T): string;
6 end;
7
8
9
10
11
12 implementation
13
14 { TEnumConvert<T> }
15
16 class function TEnumConvert<T>.EnumToString(Value: T): string;
17 var
18 v: Integer;
19 begin
20 case PTypeInfo(TypeInfo(T))^.Kind of
21 tkEnumeration:
22 case TypInfo.GetTypeData(TypeInfo(T))^.OrdType of
23 otUByte, otSByte: v := PByte(@Value)^;
24 otUWord, otSWord: v := PWord(@Value)^;
25 otULong, otSLong: v := PInteger(@Value)^;
26 end;
27 else
28 raise EInvalidCast.CreateRes(@SInvalidCast);
29 end;
30 Result := TypInfo.GetEnumName(TypeInfo(T), v);
31 //Result := TValue.From<T>(Value).ToString;//Rtti
32 end;
33
34 class function TEnumConvert<T>.StrToEnumType(const S: string): T;
35 begin
36 case PTypeInfo(TypeInfo(T))^.Kind of
37 tkEnumeration:
38 case TypInfo.GetTypeData(TypeInfo(T))^.OrdType of
39 otUByte, otSByte: PByte(@Result)^ := GetEnumValue(TypeInfo(T), S);
40 otUWord, otSWord: PWord(@Result)^ := GetEnumValue(TypeInfo(T), S);
41 otULong, otSLong: PInteger(@Result)^ := GetEnumValue(TypeInfo(T), S);
42 end;
43 else
44 raise EInvalidCast.CreateRes(@SInvalidCast);
45 end;
46 end;
47
48 class function TEnumConvert<T>.StrToEnumType(const S: string; Default: T): T;
49 begin
50 if S <> '' then
51 Result := StrToEnumType(S)
52 else
53 Result := Default;
54 end;
来源:https://www.cnblogs.com/dmqhjp/p/15148096.html |