2014-01-29 3 views
2

Delphi 2010에서 TreeView가 있습니다. treeview에는 레코드로 정의 된 데이터 객체가 있습니다.Delphi - 레코드에 대한 포인터 전달

// 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 선언을 통해 수행되지만 필자는 이것을 레코드에 대한 POINTER로 선언 했으므로 필요 없다는 것을 알지 못합니다.

어쨌든, 내 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; 

문제는이 VAR 선언 예정대로 것처럼 ShowMessage 상자가 항상 비어 있는지 일명 rRedirURL가 다시 전달 가져 오지입니다 ... 다음과 같습니다.

WebEvaluate가 WebEvaluate 루틴 내에서

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

으로 정의된다, Data1.rRedirURL는 할당 된 값이 있습니다. 호출 루틴으로 돌아 가면 값이 손실됩니다. 데이터 1 레코드를 전달하는 방법과 관련이 있다고 생각하지만이를 수정하는 방법을 알지 못합니다 ... 무엇이 잘못 되었나요?

감사

답변

4

당신은 var로 전달해야 그 매개 변수를 수정 WebEvaluate을 요청하려는 경우. 당신이 프로 시저를 작성하는 방법은 프로 시저가 매개 변수 값의 복사본을 취하여이를 수정합니다. 값으로 전달 된 매개 변수 수정은 함수 밖에서 볼 수 없음을 기억하십시오. 그것과 같이 될

변경 : 그 꼭대기에

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

당신은 실제로 WebEvaluate에 기록의 사본을 전달한다. 이 코드를보고 : BuffData 이후

var 
    BuffData : TNodeRec; 
.... 
BuffData := TNodeRec(TV1.Selected.Data^); 

는 기록이, BuffData에 할당 사본을 걸립니다. 그러나 트리보기에 저장된 레코드를 수정해야하므로 복사본이 아닌 해당 레코드를 전달해야합니다.

따라서 로컬 변수 BuffData을 제거하십시오. 트리보기에 저장된 레코드를 전달하여 이와 같은 프로 시저를 호출하십시오.

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

요약하면 실수를 두 번 반복했습니다. 로컬 변수에서 레코드의 복사본을 만들었습니다. 그런 다음 절차에 전달하여 다른 사본을 만들었습니다.

관련 문제