我想做一个停靠窗口的功能,如下:
主窗口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中的控件都会被重新创建一次,或者说是先全部删除再重新添加!不知道是什么东西在作怪。请高手指点迷津!
主窗口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中的控件都会被重新创建一次,或者说是先全部删除再重新添加!不知道是什么东西在作怪。请高手指点迷津!
procedure TForm2.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
ShowMessage(Node.Text+' is deleted!');
end;
运行后,停靠和浮动ToolForm,你会看到若干提示信息,说明所有的节点都会被删除一次。
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所删除的