Form1.visible:=true;
//while (Visible) do Application.ProcessMessages;
if Form1.ModalResult = mrOk then
beginend;如何让Form1显示之后,等取得Form1的返回值再继续往下执行?我加了while (Visible) do Application.ProcessMessages 这句代码之后,会带来很多问题,影响其他form的输入.有没有更好的办法来达到这种功能?

解决方案 »

  1.   

     if Form1.ShowModal = mrok then //模态窗口才有这样的功能和返回值。
    我觉得方法有三种:
    1。就改成模态窗口,当然这与你前面的要求不符。
    2。改下程序的逻辑,把好些代码放到Form1的ONCLOSE等事件中去。
    3。做成消息,在FORM1执行完了后,sendmessage(),调用自定义消息执行.你可以参考下。
      

  2.   

    还得结合楼主的应用,你是希望一直接收Form1的数据,并不影响Form1的显示吗?
    楼上给的方法都行,但你那死轮询
    while (Visible) do Application.ProcessMessages 
    建议加入对焦点的判断和当前激活窗体的判断
      

  3.   

    在Form1的OnClose事件里写代码不就行了?
      

  4.   

    设计问题,可以用事件来触发,给form1,form2……增加一个回调事件
    窗口关闭时把数据通过这个回调事件一起发过去就行了
      

  5.   

    模块窗口不是用Form1.visible:=true;显示,而是像下面这样的if Form1.ShowModal = mrok then
    begin
     这里处理你的代码
    end;在Form1中加一个按扭,自己根据需要来设置返回值
    写上modalresult:=mrok;则按了此按扭,Form1会关闭,上面的条件就成立
    若是modalresult:=mrcancel;Form1也会关闭,但上面的条件就不成立了
      

  6.   

     LZ 你是希望 Form1显示之后,等取得Form1的返回值再继续往下执行?
     在这个期间主窗体没什么作用,哪为什么不用模态窗口呢?是不是还有其他的需求?
      

  7.   

    转:
    -----------------------------------------------------------------
    我们知道在Delphi中显示一个窗口有两种方式,模态方式显示(ShowModal)和非模态方式显示(Show),模态方式显示窗口时,必须在自身关闭后才能使父窗口起作用,但有时我们想要实现一个窗口,既要具有模态窗口的特性,但又要能从父窗口中控制它,如显示一个表示处理进行过程的进度框。利用DisableTaskWindows和 EnableTaskWindows 可以达到这一效果。  下面是演示实现程序:procedure Tform1.ShowProgressDlg;varWindowList: Pointer;begin{除了form2外使所有窗口无效}WindowList := DisableTaskWindows(form2.Handle);tryform2.Show;{循环执行任务}form2.ProgressBar1.Position :=form2.ProgressBar1.Position + 1;{循环结束}finally{重新使所有窗口有效}EnableTaskWindows(WindowList);form2.Close;end;end;
      

  8.   

    while Aform.showing do
      processmessage; 
      

  9.   

    下面是ShowModal的代码,区别就在
    WindowList := DisableTaskWindows(0);
    ------------------------------------
    function TCustomForm.ShowModal: Integer;
    var
      WindowList: Pointer;
      SaveFocusState: TFocusState;
      SaveCursor: TCursor;
      SaveCount: Integer;
      ActiveWindow: HWnd;
    begin
      CancelDrag;
      if Visible or not Enabled or (fsModal in FFormState) or
        (FormStyle = fsMDIChild) then
        raise EInvalidOperation.Create(SCannotShowModal);
      if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
      ReleaseCapture;
      Application.ModalStarted;
      try
        Include(FFormState, fsModal);
        if (PopupMode = pmNone) and (Application.ModalPopupMode <> pmNone) then
        begin
          RecreateWnd;
          HandleNeeded;
        end;
        ActiveWindow := GetActiveWindow;
        SaveFocusState := Forms.SaveFocusState;
        Screen.SaveFocusedList.Insert(0, Screen.FocusedForm);
        Screen.FocusedForm := Self;
        SaveCursor := Screen.Cursor;
        Screen.Cursor := crDefault;
        SaveCount := Screen.CursorCount;
        WindowList := DisableTaskWindows(0);
        try
          Show;
          try
            SendMessage(Handle, CM_ACTIVATE, 0, 0);
            ModalResult := 0;
            repeat
              Application.HandleMessage;
              if Application.Terminated then ModalResult := mrCancel else
                if ModalResult <> 0 then CloseModal;
            until ModalResult <> 0;
            Result := ModalResult;
            SendMessage(Handle, CM_DEACTIVATE, 0, 0);
            if GetActiveWindow <> Handle then ActiveWindow := 0;
          finally
            Hide;
          end;
        finally
          if Screen.CursorCount = SaveCount then
            Screen.Cursor := SaveCursor
          else Screen.Cursor := crDefault;
          EnableTaskWindows(WindowList);
          if Screen.SaveFocusedList.Count > 0 then
          begin
            Screen.FocusedForm := Screen.SaveFocusedList.First;
            Screen.SaveFocusedList.Remove(Screen.FocusedForm);
          end else Screen.FocusedForm := nil;
          if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
          RestoreFocusState(SaveFocusState);
          Exclude(FFormState, fsModal);
        end;
      finally
        Application.ModalFinished;
      end;
    end;
      

  10.   

    上面的代码
    {循环执行任务}form2.ProgressBar1.Position :=form2.ProgressBar1.Position + 1;{循环结束}改成调用form2的一个方法 就达到你的要求