Form1.visible:=true;
//while (Visible) do Application.ProcessMessages;
if Form1.ModalResult = mrOk then
beginend;如何让Form1显示之后,等取得Form1的返回值再继续往下执行?我加了while (Visible) do Application.ProcessMessages 这句代码之后,会带来很多问题,影响其他form的输入.有没有更好的办法来达到这种功能?
//while (Visible) do Application.ProcessMessages;
if Form1.ModalResult = mrOk then
beginend;如何让Form1显示之后,等取得Form1的返回值再继续往下执行?我加了while (Visible) do Application.ProcessMessages 这句代码之后,会带来很多问题,影响其他form的输入.有没有更好的办法来达到这种功能?
我觉得方法有三种:
1。就改成模态窗口,当然这与你前面的要求不符。
2。改下程序的逻辑,把好些代码放到Form1的ONCLOSE等事件中去。
3。做成消息,在FORM1执行完了后,sendmessage(),调用自定义消息执行.你可以参考下。
楼上给的方法都行,但你那死轮询
while (Visible) do Application.ProcessMessages
建议加入对焦点的判断和当前激活窗体的判断
窗口关闭时把数据通过这个回调事件一起发过去就行了
begin
这里处理你的代码
end;在Form1中加一个按扭,自己根据需要来设置返回值
写上modalresult:=mrok;则按了此按扭,Form1会关闭,上面的条件就成立
若是modalresult:=mrcancel;Form1也会关闭,但上面的条件就不成立了
在这个期间主窗体没什么作用,哪为什么不用模态窗口呢?是不是还有其他的需求?
-----------------------------------------------------------------
我们知道在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;
processmessage;
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;
{循环执行任务}form2.ProgressBar1.Position :=form2.ProgressBar1.Position + 1;{循环结束}改成调用form2的一个方法 就达到你的要求