在Delphi 2010中, 我有一个TreeView。树视图有一个数据对象,定义为记录。
// Define the Data Object that will be associated with each Node
type
TNodeRec = record
rId: Integer;
rDate: TDateTime;
rSite: string;
rURL: string;
rRedirURL: string;
rTitle: string;
rCategory: String;
rURL_RtnCode: Integer;
rURL_RtnText: String
end;
我将此数据对象与树视图中的EACH节点相关联,然后填写值。这很好....
var
BuffData: ^TNodeRec; // The data object associated with each node;
URLNode: TTreeNode;
begin
...
// Create our New Data Object
new(BuffData);
BuffData^.rId := 0;
BuffData^.rDate := EDate;
BuffData^.rURL := ElString;
BuffData^.rRedirURL := '';
BuffData^.rTitle := ElText;
URLNode := TV1.Items.AddChildObject(nil, BuffData^.rTitle, BuffData);
我的挑战是,从buttonClick事件,我需要将此数据对象传递给另一个例程(在另一个UNIT中)来修改它,并将修改后的值提供给调用例程...这通常通过一个VAR声明,但我不知道我需要它,因为我已经将它声明为记录的指针。
无论如何,我的ButtonClick事件看起来像这样......
procedure TURLListForm.btnEvalSelectedClick(Sender: TObject);
var
SelNode : TTreeNode;
BuffData : TNodeRec;
begin
// verify there is a node selected
...
BuffData := TNodeRec(TV1.Selected.Data^);
WebEvaluate(BuffData);
ShowMessage(TNodeRec(TV1.Selected.Data^).rRedirURL);
end;
问题是ShowMessage框总是为空,也就是说rRirirURL没有像VAR声明一样被传回。
WebEvaluate定义为
procedure WebEvaluate(Data1: TNodeRec);
begin
TNodeRec(Data1).rRedirURL := 'Test value'
ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end
在WebEvaluate例程中,Data1.rRedirURL已分配值。当我回到调用例程时,该值将丢失。我相信它与我如何传递Data1记录有关,但我不知道如何纠正它... 我做错了什么?
由于
答案 0 :(得分:4)
如果您要求WebEvaluate
修改其参数,则必须将其作为var
传递。编写过程的方式,过程获取参数值的副本,并修改它。请记住,在函数外部不能看到对通过值传递的参数的修改。
将其更改为:
procedure WebEvaluate(var Data1: TNodeRec);
begin
Data1.rRedirURL := 'Test value';
ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end;
最重要的是,您实际上是将记录的副本传递给WebEvaluate
。看看这段代码:
var
BuffData : TNodeRec;
....
BuffData := TNodeRec(TV1.Selected.Data^);
由于BuffData
是一条记录,因此BuffData
的分配需要一份副本。但是您需要修改存储在树视图中的记录,因此必须传递该记录,而不是副本。
因此,删除没有用处的局部变量BuffData
。并调用这样的过程,传递存储在树视图中的记录:
WebEvaluate(TNodeRec(TV1.Selected.Data^));
总结一下你犯了同样的错误两次。您在局部变量中创建了记录的副本。然后,您将其传递给您制作另一份副本的程序。