2014-11-03 120 views
1

我正在編輯TVirtualStringTree中顯示節點的第二列。但是,編輯完成後,我無法使用Sender.GetNodeData(Node)檢索文本 - 它不包含文本。TVirtualStringTree:如何獲取編輯的文本?

如何獲取OnEdited事件中的文本?有沒有其他的方式來獲得編輯的文本?我已經閱讀了Virtual Treeview CHM幫助文檔的前幾個常見問題解答頁面,並且還提到了in this SO question的答案,但找不到答案。

這裏是本次代碼:

TTherapData = record 
    TherapID: Integer; 
    TherapName: String[120]; 
    TherapInstr: String[120]; 
    Selected: Byte; 
    end; 

    PTherapData = ^TTherapData; 

procedure TfmPatient_Conslt.vstRxList_AsgEdited(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex); 
var 
    TherapData: PTherapData; 
begin 
    TherapData := Sender.GetNodeData(Node); 
    if Assigned(TherapData) then 
    begin 
    TherapData^.TherapInstr := vstRxList_Asg.Text[Node, 1]; 
    showmessage(TherapData^.TherapInstr); 
    end; 

    FTherapDataListAsg_Iter := 0; 
    vstRxList_Asg.NodeDataSize := SizeOf(TTherapData); 
    vstRxList_Asg.RootNodeCount := 0; 
    vstRxList_Asg.RootNodeCount := TherapDataList_CountSelectedItems; 

end; 

回答

1

感謝來自TLama暗示,答案是處理OnNewText事件:

procedure TfmPatient_Conslt.vstRxList_AsgNewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; 
    NewText: string); 
var 
    TherapData: PTherapData; 
begin 

    if (Column = 1) then 
    begin 
    TherapData := Sender.GetNodeData(Node); 
    if Assigned(TherapData) then 
     TherapData^.TherapInstr := NewText; 
    end; 

end; 
+0

@RobKennedy:要麼有一個問題與回答或我的代碼有問題,因爲它沒有按預期工作。 GetNodeData返回的指針指向的地址與樹中存儲的地址不同。我通過檢查變量的地址(Debug-> Evaluate/Modify)來了解這一點。我該如何解決它?如果需要更多信息,我已準備好發佈完整的代碼,但它是一個非常長的單元。 – 2014-11-06 14:41:42

+0

@RobKennedy:我注意到這個問題,因爲我的數據庫'save'例程不能'看到'對數據的更新(在編輯樹中的單元格之後)。 – 2014-11-06 14:47:29

+0

很抱歉聽到這個消息。聽起來像你需要重新修復你的答案。接受它顯然是不成熟的。另一方面,我不確定你在這裏舉報的內容是否真的是你的答案的問題,或者是其他一些不相關的問題。做一些調試以縮小範圍。 [正如我之前解釋的,'GetNodeData'不一定會返回'Node.Data'](http://stackoverflow.com/a/26636017/33732)的實際地址,所以不要指望它。 – 2014-11-06 15:06:18

相關問題