全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1603
推到 Plurk!
推到 Facebook!

請教關於ShowModal SetFocus的問題

答題得分者是:shaofu
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-02 22:39:49 IP:203.204.xxx.xxx 未訂閱
請問各位,當我在form 1 以 showmodal 的方式開啟 form 2 此時在 form 2 執行開啟一個外部程式,如開啟 outlook 然後關閉 outlook 回到form 2,此時會發現 form 1 上面的 button 是可以被觸發,而不是單純的 form 2 showmodal 因此想請問,有何方法可以避免此狀況 謝謝
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-03 09:53:04 IP:210.243.xxx.xxx 未訂閱
正常來說, 應該是沒有這樣的問題的, 剛試了 CreateProcess, ShellExecute 也都沒問題.. 可以把問題再描述清楚, 或把 Code 丟上來嗎 ?
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-03 10:11:15 IP:61.222.xxx.xxx 未訂閱
謝謝,但由於程式碼在家,因此將問題再描述一次    當以ShowModal 開啟 form 2 時,在 form 2 按下 button1 button1 執行一行程式 (call另一支unit的SendMail function) 那一支unit裡的SendMail funciton 內容如下 開啟mail並夾檔傳送http://forum.vclxx.org/topic.php?TOPIC_ID=21773&FORUM_ID=3&CAT_ID=2&Topic_Title=%B7%ED+mail+%BB%DD%A7%A8%B1a%A6h%AD%D3%C0%C9%AE%D7%B6%C7%B5%B9%A6h%AD%D3%A4H%AE%C9%3F&Forum_Title=Misc 執行之後回到form 2 ,就會發生我所說的問題 謝謝
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-03 11:25:46 IP:210.243.xxx.xxx 未訂閱
剛試了一下, 可以送, 但也沒有問題啊 ?    因為 Delphi6 本身有 mapi unit (mapi32.dll wrapper), 所以我是直接 use mapi, 然後多檔傳送是用你提供 link 中的 function 做  重述一次, 正常的流程不會有你說的狀況, 可能是 >
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-03 11:40:06 IP:61.222.xxx.xxx 未訂閱
謝謝,我想有可能像你說的VCL message loop....... 因為在開啟 form 2 的同時,form 1 持續在作收取影像的動作 及show system time等事情,因此可能會造成這樣的原因 嗯,這部份,下班後再試試 但如果,真的是form 1所造成的原因,那又該如何解決此問題呢? 非常感謝!
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-03 12:48:42 IP:210.243.xxx.xxx 未訂閱
引言: 謝謝,我想有可能像你說的VCL message loop....... 因為在開啟 form 2 的同時,form 1 持續在作收取影像的動作 及show system time等事情,因此可能會造成這樣的原因 嗯,這部份,下班後再試試 但如果,真的是form 1所造成的原因,那又該如何解決此問題呢? 非常感謝!
很難回答, 建議你把範圍縮小.. 先自己開個新個 project, 然後開始把原 project 中可能有問題的 code 慢慢的加進去, 應該可以很快的找到問題(關鍵部份)! 到時後如果還是不了解的話, 再來討論看看
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-03 23:27:51 IP:203.204.xxx.xxx 未訂閱
寫了一段小程式,試了一下,發現的確還是有問題 部份程式碼如下
form1
procedure TForm1.Button2Click(Sender: TObject);
begin
 ShowMessage('ok');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.ShowModal;
end;    form2
uses unitSendTo;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
   SendMailMAPI(Caption,'', 'c:\5.jpg','','','','');
end;    unit unitSendTo;
function SendMailMAPI(const Subject, Body, FileName,SenderName,
  SenderEMail, RecepientName, RecepientEMail: String): Integer;
var
  message: TMapiMessage;
  lpSender,
  lpRecepient: TMapiRecipDesc;
  FileAttach: TMapiFileDesc;
  SM: TFNMapiSendMail;
  MAPIModule: HModule;
  sFile:string;
begin
  FillChar(message, SizeOf(message), 0);
  with message do
  begin
    if (Subject <> '') then
      lpszSubject := PChar(Subject);
    if (Body <> '') then
      lpszNoteText := PChar(Body);
    if (SenderEMail<>'') then
    begin
      lpSender.ulRecipClass := MAPI_ORIG;
      if (SenderName='') then
        lpSender.lpszName := PChar(SenderEMail)
      else
        lpSender.lpszName := PChar(SenderName);
      lpSender.lpszAddress := PChar('SMTP:' SenderEMail);
      lpSender.ulReserved := 0;
      lpSender.ulEIDSize := 0;
      lpSender.lpEntryID := nil;
      lpOriginator := @lpSender;
    end;
    if (RecepientEMail <> '') then
    begin
      lpRecepient.ulRecipClass := MAPI_TO;
      if (RecepientName='') then
        lpRecepient.lpszName := PChar(RecepientEMail)
      else
        lpRecepient.lpszName := PChar(RecepientName);
      lpRecepient.lpszAddress := PChar('SMTP:'   RecepientEMail);
      lpRecepient.ulReserved := 0;
      lpRecepient.ulEIDSize := 0;
      lpRecepient.lpEntryID := nil;
      nRecipCount := 1;
      lpRecips := @lpRecepient;
    end
    else
      lpRecips := nil;
    if (FileName = '') then
    begin
      nFileCount := 0;
      lpFiles := nil;
    end
    else
    begin
      FillChar(FileAttach, SizeOf(FileAttach), 0);
      FileAttach.nPosition := Cardinal($FFFFFFFF);
     // sFile:=FileName ',' FileName2;
      sFile:=FileName;
      FileAttach.lpszPathName := PChar(sFile);
      nFileCount := 1;
      lpFiles := @FileAttach;
    end;
  end;
  MAPIModule := LoadLibrary(PChar(MAPIDLL));
  if MAPIModule = 0 then
    Result := -1
  else
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM <> nil then
        Result := SM(0, Application.Handle, message, MAPI_DIALOG or
                     MAPI_LOGON_UI, 0)
      else
        Result := 1;
    finally
      FreeLibrary(MAPIModule);
    end;
end;
執行步驟 1、點選 form 1 上的Button1Click,以showmodal開啟 form 2 2、點選 form 2 上的Button1Click,以執行SendMailMAPI 3、此時會開啟 outlook ,將信件寄出或取消關閉後,回到 form 2 4、此時會發現,form 1上的button2,可以被觸發 正常來說,form1以showmodal開啟form2時,是無法再執行form1上的button2 但在此狀況卻可以??? 因此想請問,有何方法可以解決此問題..... 謝謝 發表人 - robert1014 於 2003/07/03 23:30:18
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-04 10:20:03 IP:210.243.xxx.xxx 未訂閱
真的會這樣 @@    關鍵是 MAPI_DIALOG 這個 flag, 設定後會跳出 Outlook, 但 return 回主程式後, form 的關係就被破壞了...    暫時無法解決, 看有沒有其他人有經驗了 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-04 10:59:50 IP:61.10.xxx.xxx 未訂閱
我執行你的程式沒反應試不到 但我覺得問題在於 Result := SM(0, Application.Handle, message, MAPI_DIALOG or MAPI_LOGON_UI, 0); 時用了 Application.Handle (其實就是 MainForm (Form1) 的 Handle),所以結束時誤將主權交回 Form1 你試試加入一個參數讓呼叫時可傳入呼叫 Form 的 HWND, 使呼叫 SM 時用那個 HWND,結束時便應會將主權交回 Form2 了
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-04 11:13:08 IP:61.222.xxx.xxx 未訂閱
感謝各位幫忙 至於沒有反應,我想應該是 filename 找不到(5.jpg) , 可試著改電腦上已存在的檔案。 關於 Justmade 提到的方法,應該是有可能 這個部份,我再試試..... 謝謝
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-04 11:34:34 IP:210.243.xxx.xxx 未訂閱
嗯, Justmade 兄提到的方法, 我之前有試過 (改傳 Form2.Handle), 但是一樣的問題, 改成 0 (no parent) 也是不行..  不過是有個變通的方式, 改成用 class="code"> TSendMailThread = class(TThread) private FResult: integer; FSubject: string; FBody: string; FFileName: string; FSenderName: string; FSenderEmail: string; FRecepientName: string; FRecepientEMail: string; public procedure Execute; override; constructor Create(const Subject, Body, FileName, SenderName, SenderEMail, RecepientName, RecepientEMail: String); property Result: integer read FResult; end; constructor TSendMailThread.Create(const Subject, Body, FileName, SenderName, SenderEMail, RecepientName, RecepientEMail: String); begin FSubject := Subject; FBody := Body; FFileName := FileName; FSenderName := SenderName; FSenderEMail := SenderEMail; FRecepientName := RecepientName; FRecepientEMail := RecepientEMail; inherited Create(False); end; procedure TSendMailThread.Execute; begin inherited; FResult := SendMailMAPI(FSubject, FBody, FFileName, FSenderName, FSenderEMail, FRecepientName, FRecepientEMail); end; ... var SendMailThread: TSendMailThread; begin SendMailThread := TSendMailThread.Create( Caption, 'test', 'c:\1.jpg', 'shaofu', 'shaofu@com.tw', 'shaofu', 'shaofu@com.tw' ); SendMailThread.WaitFor; ShowMessage(Format('Result: %d', [SendMailThread.Result])); SendMailThread.Free; ... PS: 這個方法只是個 workaround, 我也很想知道問題在那, 希望有經驗的人來指導一下 發表人 -
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-04 11:46:40 IP:61.10.xxx.xxx 未訂閱
果然是不行.... 我也有個旁門小法給你參考一下 :
Form1 :
procedure TForm1.Button1Click(Sender: TObject);
begin
  repeat
    Form2.ShowModal;
  until Form2.ModalResult <> mrRetry;
end;    Form2 :
procedure TForm2.Button1Click(Sender: TObject);
begin
   SendMailMAPI(Caption,'', 'C:\5.jpg','','','','');
   self.ModalResult := mrRetry;
end;
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-04 11:46:41 IP:61.222.xxx.xxx 未訂閱
啊?? 真的是如此? 原本想說,如果真的還是不行,就要改成thread來試 非常感謝 shaofu 幫忙測試、修改 謝謝
robert1014
初階會員


發表:34
回覆:85
積分:43
註冊:2002-03-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-04 11:54:44 IP:61.222.xxx.xxx 未訂閱
再次感謝 Justmade 幫忙 呵呵,沒想到,還有此小偏方.....    嗯,兩位提的方法都可以解決 雖然 Justmade 的方式較精巧 但 shaofu 早了一步,因此給分    總之,謝謝各位的幫忙
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-07-04 12:04:57 IP:210.243.xxx.xxx 未訂閱
又偷學到一招了 < > 不過方法的確很偏門, 會有一點點限制 < > (OnShow) 不過能解決問題的, 就是好貓, 喵~~
系統時間:2024-11-23 1:46:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!