`
com1com4
  • 浏览: 162087 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DELPHI设置枚举类型size

 
阅读更多

 

delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难。
经过查找资料,原来delphi可以通过{$Z+} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度,小至1个字节,大至4个字节。
官方说明如下:
The $Z directive controls the minimum storage size of Delphi enumerated types. 

An enumerated type is stored as an unsigned byte if the enumeration has no more than 256 values, and if the type was declared in the {$Z1} state (the default). If an enumerated type has more than 256 values, or if the type was declared in the {$Z2} state, it is stored as an unsigned word. Finally, if an enumerated type is declared in the {$Z4} state, it is stored as an unsigned double word. 

The {$Z2} and {$Z4} states are useful for interfacing with C and C++ libraries, which usually represent enumerated types as words or double words.

Note: Note: For backwards compatibility with early versions of Delphi and CodeGear Pascal, the directives {$Z-} and {$Z+} are also supported. They correspond to {$Z1} and {$Z4}, respectively.
 
例子如下:
Example code : Various enum type sizes
type
  {$Z1}
  TCars1  = (Rover, Jaguar, Honda);    // Will fit into 1 byte
  TFruit1 = (Banana=255, Apple, Pear); // Will exceed one byte

  {$Z4}
  TCars2  = (Ford, Nissan, Vauxhall);  // Now uses 4 bytes
  TFruit2 = (Orange=255, Plum, Grape); // Now uses 4 bytes

begin
  ShowMessage('TCars1  size = '+IntToStr(SizeOf(TCars1)));
  ShowMessage('TFruit1 size = '+IntToStr(SizeOf(TFruit1)));
  ShowMessage('TCars2  size = '+IntToStr(SizeOf(TCars2)));
  ShowMessage('TFruit2 size = '+IntToStr(SizeOf(TFruit2)));
end;
 
   TCars1  size = 1
   TFruit1 size = 2
   TCars2  size = 4
   TFruit2 size = 4

 

分享到:
评论

相关推荐

    delphi 通过SetupApi列举设备

    设备的名称通常可以通过查询`SPDRP_FRIENDLYNAME`属性得到,而端口号可能需要查询其他属性,比如`SPDRP_PORT_NAME`,具体取决于设备类型。 ```delphi var DeviceProperty: TGuid; PropertyType: DWORD; Property...

    delphi XE环境认识

    **2.1.4 枚举类型的最小尺寸(Minimum Enum Size)** - **功能描述**:指定为枚举类型分配的最小内存大小。可以选择字节(`{$Z1}`)、双字节(`{$Z2}`)或四字节(`{$Z4}`)。 - **示例**:如果选择`{$Z2}`, 枚举类型将至少...

    Delphi与C++数据类型对照表

    7. 枚举类型: - Delphi中的枚举(enumeration)是命名的整数常量集合。 - C++的枚举(enum)类似,但C++11引入了更强类型的enum class,增强了类型安全性。 8. 结构体和联合: - Delphi中的记录(record)类似...

    delphi 2010 socket发送结构体协议

    在Delphi中,结构体可以包含各种基本类型、其他结构体或枚举等。例如,我们可以定义一个包含整型、字符串和浮点数的结构体: ```delphi type TMyStruct = record IntValue: Integer; StrValue: String; ...

    Delphi 保存字体信息

    这里值得注意的是,由于 `Font.Style` 是一个枚举类型,因此需要将其转换为整型数据才能被正确地写入到 INI 文件中。 ##### 步骤四:读取 INI 文件 ```delphi procedure TForm1.Button2Click(Sender: TObject); ...

    DELPHI真正的编码规范

    - 常量和枚举值全大写,用下划线分隔单词(如`MAX_SIZE`)。 - 单元名采用小写字母,如果需要分隔单词,使用下划线(如`my_unit`)。 2. **注释** - 为每个类、方法、函数提供清晰的多行注释,解释其功能和使用...

    delphi代码规范

    - 常量和枚举项全大写,单词间用下划线分隔,如`MAX_SIZE`。 - 单元名遵循PascalCase,如`MyUnit`。 2. **注释** - 注释应简洁明了,描述代码的功能和目的,避免过多的细节。 - 使用`{}`包围单行注释,多行注释...

    Delphi 列举进程及进程模块信息实例.rar_delphi 进程路径_revieww6t_sittingps3_进程模块_进

    1. 定义一个类型,用于存储进程和模块的信息,例如: ```delphi TProcessModuleInfo = record ProcessID: DWORD; ModuleName: string; ModuleBaseAddress: Pointer; ModuleSize: DWORD; ModuleHandle: ...

    Delphi函数大全

    - `type SysUtils.TLanguages` —— 定义了语言环境的枚举或集合类型。 --- #### 二、`function AllocMem(Size: Cardinal): Pointer;` **功能:** 动态分配指定大小的内存。此函数用于创建一块指定大小的内存区域...

    ComboBox 自动调整组合框下拉部分的宽度

    // 使用KnownColor枚举类型填充ComboBox comboBox1.DataSource = Enum.GetNames(typeof(KnownColor)); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); // 遍历ComboBox的所有项目 ...

    获取系统服务

    在Delphi中,该函数通常会传入服务控制管理器句柄、服务类型和服务状态,以及一个缓冲区用于接收服务信息。 ```delphi function EnumServicesStatus(hSCManager: SC_HANDLE; dwServiceType: DWORD; dwServiceState...

Global site tag (gtag.js) - Google Analytics