Вы должны понимать, что объекты являются ссылочными типами в Delphi, и что эти ссылки передаются по значению. Таким образом, ваша процедура
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;
никогда не изменит outputList
вызывающей стороны. Действительно, строка
outputList:=foundNodesList;
просто устанавливает собственную локальную переменную процедуры getNodeListByClass
outputList
, которая была только копией указателя на список строк вызывающей стороны. Следовательно, эта копия указателя изменяется, но фактический объект и указатель вызывающего абонента остаются неизменными.
Кроме того, даже если бы это было не так, в вашем коде была бы ошибка потому что
freeandnil(foundNodesList);
уничтожает объект списка строк foundNodesList
, и это тот же объект, на который outputList
указывает в этой точке. Следовательно, если бы вызывающая сторона смогла увидеть «новый» outputList
(если бы это был параметр var
), он увидел бы только висящий указатель (ошибка повреждения памяти).
Что вам нужно
procedure TmainForm.getNodeListByClass(const className: string; outputList: TStringList);
var
foundNode: TDomTreeNode;
foundNodesList: TStringlist;
begin
foundNodesList := TStringList.Create;
try
foundNode := nodeFindNodeByClassName(DomTree.RootNode, className);
if Assigned(foundNode) then
getNodeList(foundNode, foundNodesList);
outputList.Assign(foundNodeList);
finally
foundNodeList.Free;
end;
end;
при условии, что ваши функции выполняют то, что я думаю, они делают. Но это можно упростить до
procedure TmainForm.getNodeListByClass(const className: string; outputList: TStringList);
var
foundNode: TDomTreeNode;
begin
outputList.Clear;
foundNode := nodeFindNodeByClassName(DomTree.RootNode, className);
if Assigned(foundNode) then
getNodeList(foundNode, outputList);
end;
(я не знаю, хотите ли вы добавить список или заменить его. Вы должны соответствующим образом изменить код.)
Также обратите внимание что вы всегда должны защищать свои объекты, например, используя try..finally
блоки. Ваш код никогда не должен пропускать ресурсы (например, память), даже если возникает исключение!