2014-11-03 85 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

相关问题