請教關於ShowModal SetFocus的問題 |
答題得分者是:shaofu
|
robert1014
初階會員 發表:34 回覆:85 積分:43 註冊:2002-03-13 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
|
robert1014
初階會員 發表:34 回覆:85 積分:43 註冊:2002-03-13 發送簡訊給我 |
謝謝,但由於程式碼在家,因此將問題再描述一次 當以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 發送簡訊給我 |
|
robert1014
初階會員 發表:34 回覆:85 積分:43 註冊:2002-03-13 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
引言: 謝謝,我想有可能像你說的VCL message loop....... 因為在開啟 form 2 的同時,form 1 持續在作收取影像的動作 及show system time等事情,因此可能會造成這樣的原因 嗯,這部份,下班後再試試 但如果,真的是form 1所造成的原因,那又該如何解決此問題呢? 非常感謝!很難回答, 建議你把範圍縮小.. 先自己開個新個 project, 然後開始把原 project 中可能有問題的 code 慢慢的加進去, 應該可以很快的找到問題(關鍵部份)! 到時後如果還是不了解的話, 再來討論看看 |
robert1014
初階會員 發表:34 回覆:85 積分:43 註冊:2002-03-13 發送簡訊給我 |
寫了一段小程式,試了一下,發現的確還是有問題
部份程式碼如下
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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我執行你的程式沒反應試不到 但我覺得問題在於
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 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
嗯, 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 發送簡訊給我 |
果然是不行....
我也有個旁門小法給你參考一下 :
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 發送簡訊給我 |
|
robert1014
初階會員 發表:34 回覆:85 積分:43 註冊:2002-03-13 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |