gpt4 book ai didi

Delphi - 传递指针到记录

转载 作者:行者123 更新时间:2023-12-02 03:22:05 25 4
gpt4 key购买 nike

在德尔福 2010 中,我有一个 TreeView 。 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;

我将此数据对象与 TreeView 中的每个节点相关联,然后填写值。这很好用......

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 框始终为空,即 rRedirURL 不会像 VAR 声明那样被传回。

WebEvaluate 定义为

procedure WebEvaluate(Data1: TNodeRec);
begin
TNodeRec(Data1).rRedirURL := 'Test value'
ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end

在 WebEvaluate 例程中,Data1.rRedirURL 已分配一个值。当我回到调用例程时,该值丢失了。我相信这与我传递 Data1 记录的方式有关,但我不知道如何纠正它......我做错了什么?

谢谢

最佳答案

如果您要要求 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 的赋值会获取一个副本。但是您需要修改存储在 TreeView 中的记录,因此必须传递该记录,而不是副本。

因此,删除没有任何作用的局部变量 BuffData。并像这样调用过程,传递存储在 TreeView 中的记录:

WebEvaluate(TNodeRec(TV1.Selected.Data^));

总而言之,你犯了两次同样的错误。您在局部变量中创建了记录的副本。然后,您将其传递给您的程序,该程序制作了另一个副本。

关于Delphi - 传递指针到记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com