2014-01-29 35 views
2

在德爾福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; 

我把這個數據對象與treeview中的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事件,我需要這個數據對象傳遞到另一個程序(在其他單位)進行修改,並有可供修改的值調用例程...這通常通過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記錄有關,但我不知道如何糾正它... 我在做什麼錯了?

感謝

回答

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^)); 

總之你犯同樣的錯誤兩次。你在一個局部變量中創建了一條記錄的副本。然後你將它傳遞給你的另一個副本。