(Основываясь на комментариях, я отредактировал вопрос, сосредоточив внимание на фактической части кода, вызывающей проблему, и добавил раздел в конце)
Это окно локальных переменных в моем приложении Delphi 10.3.4 Win32, обратите внимание, что lData
отсутствует:
Точка останова, соответствующая этому снимку экрана, находится в строке if EmptyJSONArray(lData)
в конце следующего фрагмента кода:
function TLoketAPI.GetOneBatch(AJSONToXML: TJSONToXML; const ASelProps: TSelectionProps; var ABatchCount, AStatusCode: Integer): Boolean;
var
lURL,
lNextID,
lData : String;
lLogHTTP : TLogHTTP;
begin
Result := false;
if FAbort then Exit;
lLogHTTP := TLogHTTP.Create(nil);
Result := false;
if ABatchCount = 0 then
lNextID := ASelProps.GetNextIDValue
else
lNextID := ASelProps.GetSameIDValue;
lURL := StringReplace(ASelProps.URL,'{id}',lNextID,[rfReplaceAll,rfIgnoreCase]);
if ABatchCount <> 0 then
if Pos('?',lURL) = 0 then lURL := lURL + '?pageNumber=' + IntToStr(ABatchCount+1)
else lURL := lURL + '&pageNumber=' + IntToStr(ABatchCount+1);
try
SetHTTPJSONProperties(lLogHTTP);
try
lLogHTTP.Get(lURL);
if FAbort then
Exit;
lData := lLogHTTP.TransferredData;
if FSaveJSON then
begin
lBatchCount := ABatchCount;
TThread.Synchronize(nil,
procedure
begin
if lNextID = '' then
SaveToJSONFile(Format('%s batch (%d)',[ASelProps.TextID,lBatchCount]),lData)
else
SaveToJSONFile(Format('%s (%s) batch (%d)',[ASelProps.TextID,lNextID,lBatchCount]),lData);
end);
end;
if EmptyJSONArray(lData) then
lData
содержит действительные данные, возвращенные вызовом logHTTP
.
В точке останова (или где-либо еще в подпрограмме) lData
не отображается в локальных переменных и не может быть просмотрено или просмотрено.
IDE дает:
E2003 Необъявленный идентификатор: 'lData'
Этот материал работает в основном потоке, оптимизация отключена.
Если я закомментирую TThread.Synchronize
, lData
снова можно будет просмотреть/просмотреть.
Что здесь происходит?
(Добавлено) В комментариях Реми и Далия назвали причиной анонимную процедуру и связали это с проблемой Embarcadero RSP-22924 Watch показывает необъявленный идентификатор для захваченных локальных переменных (также сообщается в разделе RSP-21917).
Я все еще не понимаю: RSP-22924
был отредактирован, чтобы изменить его тип на Feature. Особенность? Мне это кажется ошибкой.
И: (Как) можно предотвратить такое поведение? Я бы очень хотел осмотреть lData
.
GetOneBatch()
? Есть ли шанс, чтоlData
перехватывается анонимной процедурой в коде, который вы еще не показывали? - person Remy Lebeau   schedule 10.08.2020TThread.Synchronize
. Я отредактировал вопрос, потому что до сих пор не понимаю, что здесь происходит. - person Jan Doggen   schedule 11.08.2020lData
захвачено, на самом деле это не локальная переменная дляGetOneBatch()
, поэтому вы ее не видите. На самом деле это член объекта реализации анонимной процедуры. Если вы внимательно посмотрите, то увидите, чтоlNextID
также отсутствует в окне Watch. Потому что его тоже захватывают. - person Remy Lebeau   schedule 11.08.2020