При работе с данными в формате JSON и отображении их в гриде на Delphi с помощью компонента DBXJson может возникнуть проблема, когда в грид попадают только данные из первой строки, даже если есть больше данных для отображения. Давайте рассмотрим типичный пример кода, который может привести к такой проблеме:
var
sl: TStringList;
LJsonArr: TJSONArray;
LJsonValue: TJSONValue;
LItem: TJSONValue;
col, row: Integer;
begin
col := 0;
row := 0;
sl := TStringList.Create;
sl.LoadFromFile('response.txt');
LJsonArr := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(sl.Text), 0) as TJSONArray;
for LJsonValue in LJsonArr do
begin
NextGrid1.AddRow();
for LItem in TJSONArray(LJsonValue) do
begin
NextGrid1.Cells[col, row] := TJSONPair(LItem).JsonValue.Value;
inc(col);
end;
inc(row);
end;
sl.Free;
end;
Проблема заключается в том, что переменная col, отвечающая за индекс столбца, не переинициализируется после завершения цикла по строкам. В результате, при каждой итерации цикла по строкам значение col продолжает расти, и данные записываются только в первую строку грида.
Чтобы исправить эту проблему, достаточно перенести инициализацию переменной col в начало цикла по строкам:
row := 0;
for LJsonValue in LJsonArr do
begin
col := 0;
NextGrid1.AddRow();
for LItem in TJSONArray(LJsonValue) do
begin
NextGrid1.Cells[col, row] := TJSONPair(LItem).JsonValue.Value;
inc(col);
end;
inc(row);
end;
Теперь данные из JSON-файла будут корректно отображаться в гриде.
Также стоит отметить, что если библиотека DBXJson поддерживает доступ к элементам массива с помощью индекса, то можно использовать традиционный цикл for с индексами для более чистого кода:
for row := 0 to arr.Length do
begin
item := arr[row];
for col := 0 to item.Length do
grid.Cells[col, row] := item[col];
end;
В целом, циклы for in удобны, когда не нужен индекс элемента, но как только появляется необходимость знать индекс, то лучше использовать традиционные циклы for с индексами.
Устранение проблемы с отображением данных в гриде в программе на Delphi с использованием DBXJson.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS