Как посмотреть общий tList во время отладки Delphi - PullRequest
4 голосов
/ 12 июня 2019

Я использую версию Delphi 10.3.1 COMMUNITY и не могу просматривать общий tList во время отладки проекта.

Я знаю, что последняя версия Delphi не поддерживает устаревшую функцию отладки, которая позволяетсмотреть в общий список.Поэтому я использовал tList.List в следующем коде для оценки tList.

В tList<tRecord>.List Я могу посмотреть на это, но не могу сделать это в tList<Integer>.List.

enter image description here

type
  tRecord = record
    Field: Integer;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  _Record: tRecord;
  _List1: TList<tRecord>;
  _List2: TList<Integer>;
  i: Integer;
begin
  _List1 := TList<tRecord>.Create;
  _List2 := TList<Integer>.Create;

  for i := 0 to 4 do
  begin
    _Record.Field := i;

    _List1.Add(_Record);
    _List2.Add(i);
  end;

  Caption := IntToStr(_List1.List[0].Field) + IntToStr(_List2.List[0]);

  _List1.Free;
  _List2.Free;
end;

Как посмотреть tList<Integer> во время отладки?

1 Ответ

6 голосов
/ 12 июня 2019

Обычно должно быть возможно видеть массив списков над свойством List.Внутри есть только поле типа Pointer в отличие от 10.3, когда оно было типа TArray<T>.

Это то, что я вижу, когда ставлю точку останова в строку, в которой оно присваивается Caption ипоместите эти две записи в мои часы:

enter image description here

Обновление: похоже, что линкер отвечает за проблему, с которой вы здесь столкнулись.Когда вы снимите флажок «разрешить побочные эффекты и вызовы функций» в часах

enter image description here

, в окне часов отобразится следующее:

enter image description here

Я видел такое поведение раньше, когда использовал дженерики, которые указаны только в части реализации модуля (FWIW, когда я пытался повторить это в первый раз, когда я не сделалпоместите код, который вы опубликовали, в проект VCL, но в консольный dpr, и у него нет части реализации, поэтому я не видел этого поведения).

Чтобы заставить компоновщик не удалять символ илиотладчик, чтобы фактически увидеть его (потому что даже если я отключу встраивание, чтобы заставить метод GetList остаться в окне наблюдения, я скажу, что оно было удалено), вы можете просто поместить некоторый фиктивный тип в interface часть этого или любого другого модуля.

type TDummy = TList<Integer>;

Это заставит отладчик видеть символ и видеть значения в окне часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...