【问题标题】:Delphi 5 incompatible with libraryDelphi 5 与库不兼容
【发布时间】:2011-10-24 15:40:58
【问题描述】:

我正在尝试将 Advantech (BDaqCL.pas) 库添加到我在 Delphi 5 中的应用程序项目中,但 .PAS 文件中充斥着以下代码:

    AccessMode = (
  ModeRead = 0,
  ModeWrite,
  ModeWriteWithReset
);

导致错误的原因:

',' or ')' expected but '=' found

这是D5 不兼容的Delphi 后期版本的一个特性吗?如果是这样,是否值得手动更改每个人(有很多),还是我一定会遇到更深层次的问题?

编辑:大多数枚举如上,但也有很多更复杂的,如下所示。手动操作太多:

DioPortDir = (
  Input   = $00,
  LoutHin = $0F,
  LinHout = $F0,
  Output  = $FF
);

编辑:我开始将它们声明为常量。谁能告诉我以下操作是否正确

var
    DioPortDir = LongInt;
const
      Input   = $00;
      LoutHin = $0F;
      LinHout = $F0;
      Output  = $FF;

我将列出 var 声明并将 const 声明移到顶部。

我不确定当 const 不等于任何东西时该怎么办,例如

ValueRange = (
  V_OMIT = -1,            // Unknown when get, ignored when set
  V_Neg15To15 = 0,        // +/- 15 V
  V_Neg10To10,            // +/- 10 V
  V_Neg5To5,              // +/- 5 V
  V_Neg2pt5To2pt5,        // +/- 2.5 V
  V_Neg1pt25To1pt25,      // +/- 1.25 V
  V_Neg1To1,              // +/- 1 V

  V_0To15,                // 0~15 V
  V_0To10,                // 0~10 V
  V_0To5,                 // 0~5 V
  V_0To2pt5,              // 0~2.5 V
  V_0To1pt25,             // 0~1.25 V
  V_0To1,                 // 0~1 V

  mV_Neg625To625,         // +/- 625mV
  mV_Neg500To500,         // +/- 500 mV
  mV_Neg312pt5To312pt5,   // +/- 312.5 mV
  mV_Neg200To200,         // +/- 200 mV
  mV_Neg150To150,         // +/- 150 mV
  mV_Neg100To100,         // +/- 100 mV
  mV_Neg50To50,           // +/- 50 mV
  mV_Neg30To30,           // +/- 30 mV
  mV_Neg20To20,           // +/- 20 mV
  mV_Neg15To15,           // +/- 15 mV
  mV_Neg10To10,           // +/- 10 mV
  mV_Neg5To5,             // +/- 5 mV

  mV_0To625,              // 0 ~ 625 mV
  mV_0To500,              // 0 ~ 500 mV
  mV_0To150,              // 0 ~ 150 mV
  mV_0To100,              // 0 ~ 100 mV
  mV_0To50,               // 0 ~ 50 mV
  mV_0To20,               // 0 ~ 20 mV
  mV_0To15,               // 0 ~ 15 mV
  mV_0To10,               // 0 ~ 10 mV

  mA_Neg20To20,           // +/- 20mA
  mA_0To20,               // 0 ~ 20 mA
  mA_4To20,               // 4 ~ 20 mA
  mA_0To24,               // 0 ~ 24 mA

  // For USB4702_4704
  V_Neg2To2,              // +/- 2 V
  V_Neg4To4,              // +/- 4 V
  V_Neg20To20,            // +/- 20 V

  Jtype_0To760C = $8000, // T/C J type 0~760 'C
  Ktype_0To1370C,          // T/C K type 0~1370 'C
  Ttype_Neg100To400C,     // T/C T type -100~400 'C
  Etype_0To1000C,          // T/C E type 0~1000 'C
  Rtype_500To1750C,       // T/C R type 500~1750 'C
  Stype_500To1750C,       // T/C S type 500~1750 'C
  Btype_500To1800C,       // T/C B type 500~1800 'C

  Pt392_Neg50To150,       // Pt392 -50~150 'C
  Pt385_Neg200To200,       // Pt385 -200~200 'C
  Pt385_0To400,           // Pt385 0~400 'C
  Pt385_Neg50To150,       // Pt385 -50~150 'C
  Pt385_Neg100To100,      // Pt385 -100~100 'C
  Pt385_0To100,           // Pt385 0~100 'C  
  Pt385_0To200,           // Pt385 0~200 'C 
  Pt385_0To600,         // Pt385 0~600 'C 
  Pt392_Neg100To100,      // Pt392 -100~100 'C  
  Pt392_0To100,           // Pt392 0~100 'C 
  Pt392_0To200,           // Pt392 0~200 'C 
  Pt392_0To600,           // Pt392 0~600 'C 
  Pt392_0To400,           // Pt392 0~400 'C 
  Pt392_Neg200To200,      // Pt392 -200~200 'C  
  Pt1000_Neg40To160,      // Pt1000 -40~160 'C  

  Balcon500_Neg30To120,   // Balcon500 -30~120 'C  

  Ni518_Neg80To100,       // Ni518 -80~100 'C 
  Ni518_0To100,           // Ni518 0~100 'C 
  Ni508_0To100,           // Ni508 0~100 'C 
  Ni508_Neg50To200,       // Ni508 -50~200 'C 

  Thermistor_3K_0To100,   // Thermistor 3K 0~100 'C 
  Thermistor_10K_0To100,  // Thermistor 10K 0~100 'C 

  Jtype_Neg210To1200C,    // T/C J type -210~1200 'C
  Ktype_Neg270To1372C,    // T/C K type -270~1372 'C
  Ttype_Neg270To400C,     // T/C T type -270~400 'C
  Etype_Neg270To1000C,    // T/C E type -270~1000 'C
  Rtype_Neg50To1768C,     // T/C R type -50~1768 'C
  Stype_Neg50To1768C,     // T/C S type -50~1768 'C
  Btype_40To1820C,        // T/C B type 40~1820 'C

  Jtype_Neg210To870C,     // T/C J type -210~870 'C
  Rtype_0To1768C,         // T/C R type 0~1768 'C
  Stype_0To1768C,         // T/C S type 0~1768 'C

  // 0xC000 ~ 0xF000 : user customized value range type
  UserCustomizedVrgStart = $C000,
  UserCustomizedVrgEnd = $F000,

  // AO external reference type
  V_ExternalRefBipolar = $F001,  // External reference voltage unipolar
  V_ExternalRefUnipolar = $F002  // External reference voltage bipolar
);

如您所见,我的工作已经完成,所以最好先确保我做得对。 谢谢

【问题讨论】:

  • 我认为枚举也在 D5 中...这不是问题...
  • @Evilone 枚举在 D1、Turbo Pascal 等中。这是导致编译器堵嘴的显式序数。
  • 答案应该注意,在这种特殊情况下,您可以安全地删除显式分配的序数,因为它是多余的,但是由于您说代码充满了这些,如果一些类似的声明是 不是多余的,那么如果代码中有特定原因导致这样做,您可能会遇到麻烦。
  • 是的。感谢您提供所有信息,但这个单元的长度超过 2500 行。虽然我只会使用其中的一小部分,但我无法想象手动更改它。我会问研华他们是否有没有 Enums 的版本,但不太可能,因为它用于与 Windows7 上的访问控制 PCI 驱动程序通信
  • 有关 DioPortDir 之类的内容,请参阅@da-soft 答案。

标签: delphi delphi-5


【解决方案1】:

此功能 Enumerated Types with Explicitly Assigned Ordinality 是在 Delphi 6 中添加的,这就是代码在 Delphi 5 中无法编译的原因。

在您的示例中,代码等效于

AccessMode = (
  ModeRead,
  ModeWrite,
  ModeWriteWithReset
);

您可以安全地使用它。我不太明白为什么代码的作者明确地将 0 分配给第一个序数,因为它对类型的含义没有影响。

如果您遇到显式设置最低值不为 0 的序数或具有非连续序数的代码,则解决方法会更复杂。

请注意,您通常只需要在与外部事物互操作时显式设置序数,例如文件格式,对其他库的调用或从其他库调用。如果枚举类型的变量只存在于内存和您的代码中,那么您很可能不在乎它们的序数。

我不能 100% 确定为什么要添加此功能,但我似乎记得它是支持 Kylix 产品所必需的。

【讨论】:

  • 这个库支持与 PCI 卡的各种通信,但我实际上只会使用一个小功能 - 数字输出。还有其他更复杂的,比如我在编辑中包含的那个,假设它们是必要的也许是安全的。
  • 更复杂的需要声明为ByteWord等,具体取决于值的宽度以及定义为常量的实际值。
  • 你能看看我在 OP 中的编辑,告诉我我是否声明正确,以及当 const 没有价值时该怎么办。
  • 解决这一切的关键是我链接到的文档中的以下语句:“任何未明确分配序数的值的序数都比列表中的前一个值大一. 如果第一个值没有指定序数,则其序数为 0。我认为有了这些信息,应该清楚该怎么做。我的建议是按照我的答案中的链接并仔细阅读。它有一些有用的例子。
【解决方案2】:
  1. 允许指定枚举成员值的语法是在 Delphi 5 之后引入的,可能在 Delphi 6 中。
  2. 当更新的枚举保留相同的成员值(member[0] = 0, member[i] = member[i - 1] + 1 )。
  3. 否则你应该用类似的东西替换原来的枚举类型:

    type
      AccessMode = Byte;
    const
      ModeRead = 0;
      ModeWrite = 1;
      ModeWriteWithReset = 2;
    

关注= Byte。根据枚举成员的数量,可能是:

  • 1 ... 256 -> 字节
  • 257 ... 2**16 -> 字
  • 2**16 + 1 ... -> 长字

【讨论】:

  • 对不起,我已经有一段时间没有做权力了。澄清一下 - = 00 美元,甚至我最大的 8000 美元,一个字节就可以了?对于长度 > 15 位的值,我只需要一个 Word 声明?
【解决方案3】:

从 D6 或 D7 开始,您可以explicitly assign values to enumeration members。如果您发布的只是删除 = 0 应该可以解决您的问题。在更复杂的情况下,this article 可能会给你一些想法。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多