Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 未调用for循环中的变量_Delphi_Variables_For Loop - Fatal编程技术网

Delphi 未调用for循环中的变量

Delphi 未调用for循环中的变量,delphi,variables,for-loop,Delphi,Variables,For Loop,我使用DBXJson解析一个名为response.json的简单json文件,并在网格中显示它的内容,但只有网格的第一行被数据填充,即使有更多的行/数据要显示。我在下面的代码中使用了一个自定义网格,但我尝试了下面代码的一个变体,使用了标准的stringgrid,它显示了相同的行为。这是我用来解析响应并在网格中显示它的代码 var sl: TStringList; LJsonArr: TJSONArray; LJsonValue: TJSONValue; LItem: TJSONV

我使用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;

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

问题是每次开始新行时,
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-in循环的代码更干净。在伪代码中:

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循环更好。然而,只要您需要知道项目索引,那么传统的循环索引通常是首选

缩进很差,这使得您很难对代码进行推理。最后,您必须学会调试。如果你只需一步一步地完成这段代码,你就能很容易地解决问题。我把这归咎于缩进。在我的应用程序中,它看起来很正常,但如果有那么大的不同,我会编辑它。好的,但我们不能告诉你。我们只需要假设你所看到的就是我们所看到的。无论如何,我的另一点是正确的。如果你走过去,你会看到col单调地增加。是的,从现在的代码中可以明显看出这一点,但是如果您在阅读代码时存在盲点,那么请在代码执行时检查其行为。我知道您对调试点的看法是正确的。我大约3个月前才开始学习Delphi,我可能花了比实际编写代码更多的时间尝试用试错法修复bug。我需要找到一个好的“简单”的来源,我可以开始学习。顺便说一句,再次感谢你的帮助。我理解。我猜了很多,因此我提出了建议。JSON库是Delphi附带的(即DBXJSON),因此我认为它将支持您发布的第二个代码示例。我想只有一种方法可以知道,那就是试试看。顺便说一句,谢谢你的回复。将col变量移出内部for循环修复了我遇到的问题。是的,我认为我已经将您的答案标记为正确。我现在就这样做。