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

自動存檔-sendmessage 沒有發生作用

答題得分者是:christie
fivker
一般會員


發表:24
回覆:38
積分:12
註冊:2006-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-31 15:00:20 IP:220.128.xxx.xxx 訂閱
最近在寫一支程式,將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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-31 16:17:12 IP:220.128.xxx.xxx 訂閱
剛剛再重新取得元件名稱,
發覺輸入檔名的元件名稱為
「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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-31 16:20:13 IP:203.73.xxx.xxx 未訂閱
沒用過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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-01 08:46:39 IP:220.128.xxx.xxx 訂閱
感謝  christie  前輩的例子。
我又再次測試我的程式,發覺不穩定的情況仍然存在。
有時候「滑鼠點下」這個動作,也會沒有反應。

想請問版上各位前輩,sendmessage會有這種時好時壞的情況嗎?
還是說,有其他需要注意的地方??麻煩大家了,謝謝。
fivker
一般會員


發表:24
回覆:38
積分:12
註冊:2006-12-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-05 15:22:21 IP:220.128.xxx.xxx 訂閱
試作心得-
開發環境: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成功。
編輯記錄
fivker 重新編輯於 2008-08-05 15:24:21, 註解 無‧
fivker 重新編輯於 2008-08-05 15:27:03, 註解 無‧
系統時間:2024-04-19 18:52:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!