У меня есть скрипт, который вызывает функции из этого скрипта:
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)))
, а выдавало ошибку.