use*_*073 2 delphi parameters pointers
在 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;
Run Code Online (Sandbox Code Playgroud)
我将此数据对象与树视图中的每个节点相关联,然后填写值。这工作正常......
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);
Run Code Online (Sandbox Code Playgroud)
我的挑战是,从 buttonClick 事件,我需要将此数据对象传递给另一个例程(在另一个单元中)来修改它,并将修改后的值提供给调用例程......这通常通过 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;
Run Code Online (Sandbox Code Playgroud)
问题是 ShowMessage 框总是空的,也就是 rRedirURL 没有像 VAR 声明那样被传回。
WebEvaluate 定义为
procedure WebEvaluate(Data1: TNodeRec);
begin
TNodeRec(Data1).rRedirURL := 'Test value'
ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end
Run Code Online (Sandbox Code Playgroud)
在 WebEvaluate 例程中,Data1.rRedirURL 分配了一个值。当我回到调用例程时,该值丢失了。我相信这与我如何传递 Data1 记录有关,但我不知道如何纠正它......我做错了什么?
谢谢
如果您要要求WebEvaluate修改其参数,则必须将其作为var. 根据您编写过程的方式,该过程获取参数值的副本,并对其进行修改。请记住,对按值传递的参数的修改在函数之外是看不到的。
改成这样:
procedure WebEvaluate(var Data1: TNodeRec);
begin
Data1.rRedirURL := 'Test value';
ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end;
Run Code Online (Sandbox Code Playgroud)
最重要的是,您实际上是将记录的副本传递给WebEvaluate. 看看这段代码:
var
BuffData : TNodeRec;
....
BuffData := TNodeRec(TV1.Selected.Data^);
Run Code Online (Sandbox Code Playgroud)
由于BuffData是记录,因此分配给BuffData副本。但是您需要修改存储在树视图中的记录,因此必须传递该记录,而不是副本。
因此,删除无用的局部变量BuffData。并像这样调用过程,传递存储在树视图中的记录:
WebEvaluate(TNodeRec(TV1.Selected.Data^));
Run Code Online (Sandbox Code Playgroud)
总结一下,你犯了两次同样的错误。您在局部变量中复制了记录。然后您将其传递给您的程序,该程序制作了另一个副本。