我有一个VirtualStringTree(VST),其中的节点具有以下数据结构:
Type
PMyNodeData = ^TMyNodeData;
TMyNodeData = record
Cost:UnicodeString;
end;
没有任何子节点的子节点具有成本值,但任何父节点具有等于0的成本值,并且我正在尝试编写程序,使任何父节点的成本值等于其所有子节点的成本之和。
我试过下一个:
procedure CalculateSum(Node:PVirtualNode);
var
Data: PMyNodeData;
ChildNode: PVirtualNode;
ChildData: PMyNodeData;
CostSum: Extended;
begin
Data := VST.GetNodeData(Node);
CostSum := 0.0;
ChildNode := VST.GetFirstChild(Node);
while Assigned(ChildNode) do
begin
ChildData := VST.GetNodeData(ChildNode);
CostSum := CostSum + StrToFloat(ChildData.Cost);
CalculateSum(ChildNode);
ChildNode := VST.GetNextSibling(ChildNode);
end;
if VST.HasChildren[Node] and (StrToFloat(Data.Cost) = 0) then
Data.Cost := FloatToStr(CostSum);
end;
用途:
CalculateSum(vst.RootNode);
但我得到访问违规&总和是不正确的..任何建议。
2条答案
按热度按时间wfsdck301#
您正在计算子代的
Cost
之前访问它。您需要在将其Cost
添加到CostSum
之前 * 调用CalculateSum(ChildNode)
,而不是像当前所做的那样在 * 之后 * 调用。此外,您没有指定
PMyDataNode
是否始终为nil
,或者TMyNodeData.Cost
是否包含值为0的节点的空字符串。如果您为StrToFloat()
提供空字符串,则StrToFloat()
将引发异常。如果可能,请改用StrToFloatDef()
或TryStrToFloat()
。试试这样的方法:
话虽如此,我还是建议将
TMyNodeData.Cost
存储为Double
/Extended
而不是UnicodeString
,所有这些转换都是不必要的开销。试试这个:
bcs8qyzn2#
我已经解决了这个问题作为下一个: