将指针传递给记录

在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框始终是空的,又名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需要一个副本。 但是你需要修改存储在树视图中的记录,所以必须传递该记录,而不是副本。

所以,删除没有用处的局部变量BuffData 。 并像这样调用过程,传递存储在树视图中的记录:

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

总结一下,你犯了两次相同的错误。 你在一个局部变量中创建了一条记录的副本。 然后你将它传递给你的另一个副本。

链接地址: http://www.djcxy.com/p/34941.html

上一篇: Passing pointers to records

下一篇: Indenting Problem