delphi - 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”)中清除旧数据,但不添加第一个数据的结果。
有人能指出我正确的方向吗?
解决方案
问题就在这里
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
是正确的。
推荐阅读
- oracle - 当需要在 oracle hrms 中定义第二个工资单时
- for-loop - 如何在 Robot Framework 中的多个变量上运行相同的关键字
- c# - 无法访问 web.config 的特定字段
- php - 如何避免在我的 PHP 应用程序运行到 Docker 容器中的配置上硬编码数据库凭据
- flutter - 我如何在颤振中读取带有相机预览的二维码
- spring - 如何在 Spring Security Framework 中动态调用 void configure(HttpSecurity http)
- angular - Hyperledger Composer - 在钱包/api 上发布返回错误:找不到中央目录的结尾
- java - Eclipse 和 Tomcat 的突然错误
- r - 通过不使用 for 循环继续计算平均值
- angular - 无法安装@angular/cli