Невозможно проверить (одну) локальную строковую переменную

(Основываясь на комментариях, я отредактировал вопрос, сосредоточив внимание на фактической части кода, вызывающей проблему, и добавил раздел в конце)


Это окно локальных переменных в моем приложении 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.


person Jan Doggen    schedule 10.08.2020    source источник
comment
@JanDoggen, как выглядит остальная часть GetOneBatch()? Есть ли шанс, что lData перехватывается анонимной процедурой в коде, который вы еще не показывали?   -  person Remy Lebeau    schedule 10.08.2020
comment
Я не вижу этого в вашем коде (или я пропустил это... жду новых очков), но то же самое происходит, если локальная переменная захватывается анонимным методом quality.embarcadero.com/browse/RSP-22924   -  person Dalija Prasnikar    schedule 10.08.2020
comment
Здесь может быть полезно объявление LogViaSynchronize.   -  person Uwe Raabe    schedule 10.08.2020
comment
@remy Действительно TThread.Synchronize. Я отредактировал вопрос, потому что до сих пор не понимаю, что здесь происходит.   -  person Jan Doggen    schedule 11.08.2020
comment
@JanDoggen см. Механизм связывания переменных и Как внутри реализованы анонимные методы?. Поскольку lData захвачено, на самом деле это не локальная переменная для GetOneBatch(), поэтому вы ее не видите. На самом деле это член объекта реализации анонимной процедуры. Если вы внимательно посмотрите, то увидите, что lNextID также отсутствует в окне Watch. Потому что его тоже захватывают.   -  person Remy Lebeau    schedule 11.08.2020