Delphi 5 несовместим с библиотекой - PullRequest
4 голосов
/ 24 октября 2011

Я пытаюсь добавить библиотеку Advantech (BDaqCL.pas) в свой проект приложения в Delphi 5, но файл .PAS пронизан кодом, таким как:

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

, что приводит к ошибке:

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

Это функция более поздних версий Delphi, которая не совместима с D5?Если это так, стоит ли вручную менять всех (их много) или я столкнусь с более глубокими проблемами?

Редактировать: Большинство перечислений те же, что и выше, но есть и много более сложных, как показано ниже.Слишком много, чтобы сделать вручную:

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
);

Как вы видите, у меня отключена работа, поэтому лучше убедиться, что я 'Я делаю это правильно в первую очередь.Спасибо

Ответы [ 3 ]

10 голосов
/ 24 октября 2011

Эта функция, Перечисляемые типы с явно назначенной ординальностью , была добавлена ​​в Delphi 6, поэтому код не будет компилироваться в Delphi 5.

В вашем примере код эквивалентен

AccessMode = (
  ModeRead,
  ModeWrite,
  ModeWriteWithReset
);

, и вы можете использовать это безопасно.Я не совсем понимаю, почему автор кода явно присвоил 0 первому порядковому номеру, поскольку он не влияет на значение типа.

Если вы столкнетесь с кодом, который явно устанавливает порядковые номера, минимальное значение которых не равно0 или имеет несмежную ординальность, тогда это более сложный обходной путь.

Обратите внимание, что обычно вам нужно явно установить порядковый номер только тогда, когда вы взаимодействуете с чем-то внешним, например, с форматами файлов, вызовами или из другихбиблиотеки.Если переменные перечислимого типа когда-либо существуют только в памяти и в вашем коде, то вам, скорее всего, все равно, какой у них порядок.

Я не уверен на 100%, почему эта функция была добавлена, ноКажется, я помню, что это было необходимо для поддержки продукта Kylix.

5 голосов
/ 24 октября 2011
  1. Синтаксис, позволяющий указать значение элемента перечисления, был введен после Delphi 5, возможно, в Delphi 6.
  2. Вы должны заменить ModeRead = 0 на ModeRead здесь и в аналогичных местах, когдаобновленный enum сохраняет те же значения элементов (member [0] = 0, member [i] = member [i - 1] + 1).
  3. В противном случае вы должны заменить исходный тип enum чем-то вродечто:

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

Обратите внимание на = Byte.В зависимости от количества членов перечисления это может быть:

  • 1 ... 256 -> Байт
  • 257 ... 2 ** 16 -> Word
  • 2 ** 16 + 1 ... -> LongWord
3 голосов
/ 24 октября 2011

Начиная с D6 или D7, вы можете явно присваивать значения элементам перечисления . В случае, если вы разместили сообщение, просто удаление = 0 должно исправить ваши проблемы. В более сложных случаях эта статья может дать вам несколько идей.

...