【问题标题】:Delphi - Passing pointers to recordsDelphi - 将指针传递给记录
【发布时间】:2014-01-29 15:00:57
【问题描述】:

在 Delphi 2010 中, 我有一个树视图。树视图有一个定义为记录的数据对象。

// 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;

我将此数据对象与树视图中的每个节点相关联,然后填写值。这工作正常....

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 记录有关,但我不知道如何更正它...... 我做错了什么?

谢谢

【问题讨论】:

    标签: delphi pointers parameters


    【解决方案1】:

    如果您要让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^));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多