datatree和数据库绑定的最少代码

转载 2006年05月22日 19:46:00

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


DropDownList和数据库绑定实例

  1 数据库表格--数据库图片分类  -----typeid subtypeid  typename图片信息picid subtypeid picname filename serverfile m...
  • gbys
  • gbys
  • 2007年07月09日 09:00
  • 1041

redis缓存中写入数据与数据库数据同步

这个就是在执行数据的方法之前或之后写入, 例子: ValueOperations value = redisTemplate.opsForValue();   value.set("lockse...
  • anmoyyh
  • anmoyyh
  • 2017年07月07日 10:29
  • 179

行人检测代码和数据库

一、论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the st...
  • xuanzi_eli
  • xuanzi_eli
  • 2016年05月13日 12:27
  • 1442

数据仓库和数据库有什么区别

数据仓库是面向分析的,数据库是面向事务处理. 数据仓库的数据是基本不变得,而数据库的数据是由日常的业务产生的,常更新 数据仓库的数据一般有数据库的数据经过一定的规则转换得到得 数据仓库主要...
  • johnjobs
  • johnjobs
  • 2014年07月09日 18:07
  • 1053

Redis和硬盘数据库一起使用好吗?

原文地址:http://redis.io/topics/faq Is using Redis together with an on-disk database a good idea? Ye...
  • tanga842428
  • tanga842428
  • 2016年09月23日 18:23
  • 318

数据库和网络工程师哪一个比较有用?

大家评价一下:是在以后的工作生活中是网络工程师的知识用得比较多,还是数据库?...
  • YXMUFO
  • YXMUFO
  • 2011年06月20日 23:41
  • 340

数据库与数据仓储的本质区别

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:明说 链接:http://www.zhihu.com/question/20623931/answer/221917...
  • liu048074leiliu
  • liu048074leiliu
  • 2015年11月01日 16:45
  • 1049

数据库表字段/JSP页面Input域name属性/项目entity类成员变量名称一致

数据库表字段/JSP页面Input域name属性/项目entity类成员变量名称一致
  • chengp919
  • chengp919
  • 2017年08月02日 22:25
  • 194

数据库实例和数据库关系

相关与数据库,有连接、实例、会话、数据库、线程等概念,他们之间的关系今天看到篇文章和我理解的很像。可以参考。是以MySql为例的。 MySQL中的实例、数据库关系简介 1、MySQL是单进程多线程(...
  • jacky_zh
  • jacky_zh
  • 2016年12月01日 16:08
  • 1501

springboot (5) 与数据库进行交互

本篇开始讲述springboot项目如何与数据库交互,本篇大致分为两部分:   一.与数据库建立连接   二.使用spring data  jpa与数据库进行交互 一、与数据库建立连接,...
  • qq_33540325
  • qq_33540325
  • 2017年07月13日 17:00
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:datatree和数据库绑定的最少代码
举报原因:
原因补充:

(最多只允许输入30个字)