不使用showModal,不设置fsStayOntop,不使用MDI窗口

解决方案 »

  1.   

    呵呵,showModal 设置fsStayOntop多简单啊。
      

  2.   

    呵呵,showModal 设置fsStayOntop多简单啊。
      

  3.   

    那就要在点击主窗体时使用
    SetForegroundWindow(前端窗体.handle),来把窗体置前
      

  4.   

          SetWindowPos(Form.Handle,HWND_TOPMOST, 0,0,0,0,
             SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW);
      

  5.   

    ForceForegroundWindow 是一个增强的 SetForeGroundWindow 函数。function ForceForegroundWindow(hwnd: THandle): boolean; 
    const 
      SPI_GETFOREGROUNDLOCKTIMEOUT = $2000; 
      SPI_SETFOREGROUNDLOCKTIMEOUT = $2001; 
    var 
      ForegroundThreadID: DWORD; 
      ThisThreadID      : DWORD; 
      timeout           : DWORD; 
    begin 
      if IsIconic(hwnd) then ShowWindow(hwnd  SW_RESTORE); 
      if GetForegroundWindow = hwnd then Result := true 
      else begin 
        // Windows 98/2000 doesn't want to foreground a window when some other 
        // window has keyboard focus 
        if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or 
          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and 
          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then 
          begin 
          // Code from Karl E. Peterson  www.mvps.org/vb/sample.htm 
          // Converted to Delphi by Ray Lischner 
          // Published in The Delphi Magazine 55  page 16 
          Result := false; 
          ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow nil); 
          ThisThreadID := GetWindowThreadPRocessId(hwnd nil); 
          if AttachThreadInput(ThisThreadID  ForegroundThreadID  true) then 
          begin 
            BringWindowToTop(hwnd); // IE 5.5 related hack 
            SetForegroundWindow(hwnd); 
            AttachThreadInput(ThisThreadID  ForegroundThreadID  false); 
            Result := (GetForegroundWindow = hwnd); 
          end; 
          if not Result then begin 
            // Code by Daniel P. Stasinski   
            SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT  0  @timeout  0); 
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT  0  TObject(0)  SPIF_SENDCHANGE); 
            BringWindowToTop(hwnd); // IE 5.5 related hack 
            SetForegroundWindow(hWnd); 
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT  0  TObject(timeout)  SPIF_SENDCHANGE); 
          end; 
        end 
        else begin 
          BringWindowToTop(hwnd); // IE 5.5 related hack 
          SetForegroundWindow(hwnd); 
        end; 
        Result := (GetForegroundWindow = hwnd); 
      end; 
    end;
      

  6.   

    很想知道为什么不用简单的fsStayOnTop?
      

  7.   

    BringWindowToTop(FrmMain.Handle);
    试试
      

  8.   

    任何时候对某一相对区域(点),只有一个窗口处于最前端,
    楼主既然操作主窗体,主窗体自然获得焦点,而处于前置,
    如果主窗体是最大化的,那么Form隐藏又如何?要想两个窗体同时完整的呈现在用户面前,那么办法只有一个:
    主窗体的位置与Form窗体的位置拉开,使其位置不重合这样在操作主窗体时不仅Form窗体完整可见,而且在主窗体中可以控制Form窗体的各种动作
      

  9.   

    我有一办法
    var f:TForm3 ;
    begin
      f := TForm3.Create(FormMain);
      f.Parent := FormMain;
      f.Show;
    end;
      

  10.   

    showModal不行,因为还有一些焦点事情要做。
    fsStayOnTop也不行,因为该窗口再showModal别的窗口,别的窗口跑后面去了。
    目前只能这样了。用户不小心点了主窗口,这个From.show就跑了,用户不知道是跑到主窗口后面去了,以为丢了。
      

  11.   

    刚刚解决了一个这样的问题(其实是工程置顶的问题),想要的话,发这里[email protected]
      

  12.   

    你可以在主窗体上放个panel。让出现的窗体在panel上。
      

  13.   

    主窗体的OnActivate事件中:
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      if(Assigned(Form2)and(Form2.Visible)and(Form2.Enabled))then
        Form2.BringToFront;
    end;