Я знаком с статьей Джеффа Этвуда о том, что ошибки всегда являются ошибкой программиста , но я считаю, что действительно и действительно нашел ошибку в .pas-файле Delphi.
В частности, я использую Delphi 2007, и ошибка находится в строке 955 файла DBCommon.pas, который на моей машине находится здесь:
C: \ program files \ codegear \ rad studio \ 5.0 \ source \ Win32 \ db \ DBCommon.pas
И код такой:
...
FieldIndex := StrToInt(Token);
if DataSet.FieldCount >= FieldIndex then
LastField := DataSet.Fields[FieldIndex-1].FieldName else
...
Если «Token» имеет значение ноль, то мы пытаемся получить доступ к индексу -1 DataSet.Fields, что приводит к ошибке индекса списка за пределами границ.
Эта ошибка не возникает для пользователя, потому что она обрабатывается до того, как она поднимется так высоко, но каждый раз, когда это происходит, чрезвычайно раздражает прерывание отладчика.
Я мог бы «Игнорировать этот тип исключения», но ошибки Index of the bounds достаточно распространены, и я не хочу их игнорировать повсеместно.
Ситуация, при которой FieldIndex равен нулю, возникает, когда у вас есть оператор SELECT, в котором ORDER BY содержит функцию, как в:
ORDER BY
CASE WHEN FIELD1 = FIELD3 THEN 1 ELSE 2 END
,CASE WHEN FIELD2 = FIELD4 THEN 1 ELSE 2 END
Я могу исправить ошибку в DBCommon.pas, но Delphi не перекомпилирует себя, и мои изменения не вступают в силу. Если я переименую файл .DCU, то он просто жалуется, что «DBCommon.dcu» не может быть найден.
Итак (наконец) мой вопрос: могу ли я перекомпилировать DBCommon.pas с моим исправлением, и если да, то как?