程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 解決了datatree的‘死節點’問題

解決了datatree的‘死節點’問題

編輯:Delphi
//問題描述見 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;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved