我想做一个停靠窗口的功能,如下:
主窗口MainForm中有一个左对齐的DockPanel:TPanel控件,DockSite=true。另外有一个工具窗口ToolForm:TForm, DragKind:=dkDock; DragMode:=dmAutomatic; FormStyle:=fsStayOnTop。ToolForm中有一个TreeView:TTreeView,里面有若干节点。问题是:当我把ToolForm停靠到MainForm.DockPanel中,或者从MainForm.DockPanel中浮动ToolForm时,动不动就将TreeView中的节点全部清除了!后来换成TEdit等,也是如此!不知道是什么原因!我在别的机器上试了一下,也同样的问题。
大概研究了一下,发现ToolForm在DockPanel中停靠或浮动时,ToolForm中的控件都会被重新创建一次,或者说是先全部删除再重新添加!不知道是什么东西在作怪。请高手指点迷津!

解决方案 »

  1.   

    我也不太明白,不过我想这可能和它在停靠后的parent发生了变化有关
      

  2.   

    我给你看了一下,没有问题,Edit和treeview的内容都没有变化你有什么问题可以加我QQ:17042473 说
      

  3.   

    shadowfish(0℃):表面上没有变化,其实有的。请按下面的办法试一试。在ToolForm的TreeView中添加事件处理:
    procedure TForm2.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
      ShowMessage(Node.Text+' is deleted!');
    end;
    运行后,停靠和浮动ToolForm,你会看到若干提示信息,说明所有的节点都会被删除一次。
      

  4.   

    呵呵,奇妙了,加了你这个代码,当我把ToolForm从Panel中拖出来的时候居然MainForm具备不了焦点了,偶好好看看!
      

  5.   

    FrameSniper(§绕瀑游龙§) :这只是问题之一,你也会发现我所述的那个现象的。
      

  6.   

    删除然后重建又怎么了?是delphi的内部机制,显示很正常呀,有问题吗?
      

  7.   

    楼上:问题没有那么简单。如果控件的创建和删除对于我的程序来说有别的特殊处理呢,那么Delhi本身的“删除然后重建”不是很在恶意捣乱吗?
      

  8.   

    http://expert.csdn.net/Expert/topic/2284/2284381.xml?temp=4.58926E-03我也遇到,这问题不稳定出现,前几天总是有,现在又一会又一会没有了。
      

  9.   

    FrameSniper(§绕瀑游龙§) 好好学习
      

  10.   

    不只是重绘,它将里面的数据都清空了,count为0;主要是时有时无。
      

  11.   

    主要就是当停放时或拖出时Parent改变
    procedure TControl.SetParent(AParent: TWinControl);
    begin
      if FParent <> AParent then
      begin
        if AParent = Self then
          raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
        if FParent <> nil then
          FParent.RemoveControl(Self);
        if AParent <> nil then
        begin
          AParent.InsertControl(Self);
          UpdateAnchorRules;
        end;
      end;
    end;FParent.RemoveControl会删除控件,然后在新的Parent中又重建控件
    没有什么办法,如果判断在Dock状态下删除的
    我想的是在BeginDock, EndDock做一边量,用于记录是不是在由于Dock所删除的