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

翻译|其它|编辑:郝浩|2006-01-05 09:47:00.000|阅读 1370 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


代码如下所示:

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

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP