for循环中的变量未被调用

时间:2014-08-23 06:26:21

标签: delphi variables for-loop

我正在使用DBXJson来解析一个名为response.json的简单json文件并在网格中显示它的内容,但只有网格的第一行才会填充数据,即使有要显示的更多行/数据。我在下面的代码中使用自定义网格,但我尝试使用标准stringgrid下面的代码的变体,它表现出相同的行为。这是我用来解析响应并在我的网格中显示它的代码。

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;

我怀疑问题在于row变量不合适并且没有被调用,这只会导致第一行显示,但我可能会弄错,我希望一双新鲜的眼睛可以发现问题。

1 个答案:

答案 0 :(得分:4)

问题是每次开始新行时都必须将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库,但如果它允许你访问具有随机访问权限的数组元素,那么传统的oindexed for循环将导致更清晰的代码,即你使用的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;

根据经验,如果您不需要知道项目索引,那么in循环会更好。但是,只要您需要知道项目索引,那么传统的索引for循环通常是首选。