如题〉在线等

解决方案 »

  1.   

    var
      form:TForm1;
    begin
      form:=TForm1.Create(nil);
      form.showmodal;
      form.free;
    end;
      

  2.   

    用窗体当然会,如果用TOpenDialog对话框是不是就没有办法了呢
      

  3.   

    我的意思是这样,就是因为一些特殊情况,某些窗体showmodal的时候设的formstyle为stayontop,但是这个窗体里调的打开对话框就显示不到最前面了,怎么解决这个问题
    请理解题意
      

  4.   

    用窗体做,showmodal 显示;或者用application.MessageBox('不可为空!','警告',MB_ICONINFORMATION);这种,也是必须响应的。
      

  5.   

    我的意思是这样,就是因为一些特殊情况,某些窗体showmodal的时候设的formstyle为stayontop,但是这个窗体里调的打开对话框就显示不到最前面了,怎么解决这个问题
    请理解题意
      

  6.   

    窗体showmodal的时候设的formstyle为fsNormal(还可以加上设置BorderStyle为bsDialog这样就必须响应),然后用MessageBox显示就是在那个窗体的最前面,而且必须响应对话框然后才能响应你的窗体!
      

  7.   

    xjjrocker(了无痕) (:
    你到底明白我的意思么
    窗体最上显示我当然知道,我的意思是现在有个窗体已经最前显示了,当这个窗体调用一个opendialog对话框的时候,这个代开对话框没在最前面应该怎么解决?
      

  8.   

    楼主息怒,看看我这个方法能不能解决:
    1、响应TOpenDialog.OnShow事件;
    2、在事件处理中调用 SetWindowPos( OpenDialog1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOREDRAW );
      

  9.   

    据我的试验和观察,即使一个窗体是StayOnTop的,它调出来的OpenDialog也还是在它前面,真是奇怪。
      

  10.   

    // 强制让一个窗口显示在前台
    function ForceForegroundWindow(HWND: HWND): Boolean;
    var
      ThreadID1, ThreadID2: DWORD;
    begin
      if HWND = GetForegroundWindow then
        Result := True
      else
      begin
        ThreadID1 := GetWindowThreadProcessId(GetForegroundWindow, nil);
        ThreadID2 := GetWindowThreadProcessId(HWND, nil);
        if ThreadID1 <> ThreadID2 then
        begin
          AttachThreadInput(ThreadID1, ThreadID2, True);
          Result := SetForegroundWindow(HWND);
          AttachThreadInput(ThreadID1, ThreadID2, False);
        end
        else
          Result := SetForegroundWindow(HWND);
        if IsIconic(HWND) then
          ShowWindow(HWND, SW_RESTORE)
        else
          ShowWindow(HWND, SW_SHOW);
      end;
    end;
      

  11.   

    我专门测试了一下,写了个四个窗体依次调用并显示打开对话框和message对话框的demo,每次都是最上面显示,没有问题,不知道你怎么搞得!
      

  12.   

    Unit1调用Unit2(Form2最上面显示,且必须响应后才能响应Form1),Unit2调用Unit3(Form3最上面显示,且必须响应后才能响应Form2),,Unit3调用Unit4(Form4最上面显示,且必须响应后才能响应Form3),,Unit4有个OpenDialog同时还有showmessage,此处OpenDialog打开的就是最上面的,showmessage也会显示最上面。每个窗体只是设定了BorderStyle:=bsDialog而已。
    这个意思没有理解错误吧!你的窗体调用有问题!
    只给你个Unit2调用Unit3的参考:
    procedure TForm2.OpenForm3Click(Sender: TObject);
    begin
     Form3:=TForm3.Create(nil);
     Form3.ShowModal;
     Form3.Free; 
    end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Form2:=nil;
    end;//如果还是不能理解你的意思,一定是你的表达有问题了……
      

  13.   

    function TForm1.showp(frout : boolean = false;isMessage1 : boolean = true) : HWND;
    begin
      Form2 := TForm2.create(nil);
      if not isMessage1 then Form2.MessageType := 2;
      //showmessage('showp()');
      Form2.Show;
      if  frout then Form2.FormStyle:=fsStayOnTop ;
      result := Form2.Handle ;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      showp(true);
    end;看看是不是 你要的结果?
      

  14.   

    我也不知道咋搞得,我每层调用都是设置为fsstayontop,BorderStyle:=bsDialog也设置了
    可最后一层的打开对话框就是显示不出来
    ,怪哉怪哉
      

  15.   

    可否把你的代码简化一下(去掉与此问题无关的代码),贴出来,包括.dfm的内容。我这里无法复现你的问题。另外,你用Delphi几?
      

  16.   

    我每层调用都是设置为fsstayontop,BorderStyle:=bsDialog也设置了----〉把fsstayontop改成fsNormal就可以了啊,快点改掉吧!!!!
      

  17.   

    谢谢了无痕
    你设置为bsdialog倒是可以了,不过最大最小化窗口还原窗口不见了,岂不是很郁闷,唉
      

  18.   

    我想起是怎么回事了,我一个窗体frmparent中设了一个private 成员frmchild,这个frmchild在显示的时候是非模态显示,并且总在最上面,因为它要和frmparent中的数据有一个同步显示的功能,当这个frmchild调用其它窗体时,一层没问题,第二层调用就出现我上面所说的问题了,问题应该处在这个frmchild里。
      

  19.   

    而且这样就无法实现象了无痕所说的设为对话框风格,因为有个frmchild必须要总在最上面的,要不show的时候,在父窗体一点,子窗体还是看不到了
      

  20.   

    frmchild如果是mdi风格的,一样应该可以这样处理的,因为我写的系统就是mdi多窗口的,子窗体本身也是showmodal的模态显示,然后里面有个增加模块是必须响应的,然后出错提示也是不需响应的,这样算来也差不多三层了,所以,应该没问题。
      

  21.   

    具体是不是真的没问题要写个demo测试一下,你不妨测试一下啊。