首页 > 解决方案 > TStringList 没有传递值

问题描述

所以我有一个程序,即获取 dom 节点列表。

procedure TmainForm.getNodeListByClass(className:string; outputList:TStringList);
var
  foundNode:TDomTreeNode;
  foundNodesList:TStringlist;
begin
foundNodesList:=Tstringlist.Create;

foundNode:=nodeFindNodeByClassName(DomTree.RootNode,className);
if Assigned(foundNode) then
    getNodeList(foundNode,foundNodesList);

outputList:=foundNodesList;
freeandnil(foundNodesList);
end;

以及使用它的程序

procedure TmainForm.getByXpathBtnClick(Sender: TObject);
var
  temp:TStringlist;

begin
temp:=TStringlist.Create;

temp.Add('testval');

getNodeListByClass('table_input',temp);
memo1.Lines:=temp;

getNodeListByClass('left iteminfo',temp);
dbgForm.memo1.Lines:=temp;

getNodeListByClass('left',temp);
dbgForm.memo2.Lines:=temp;

freeandnil(temp);
end;

我真的不明白,为什么它不起作用,第一个过程的结果总是空的。我发现,当第一个程序正在执行时,“foundNodesList”有正确的列表,并且将它设置为“outputList”也可以工作,但是一旦它返回到第二个程序(在“temp”列表中)它只是空的。所以它从“测试”(我一开始写的“testval”)中清除旧数据,但不添加第一个数据的结果。

有人能指出我正确的方向吗?

标签: delphiproceduretstringlist

解决方案


问题就在这里

outputList := foundNodesList;
FreeAndNil(foundNodesList);

该作业是参考作业。我认为您希望将 的内容foundNodesList转移到outputList. 但是发生的情况是,您最终会得到两个变量引用同一个实例。

您的代码可以很容易地修复。您不需要临时字符串列表,您可以简单地填充传递给方法的字符串列表。

procedure TmainForm.getNodeListByClass(className: string; outputList: TStringList);
var
  foundNode: TDomTreeNode;
begin
  outputList.Clear;
  foundNode := nodeFindNodeByClassName(DomTree.RootNode, className);
  if Assigned(foundNode) then
    getNodeList(foundNode, outputList);
end;

请注意,在您编写的其他函数中

memo1.Lines := temp;

这有点不同。a的Lines属性TMemo有一个属性设置器,它复制右侧,而不是获取引用。因此,您执行分配到的代码Lines是正确的。


推荐阅读