转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
解决了datatree的‘死节点’问题         ★★★★

解决了datatree的‘死节点’问题

作者:闵涛 文章来源:闵涛的学习笔记 点击数:641 更新时间:2009/4/23 18:26:19

//问题描述见 howto 一文,代码最终版本见下文

//标红色部分为解决问题的关键

//标蓝色部分为datatree所要求的,即前文提供的解决方案,但并不奏效

procedure TScriptProperty.DataTreeDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  pnode2: PAdminNode;
  data: PInt;
  Node2: PVirtualNode;
  sql: string;

  changeList: TStringList;
  FocusNode: PVirtualNode;
  TargetNode: PVirtualNode;
  Temp:PVirtualNode;
  i: Integer;
  left,right,targe:Integer;
begin
  Effect := DROPEFFECT_NONE;
  if (Source is TBaseVirtualTree) then
  begin
    Node2 := (Source as TBaseVirtualTree).GetFirstSelected;
    data := (Source as TBaseVirtualTree).GetNodeData(Node2);
    pnode2 := Pointer(data^);

    FocusNode := Sender.GetFirstSelected;
    TargetNode := Sender.DropTargetNode;

    left :=LeftBracketIndex(FocusNode);
    right:=RightBracketIndex(FocusNode);
    if TargetNode <> nil then
      targe := TargetNode.Index
    else
      targe := -1;
    if (Source as TBaseVirtualTree).Name = ''''DataTree'''' then
    begin
      if DataTree.DropTargetNode = nil then Exit;
      if DataTree.DropTargetNode.Index = 0 then Exit;
      changeList := TStringList.Create;

      DataTree.BeginUpdate;

//块拖动问题

      if (left<>0) and (right<>0)and (left<>LeftBracketIndex(TargetNode))and (right <>RightBracketIndex (TargetNode)) then  //后两个条件解决了同一块类不能移动的问题
      begin
        if  right< targe then
        begin
           if (LeftStr(stringlist.Strings[targe],5)=''''While'''') or (LeftStr(stringlist.Strings[targe],3)=''''for'''') then
              Exit;
           for i:=right+ 1 to targe do
               changeList.Add(stringlist.Strings[i]);
           for i:=left-1 to right do
               changeList.Add(stringlist.Strings[i]);
           for i:=left-1 to targe do
               stringlist.Strings[i]:= changeList.Strings[i-left+1];
        end;

        if  (left-1)> targe then
        begin
          if (stringlist.Strings[targe]=''''{'''')  then
              exit;
          for i:=left-1 to right do
              changeList.Add(stringlist.Strings[i]);
          for i:=targe to left-2 do
              changeList.Add(stringlist.Strings[i]);
          for i:=targe to right do
              stringlist.Strings[i]:= changeList.Strings[i-targe];
        end;
      end
      else
      begin
        if FocusNode.Index > TargetNode.Index then
        begin
          if (stringlist.Strings[TargetNode.Index]=''''{'''')  then
              exit;
          changeList.Add(stringlist.Strings[FocusNode.index]);
          for i:=TargetNode.Index to FocusNode.Index-1 do
              changeList.Add(stringlist.Strings[i]);
          for i:=TargetNode.Index to FocusNode.Index do
              stringlist.Strings[i]:= changeList.Strings[i-TargetNode.Index];
        end;

//行拖动问题   

     if FocusNode.Index < TargetNode.Index then
        begin
          if (LeftStr(stringlist.Strings[TargetNode.Index],5)=''''While'''') or (LeftStr(stringlist.Strings[TargetNode.Index],3)=''''for'''') then
              Exit;
          for i:=FocusNode.Index+1 to targetnode.Index do
              changeList.add(stringlist.Strings[i]);
          changeList.Add(stringlist.Strings[FocusNode.index]);
          for i:=FocusNode.Index to TargetNode.Index do
              stringlist.Strings[i]:= changeList.Strings[i-FocusNode.Index];
        end;
      end;
      changeList.Free;
      DataTree.EndUpdate;
      DataTree.Clear; //只加了这行代码就解决了!原理:重画了整个树,就不存在width cach的问题了
      self.DataTree.RootNodeCount:=stringlist.Count;
      DataTree.Refresh;
      Exit;
    end
    else if pnode2.typename = ''''MobileUserAgent'''' then
    begin
      if targe > 0 then
        stringlist.Insert(targe, CreateUserAgentCode(pnode2.data))
      else
        stringlist.Append(CreateUserAgentCode(pnode2.data));
      self.DataTree.RootNodeCount:=stringlist.Count;
      DataTree.Refresh;
      Exit;
    end

//脚本拖动问题
    else
    begin
      if application.MessageBox(''''Are you sure to replace current script?'''', ''''Message'''', MB_OKCANCEL) = IDCancel then
        exit;

      sql := ''''Select texts from systemobjects where itemid='''''''''''' + pnode2.id + '''''''''''''''';
      currentdatabase.ExeuteSQlQurey(pnode2, sql, @GetScriptFromDB);
      Self.SetScript(pnode2.texts);
      Exit;
    end;
  end;
end;

『绝对原创 飞飞于北京 2005-08-31』


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台