起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 326|回复: 19

【结帖】[请求]TCustomTreeView子类树节点重命名取值**

[复制链接]
发表于 2008-6-28 10:28:12 | 显示全部楼层 |阅读模式
Business.Forms.TCustomTreeView
该类的方法
procedure Edit(Item: Business.System.tagTVITEMA); virtual;
在子类的方法覆盖中如何得到所编辑的节点最终值?

参数的介绍没有呀?
回复

使用道具 举报

发表于 2008-6-28 11:31:51 | 显示全部楼层
没有介绍的,楼主现在是想要干嘛?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-29 10:52:11 | 显示全部楼层
要实现一个DBTreeView的功能,树上的每个节点对应表中的每条记录,节点切换记录动态定位(双向),设置热键F2重命名树节点时,类似Win资源管理器中文件夹改名的效果,改名后键盘回车确认或鼠标单击其它空白处时,得到重命名后的改节点取值,动态更新对应的数据记录DisplayField字段值,而这个带数据感知的树型控件就是由TTreeView继承而来,封装了包括DisplayField的属性。

我现在覆盖了方法procedure Edit(Item: Business.System.tagTVITEMA); virtual;
取pizText(第二三个字母记不很准了,现在家里没法试),当有改名的时候能取到新的节点显示名,如果什么都不做同时确认,就会把之前的节点显示名都给清空了,级联清空到DisplayField字段,不知到有没有比较完美的解决方法?
回复 支持 反对

使用道具 举报

发表于 2008-6-30 08:20:30 | 显示全部楼层
楼主,系统不是有DataTreeView控件吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:07:13 | 显示全部楼层
就是因为DataTreeView不好用呀,又没有源码,领导安排我重写一个!~~
回复 支持 反对

使用道具 举报

发表于 2008-6-30 10:12:11 | 显示全部楼层
呵呵,楼主查看一下delphi的帮助吧,这是个delphi6的控件
或者,直接看一下这个控件的源代码(ComCtrls.pas)单元
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:47:44 | 显示全部楼层
procedure TCustomTreeView.Edit(const Item: TTVItem);
var
  S: string;
  Node: TTreeNode;
begin
  with Item do
  begin
    Node := GetNodeFromItem(Item);
    if pszText <> nil then
    begin
      S := pszText;
      if Assigned(FOnEdited) then FOnEdited(Self, Node, S);
      if Node <> nil then Node.Text := S;
    end
    else if Assigned(FOnCancelEdit) then FOnCancelEdit(Self, Node);
  end;
end;

function TCustomTreeView.GetNodeFromItem(const Item: TTVItem): TTreeNode;
begin
  Result := nil;
  if Items <> nil then
    with Item do
      if (state and TVIF_PARAM) <> 0 then
        Result := Pointer(lParam)
      else
        Result := Items.GetNode(hItem);
end;

  TTVItemA = tagTVITEMA;
  TTVItemW = tagTVITEMW;
  TTVItem = TTVItemA;


  tagTVITEMA = packed record
    mask: UINT;
    hItem: HTreeItem;
    state: UINT;
    stateMask: UINT;
    pszText: PAnsiChar;
    cchTextMax: Integer;
    iImage: Integer;
    iSelectedImage: Integer;
    cChildren: Integer;
    lParam: LPARAM;
  end;

私有方法function TCustomTreeView.GetNodeFromItem(const Item: TTVItem): TTreeNode;
实现里,
        Result := Pointer(lParam)
方法procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
实现里,类似
      TVN_ENDLABELEDIT: Edit(PTVDispInfo(NMHdr)^.item);
多次涉及指针类型,而据我所知,X3平台不支持指针,所以不知类似的功能是怎么迁移过来的……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:56:16 | 显示全部楼层
另:我现在这里发贴极为不便,得到公共上网区,能否邮件联系?我设置5分钟一收,专候您的答复,谢谢!!
s0181@tom.com
回复 支持 反对

使用道具 举报

发表于 2008-6-30 10:57:38 | 显示全部楼层
哦,一般都是封装第三方控件实现的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 11:01:52 | 显示全部楼层
平台里DataTreeView的实现是封装的第三方控件么?而且这第三方控件就已经替换了指针类型为对象类型么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 20:13 , Processed in 0.043322 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表