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

通州纹渊阁

通州纹渊阁

2016-02-19 21:31

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享解决了datatree的‘死节点’问题吧。

  //问题描述见 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 (left0) and (right0)and (leftLeftBracketIndex(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;
      
        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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
解决了datatree的‘死节点’问题

MAYA节点连接问题

设计软件 平面设计软件 广告设计软件
MAYA节点连接问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

MAYA节点连接问题(1)

设计软件 平面设计软件 广告设计软件
MAYA节点连接问题(1)

MAYA节点连接问题(2)

设计软件 平面设计软件 广告设计软件
MAYA节点连接问题(2)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

详解Linux系统中inode索引节点已满问题的解决方法

服务器
详解Linux系统中inode索引节点已满问题的解决方法

解决了打开Jsp文件的可恶问题

Web开发
解决了打开Jsp文件的可恶问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Adobe CS3网站首页设计 第4讲

Adobe CS3网站首页设计 第4讲

ADO方式下判断数据表是否存在

ADO方式下判断数据表是否存在
下拉加载更多内容 ↓