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

2016-02-19 21:31 10 1 收藏

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

【 tulaoshi.com - 编程语言 】

  //问题描述见 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^);

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

      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;

(本文来源于图老师网站,更多请访问http://www.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;

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

来源:http://www.tulaoshi.com/n/20160219/1626399.html

延伸阅读
标签: 心理健康
症状是心理障碍患者最纠结的东西,每个走进心理咨询室的求助者,必然首先述说他的症状——老师,我的喉咙一直不受控制地吞咽,非常苦恼;老师,我的情绪好低落,实在太伤感了,如何调整都无济于事;老师,我的后脑里面有一个光圈,挥之不去……当然,咨询师首先问及的也是症状——什么情况?哪里不舒服?&hellip...
标签: 生活常识
脚崴了肿了的解决方法   脚崴是我们生活中几乎每个人都会遇到的问题,有时候在自己不小心的时候脚就会被崴到,而且有时候脚崴后当时没有什么症状,过一会脚就会肿起来,这个时候很多人都不知怎么处理,有时候只能自己忍受着疼痛,所以,今天小编就给大家介绍一下脚崴了肿了的解决方法。 有时候不小心脚崴了,就会又肿又痛,如果...
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.util; import java.io.UnsupportedEncodingException; import java.sql.*; /** * * @author swing */ public class DbUtility {     private Connection conn = null;     private ResultSe...
饮食治疗 黄花菜 可煲汤喝,亦可炒菜吃。 其富含蛋白质、糖、Vc、钙、胡萝卜素、氨基酸等人体必须成分。有安神养脑,平心顺气之功效。早在古时就被称为“忘忧草”,又名“萱草”。《本草纲目》有云:“烹食可适口,能去湿利水,除热通淋,开胸宽膈,令人心平气和,无有忧郁,故以萱名”。 酸枣 ...
标签: 电脑入门
我安装了Windows 98和 Windows XP 的双系统,今天系统无法正常开机了,弹出NTLDR is missing的信息,请问如何解决? NTLDR是Windows XP启动时的一个重要引导文件。上面的提示信息说明你的电脑中该文件已经丢失,可以直接从其他同版本系统中的C盘拷贝一个过来或是直接从Windows XP安装光盘中提取一个出来存放到你的C盘中即可,如果怕麻烦,直接...

经验教程

635

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部