Неожиданная ошибка «неправильное использование идентификатора» при запуске кода DXL - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть скрипт, который вызывает функции из этого скрипта:

https://www.baselinesinc.com/dxl-repository/?filerepoaction=showpost&filepost_id=13

, который распространяется по лицензии LGPL. Я нашел несколько ссылок на этот скрипт в Интернете, указывая, что он работает. Для моих собственных целей я удалил часть кода, которая выполняется при загрузке (около 20 строк внизу файла), и преобразовал файл в формат .in c, чтобы он служил библиотекой. Я не делал никаких других изменений.

Мой собственный сценарий работал в течение нескольких месяцев . Но теперь, внезапно, когда я пытаюсь запустить его, я получаю следующие ошибки:

-E- DXL: <DOORSImporter\Import_From_Excel.inc:291> incorrect use of identifier (rtfValue)
-E- DXL: <DOORSImporter\Import_From_Excel.inc:292> incorrect use of identifier (nonRTFValue)
-E- DXL: <DOORSImporter\Import_From_Excel.inc:346> incorrect use of identifier (temp)
-E- DXL: <DOORSImporter\Import_From_Excel.inc:464> incorrect use of identifier (columnHeading)
-E- DXL: <DOORSImporter\Import_From_Excel.inc:1127> incorrect use of identifier (cellValue)
-I- DXL: All done. Errors reported: 5. Warnings reported: 0.

Ниже приведен фрагмент кода, который показывает эту ошибку. Я пометил строки 291 и 292

bool richTextTruncated(int rowNumber, int columnNumber) {
   Buffer rtfValue = create
   Buffer nonRTFValue = create

   rtfValue = ""
   nonRTFValue = ""

   rtfValue = copyRichTextFromCell(""intToCol(columnNumber) "" rowNumber"")   // get the rich text
   rtfValue = trimWhitespace(stripRichText(tempStringOf(rtfValue)))   // strip off RTF formatting.   <----- 291
   nonRTFValue = trimWhitespace(getCellValue(rowNumber, columnNumber))                             //<----- 292

   if(tempStringOf(rtfValue) != tempStringOf(nonRTFValue)) {   // if the two strings aren't equal
      delete(rtfValue)
      delete(nonRTFValue)
      return true                           // return that text was truncated
   }

   delete(rtfValue)
   delete(nonRTFValue)
   return false
}

Сама функция trimWhitespace определена как string trimWhitespace(string s), поэтому можно назначить свой вывод в буфер.

Так что все это очень запутанно, потому что, Как я уже сказал, это сработало, и код не был изменен (последняя проверка файла DOORSImporter\Import_From_Excel.inc с ноября прошлого года, тогда как я использовал сценарий даже в январе.

Возможно, наш ИТ-отдел Недавно обновил DOORS, я не знаю. Я проверил последнюю версию справочного руководства по dxl на наличие каких-либо недавних изменений, которые могли бы вызвать это, но я не смог найти никаких изменений в способе обработки буферов. Честно говоря, я работа с буферами показалась мне довольно запутанной. В моем собственном коде я вообще отказался от них. Однако сценарий Import_From_Excel долгое время не работал.

Любая поддержка с этим будет принята с благодарностью.

********** Edit 27.02.2020 **************

Функция copyRichTextFromCell определяется следующим образом. Источник по ссылке ниже. https://www.baselinesinc.com/dxl-repository/?filerepoaction=showpost&filepost_id=10

string copyRichTextFromCell(string loc) {
   if(!getCell(loc)) {
      return("error");
   }

   if(!checkResult(oleMethod(objCell, cMethodSelect)))   {  // selects the cell
      return("error");
   }

   if(!checkResult(oleMethod(objCell, cMethodCopy))) {      // copies the contents of the cell to the clipboard
      return("error");
   }

   return stringOf(richClip)
}

********** Редактировать 28.02.2020 **************

Функция trimWhitespace выглядит следующим образом.

string trimWhitespace(string s) {
   int first = 0;
   int last = length(s) - 1;

   while(last > 0 && (isspace(s[last]) || s[last] == '\n' || s[last] == '\r' || s[last] == '\t')) {
      last--;
   }
   while(isspace(s[first]) && first < last) {
      first++;
   }
   if(s[first:last] == " ") {
      return("");
   }
   return(s[first:last]);
}

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

bool richTextTruncated(int rowNumber, int columnNumber) {
   Buffer rtfValue = create
   Buffer nonRTFValue = create
   string fooString

   rtfValue = ""
   nonRTFValue = ""

   rtfValue = copyRichTextFromCell(""intToCol(columnNumber) "" rowNumber"")   // get the rich text


   fooString = trimWhitespace(stripRichText(tempStringOf(rtfValue)))
   rtfValue = fooString   // strip off RTF formatting.
   fooString = trimWhitespace(getCellValue(rowNumber, columnNumber))
   nonRTFValue = fooString


   if(tempStringOf(rtfValue) != tempStringOf(nonRTFValue)) {   // if the two strings aren't equal
      delete(rtfValue)
      delete(nonRTFValue)
      return true                           // return that text was truncated
   }

   delete(rtfValue)
   delete(nonRTFValue)
   return false
}

Так что строки с fooString больше не выдают ошибку. В первоначальной версии эти строки были, например, rtfValue = trimWhitespace(stripRichText(tempStringOf(rtfValue))), а выдавало ошибку.

...