他プログラム(メモ帳など)の保存ダイアログに、ファイル名を転送後、ボタンを押してファイルを保存したいのですが、同名のファイルが存在している場合、保存ボタンを押す操作をさせあとに上書きのウインドウがあらわれて、プログラムが停止してしまいます。上書きウインドウを手動で閉じれば再びプログラムは動きます。
・新規のファイル名では、問題なく動きます。
・上書きウインドウを手動で表示させた状態で、上書きウインドウの「はい」ボタンを操作する場合も問題なく動きます。
どうすれば、上書きウインドウが表示されても、そのまま操作できるでしょうか? いい方法があれば教えてください。
//*******************************************************************
// セーブダイアログの操作(’名前を付けて保存’WindowTextが1個の場合)
//*******************************************************************
if WNum=1 then
begin
//ファイル名の転送
Str:=Edit1.Text; //ファイル名の取得
//ファイル名の転送
SendMessage(SEditHnd, WM_SETTEXT,0,Integer(Pchar(Str)));
if CheckBox1.Checked=True then
begin
// 「保存(&S)」を押す動作
//マウスの左ボタンを押す
SendMessage(SBtnHnd,WM_LBUTTONDOWN,0,0);
Memo1.Lines.Add('1マウスの左ボタンを押す');
//-----------------------------------------------------------------
//↑ここで上書き保存ウインドウが表示されここでプログラムが停止する
//-----------------------------------------------------------------
//マウスの左ボタンを離す
SendMessage(SBtnHnd,WM_LBUTTONUP,0,0);
Memo1.Lines.Add('1マウスの左ボタンを離す');
end;
end;
//*******************************************************************
// 上書きウインドウの操作(’名前を付けて保存’WindowTextが2個の場合)
//*******************************************************************
if WNum=2 then
begin
if CheckBox2.Checked=True then
begin
// 上書きの「はい(&Y)」を押す動作
//マウスの左ボタンを押す
SendMessage(YBtnHnd,WM_LBUTTONDOWN,0,0);
Memo1.Lines.Add('2マウスの左ボタンを押す');
//マウスの左ボタンを離す
SendMessage(YBtnHnd,WM_LBUTTONUP,0,0);
Memo1.Lines.Add('2マウスの左ボタンを離す');
end;
end;
メモ帳で開く理由がわかりません。
一個フォーム作って Memo1.lines.savetofile()でいいのでは、
すいません。テスト的にメモ帳などで動作を確認していたものですから。実際にはフリーのPDFWriterのprimopdfに一括してファイルを送って、自動でpdfファイルを出力してみようかとおもったもので。(primoの場合、元文書のファイル名を引きつがないので)製品を買えばあるのですが、プログラムの勉強を兼ねて自分で作ってみようと思いました。意図を正確にお伝えしていなくてすいませんでした。
よろしくお願いします。
primopdfに Editにコピペ した場合は、
バグがあるみたいですね。
上書きの確認がでないし、出力されたふりして、しません。
[Browse]
のボタンをさわらなければいけないようですね。
File Exists
[はい(&Y)]
print
Button
width 15
heigt 18
ClassName[Button]
WindowText[OK]
んじゃ。
がんばって
Delphi側からあらかじめファイルの有無を調べて既に存在するなら
分岐してSendMessageの内容を変えるか
ファイルを削除してしまうとか。
書き込む予定のPDFファイルが存在したら、自分で消して
primopdfのEDITにおくったほうが
[Browse]ボタンと関わらないで済むと思いますよ。
(ちょーかんたん)
primo自体も確認で はい おすと出力するしないに関わらず消している動作だし。
。さん、fooさんありがとうございました。
先に書き込む予定のファイルを確認して、DELPHIプログラムでそのファイルを操作しておけばいいのですね。考えつきませんでした。
こうすれば、簡単でうまくいきそうです。この方法でやってみます。
ありがとうございました。
また、今後の勉強も含めてなのですが、今回教えていただいた先にファイル名の存在を確認してファイルを操作するのではなく、最初に書いたメモ帳などで上書き保存のウィンドウが出てきた場合も続けて操作する方法があればお教えください。宜しくお願いします。
>最初に書いたメモ帳などで上書き保存のウィンドウが出てきた場合も続けて操作する方法があればお教えください。
ヒント:
ClassName[Button]
[はい(&Y)]
保存を押せるんだからこれもおせるよ。
がんばって。
。さんヒントありがとうございます。
いまいちピンときませんが、がんばってみます。
(なんせ、まだほどんどプログラムは作ったことがないのにAPI関係をはじめてやっているもので。今回のもみなさんの例を参考にしているのがやっと程度です。)
。さんの書かれたヒントの意味は理解できたのですが、primoでは最初の質問と同様に保存ダイアログが起動するとdelphiのプログラムがやはり停止してしまします。そのためprimoでは保存ボタンが押せません。基本的にわたしのプログラムでは、新しいウインドウが開くとプログラムが停止してしまいます。
(メモ帳では、最初に保存ダイアログが起動した状態で確認していたため、保存ボタンがおせたのですが、新しく上書き保存がでるとプログラムが停止していました。)
>WIN32APIリファレンスより引用
> SendMessage関数は、 指定された1つまたは複数のウィンドウに、
> 指定されたメッセージを送ります。この関数は指定されたウィンドウのウィンドウ
> プロシージャを呼び出し、 プロシージャがメッセージを処理し終わるまで制御を戻しません。
> これに対して、 PostMessage関数は、 メッセージをスレッドのメッセージ キューにポストして、
> 直ちに制御を戻します。
PostMessageにかえて、
タイマーで待機するとか
ループ使ってApplication.ProcessMessagesを何回かよんで
ちょっと待機してみたら?
上書き確認のダイアログがモーダル表示されて、送った先のコントロールが inactive に
なってるので SendMessage() から復帰できないで止まってるのね。
最初のコードのように同期処理をする限り回避できませんね。ですから、上書き確認
ダイアログを表示させないように予めファイルの有無を確かめておくのがもっとも
簡単で確実だと思います。
SendMessageTimeout() というAPIがあるようです。待ち時間の上限を設定できるようです。
。さん、りおりおさん、ありがとうございした。
SendMessageTimeout()を使うことで上書き保存できるようになりました。
また、上書き保存のダイアログを出さないようにファイルの存在をFileExistsで検索したいのですが、他のプログラムの保存ダイアログでの現在のファイルパスを調べたり、設定する命令を探しているのですが、わかりません。(カレントディレクトリでもないし?)
こちらを使う方が同一ファイルがあれば、削除したり、ファイル名を変更したり便利そうです。よろしくおねがいします。
ファイルパスはコンボボックスのリストから作成できる気がしてきました。
今回のみなさんのアドバイスは大変参考になりました。
どうもありがとうございました。
ツイート | ![]() |