自動存檔-sendmessage 沒有發生作用 |
答題得分者是:christie
|
fivker
一般會員 發表:24 回覆:38 積分:12 註冊:2006-12-05 發送簡訊給我 |
最近在寫一支程式,將Quick report 自動轉pdf檔。
使用的轉pdf檔軟體是:PDFCreator, 在存檔時使用 sendmessage,來模擬 「滑鼠點下儲存」與 「輸入檔名」這兩項動作。 但是,在程式執行期間, 模擬 「滑鼠點下儲存」-->OK。 模擬 「輸入檔名」-->有時可以,有時無反應。(一步一步trace,沒有問題) 想請版上各位前輩協助,附檔是我的程式。謝謝大家。 備註:需安裝PDFCreator 0.9.5 編輯記錄
fivker 重新編輯於 2008-07-31 15:02:16, 註解 無‧
|
fivker
一般會員 發表:24 回覆:38 積分:12 註冊:2006-12-05 發送簡訊給我 |
剛剛再重新取得元件名稱,
發覺輸入檔名的元件名稱為 「ComboBoxEx32」而非「Edit」。 所以程式 [code delphi] Result := true; if h <> 0 then begin s:='C:\測試轉入pdf'; i:=20; GetClassName(h, str, 1024); if (str='Edit') then //上面弄錯了,應該改成 if (str='ComboBoxEx32') 才對 begin BringWindowToTop(h); SendMessage (h, WM_SETTEXT, 0,longint(pchar(s))); form1.Memo1.Lines.add('sendMessage to Edit '); end; end; [/code] 不過一步一步trace時竟然可以順利存檔,真是奇怪@@。
編輯記錄
fivker 重新編輯於 2008-07-31 16:18:47, 註解 無‧
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
沒用過PDFCreator,不過給你CutePDF Writer例子。
version:Delphi 6 主旨 : 以列印到CutePDF Writer方式 轉出 pdf 動作 : 填寫[檔名]並且按下[存檔] 程式碼如下 < [code delphi] unit UGetPDFwin; interface uses // Classes,Dialogs,DBTables,DB,UMain,AdvGrid,SysUtils; Classes,Dialogs,Windows,Messages,SysUtils; type PRec = ^TRec; TRec = record Wnd:THandle; Cls:String; Txt:String; end; GetPDFwin = class(TThread) private protected procedure Execute; override; public Constructor Create; end; var pwnd:HWND; function EnumFunc(wnd:HWND;lp:LPARAM):Boolean;stdcall; implementation constructor GetPDFwin.Create; begin inherited Create(False); FreeOnTerminate:=True; end; procedure GetPDFwin.Execute; var Found:Boolean; begin inherited; Found:=False; while not Found do begin pwnd:=findwindow(nil,'另存新檔'); if pwnd<>0 then begin EnumFunc(pwnd,integer(nil)); Found:=True; end; end; end; function EnumFunc(wnd:HWND;lp:LPARAM):Boolean;stdcall; var p1,p2:Array[0..100]of Char; pr :PRec; str:string; begin New(pr); GetWindowText(wnd,p1,100); GetClassName (wnd,p2,100); pr^.Wnd:=Wnd; pr^.Txt:=StrPas(p1); pr^.Cls:=StrPas(p2); //form1.Memo1.Lines.Add(pr^.Cls '-->' pr^.Txt); //showmessage('cls--' pr^.Cls '----Txt ---' pr^.Txt); if pr^.Cls='Edit' then begin str:='enum.pdf'; SendMessage (wnd, WM_SETTEXT, 0,longint(pchar(str))); end; if (pr^.Cls='Button') and (pr^.Txt='存檔(&S)') then begin SendMessage(Wnd, BM_CLICK, 0, 0); end; EnumChildWindows(wnd,@EnumFunc,Integer(nil)); Result:=true; end; end. [/code] ---使用方法 970731 << unit cut2pdfU; . . . var Form1: TForm1; implementation uses UGetPDFwin; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin QuickRep1.PrinterSettings.PrinterIndex:=Printer.Printers.IndexOF('CutePDF Writer'); QuickRep1.Print; sleep(3000); GetPDFwin.Create; end; end. ===================引 用 fivker 文 章=================== 最近在寫一支程式,將Quick report 自動轉pdf檔。 使用的轉pdf檔軟體是:PDFCreator, 在存檔時使用 sendmessage,來模擬 「滑鼠點下儲存」與 「輸入檔名」這兩項動作。 但是,在程式執行期間, 模擬 「滑鼠點下儲存」-->OK。 模擬 「輸入檔名」-->有時可以,有時無反應。(一步一步trace,沒有問題) 想請版上各位前輩協助,附檔是我的程式。謝謝大家。 備註:需安裝PDFCreator 0.9.5
------
What do we live for if not to make life less difficult for each other? |
fivker
一般會員 發表:24 回覆:38 積分:12 註冊:2006-12-05 發送簡訊給我 |
|
fivker
一般會員 發表:24 回覆:38 積分:12 註冊:2006-12-05 發送簡訊給我 |
試作心得-
開發環境:Delphi 5 轉PDF工具:CutePDF 作法: 利用sendmessage,模擬滑鼠點下與自動回輸檔名的方式進行存檔。 心得: 1、回輸檔名的部份,如果使用 [code delphi] SendMessage (h, WM_SETTEXT, 0,longint(pchar(file_name))); [/code] 會無法指定路徑。 ex:「c:\pdfReport\abc.pdf」 ->會變成只有「abc」 改成使用下面敘述,可完整輸入檔名。 [code delphi] for i:=0 to length(file_name) do begin sendmessage(h,wm_char,ord(file_name[i]),0); end; [/code] //不知道是不是因為 longint(pchar(file_name)) ,轉換的關係。 //抱歉,因為我實在不瞭解sendmessage的參數設定與說明@@ 2、原本使用pdfcreator,需要連續點兩次滑鼠存檔。 點一次「儲存」,回輸「檔名」,再點一次「儲存」。 使用下面兩種方式,都不穩定,時好時壞。 [code delphi] PostMessage(h,WM_LBUTTONDOWN,0,0); PostMessage(h,WM_LBUTTONUP,0,0); [/code] [code delphi] sendMessage(h,BM_CLICK,0,0); [/code] -->因此捨棄PDFCreator,改用CutePDF sendMessage(h,BM_CLICK,0,0); (改用christie前輩的做法,感謝<(_ _)>) 測試100份報表 自動EMAIL,都OK成功。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |