在frmmain里放置一个panel1,然后把frmdetail的parent设置为panel1,把frmdetail里的toolbar1的parent设为frmmain
另外,还加了一个vclskin,为了使vclskin的效果不消失(大家知道,vclskin在这种情况下会失去效果),
核心代码是这么写的:
procedure ShowChildForm(childFrm: TForm; toolBar: TToolBar;
  statusBar: TStatusBar; ownerPnl: TPanel; ownerFrm: TForm; skinData: TSkinData);
begin
  LockWindowUpdate(ownerFrm.Handle);
  try
    with childFrm do
    begin
      BorderStyle:= bsNone;
      Visible:= false;
      Parent:= ownerPnl;      try
        toolBar.Parent:= ownerFrm;
        statusBar.Parent:= ownerFrm;
      except
      end;      Align:= alClient;
      skinData.AddNestForm(ownerFrm, childFrm);
      skinData.UpdateSkinControl(ownerFrm);
      Visible:= true;
      SetFocus;
    end;
  except;
  end;
  LockWindowUpdate(0);
  childFrm.Show;
end;
界面显示的时候有明显的闪动,我把frmmain和panel1的DoubleBuffered都设为true也于事无补高手帮忙啊

解决方案 »

  1.   

    我不知道LockWindowUpdate的效果是否和SendMessage(ownerFrm.Handle, WM_SETREDRAW, 1, 0)相同,我是用后者来锁定UPDATE的,然后最后用RedrawWindow来刷新界面,能解决闪烁的问题。
      

  2.   

    procedure ShowChildForm(childFrm: TForm; toolBar: TToolBar;
      statusBar: TStatusBar; ownerPnl: TPanel; ownerFrm: TForm; skinData: TSkinData);
    begin
      LockWindowUpdate(ownerFrm.Handle);
      try
        with childFrm do
        begin
          BorderStyle:= bsNone;
          Visible:= false;
          Parent:= ownerPnl;      try
            toolBar.Parent:= ownerFrm;
            statusBar.Parent:= ownerFrm;
          except
          end;      Align:= alClient;
          skinData.AddNestForm(ownerFrm, childFrm);
          skinData.UpdateSkinControl(ownerFrm);
    //      Visible:= true;
    //      SetFocus;

        end;
      except;
      end;
      LockWindowUpdate(0);
      childFrm.Show;
    end;
      

  3.   

    Lock了之后即使visible出来也不重绘的吧?