4

Delphi 5のアプリケーションプロジェクトにアドバンテック(BDaqCL.pas)ライブラリを追加しようとしていますが、.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
);

ご覧のとおり、私は自分の仕事を切り取っているので、最初にそれを正しく行っていることを確認するのが最善です。ありがとう

4

3 に答える 3

10

この機能、明示的に割り当てられた順序を持つ列挙型は、Delphi 6で追加されたため、コードはDelphi5でコンパイルされません。

あなたの例では、コードはと同等です

AccessMode = (
  ModeRead,
  ModeWrite,
  ModeWriteWithReset
);

そしてそれを安全に使うことができます。型の意味に影響を与えないため、コードの作成者が最初の序数に明示的に0を割り当てた理由はよくわかりません。

最小値が0でない序数を明示的に設定するコード、または連続していない序数を持つコードに遭遇した場合、回避策はより複雑になります。

通常、ファイル形式、他のライブラリへの呼び出し、または他のライブラリからの呼び出しなど、外部のものと相互運用する場合にのみ、明示的に順序を設定する必要があることに注意してください。列挙型の変数がメモリとコードにのみ存在する場合は、それらがどのような順序であるかを気にしない可能性があります。

この機能が追加された理由は100%わかりませんが、Kylix製品をサポートするために必要だったことを思い出しているようです。

于 2011-10-24T15:51:03.503 に答える
5
  1. 列挙型メンバー値を指定できる構文は、Delphi 5の後、おそらくDelphi6で導入されました。
  2. ModeRead = 0更新された列挙型が同じメンバー値を保持する場合は、ここと同様の場所で置き換える必要がModeReadあります(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 ...-> LongWord
于 2011-10-24T15:56:57.143 に答える
3

D6またはD7以降、列挙型メンバーに値を明示的に割り当てることができます。投稿した場合は、削除するだけで= 0問題が解決するはずです。より複雑なケースでは、この記事はあなたにいくつかのアイデアを与えるかもしれません。

于 2011-10-24T15:49:51.347 に答える