usesにProcessを追加したのですがエラーが出ます


QZ  2013-12-19 01:39:51  No: 45740

いつもお世話になります。
Delphi XE5から外部プログラムを起動して、その出力を取り込もうとしています。
下記のサイトを参考にuses節にProcessを記述したのですが、「....process.dcuが見つかりません」というエラーが出ます。
どう変更すればよろしいんでしょうか?
http://wiki.freepascal.org/Executing_External_Programs/ja


Mr.XRAY  2013-12-19 16:21:00  No: 45741

どういう経過で TProcess の記事のページにたどりついたかは知りませんが,
TProcess は Lazarus という言語に実装されているようです.
source フォルダ内を検索した結果では.
少なくとも Delphi XE4 までには実装されていないようです.
Delphi XE5 は自分で確認してみてください.

[Lazarus - Wikipedia]
http://ja.wikipedia.org/wiki/Lazarus


QZ  2013-12-19 17:17:07  No: 45742

Mr.XRAYさん、回答ありがとうございます。
>どういう経過で TProcess の記事のページにたどりついたかは知りませんが,
>TProcess は Lazarus という言語に実装されているようです.

Delphi、外部プログラム実行、出力(だったと思います)で検索して見つけました。

>source フォルダ内を検索した結果では.
> 少なくとも Delphi XE4 までには実装されていないようです.
>Delphi XE5 は自分で確認してみてください.
XE5にもやはり実装されていないようです。

ほかにDelphi XE5から外部プログラムを実行して、その出力を受け取る(簡単な)方法はないでしょうか?


Mr.XRAY  2013-12-19 18:14:39  No: 45743

>ほかにDelphi XE5から外部プログラムを実行して、その出力を受け取る(簡単な)方法はないでしょうか?

私には分かりません.私はエスパー(超能力者)ではありません.
「出力」が何を意味するのか,その外部プログラムが出力するものなのか.
そうだとすると,どのように受け取ることができるのか.
外部プログラムを実行した時の一般的な情報なのか.
その外部プログラムの説明書や仕様書がない限り不明ですね.
しかも,「簡単な」と言われると尚更です (笑)

参考になるかどうかは分かりませんが,
例えば,以下のサンプルは,外部プログラム Cmd.exe を引数付きで実行する例ですが,
実行結果として,指定ディレクトリ内のファイルのリストを String 型の変数で受け取る例です.
簡単かどうかは疑問ですが.

[01_標準出力をリダイレクト]
http://mrxray.on.coocan.jp/Delphi/plSamples/552_PipeRedirect.htm#01


QZ  2013-12-20 07:26:15  No: 45744

Mr.XRAYさん、回答ありがとうございます。
なんとか、なんとなく使い方がわかったので、プログラムに追加しているところです。
でも、ほかの部分にバグがあるようで、時間がかかりそうです。


QZ  2013-12-23 02:07:04  No: 45745

テストプログラムを作って動作を確認しているのですが、うまくいきません。
どこか間違っているのでしょうか?
xdoc2txt.exeを使ってWORD文書をテキスト形式に変換して取り込もうとしています。
わかりやすいようにD:\にxdoc2txt.exeとzlib.dllをコピーしています。
xdoc2txt.exeとzlib.dllはhttp://talk-pc.sakura.ne.jp/anybody_setup_xdoc2txt.html
からダウンロードしました。

procedure TForm1.test();
var
  text:TStringList;
  ACmdStr:String;
  ACmdLine:TCommandLineUnit;
begin
    text := TStringList.Create;
    ACmdLine := TCommandLineUnit.Create;
    try
      ACmdStr:= 'D:\xdoc2txt.exe test.doc';
      text.Add(ACmdLine.GrabStdOutText(ACmdStr));
    finally
      FreeAndNil(ACmdLine);
    end;
    text.SaveToFile('D:\ttttt.txt');
    text.Free;
    StatusBar1.Panels[1].Text:='処理完了';
end;

元データ(.doc形式)20kバイトほどのデータが出力データ(ttttt.txt)では10数Mバイトの意味不明データ(エディタでは見えません)になります。
なお、コマンドラインでは正常に動作します。


Mr.XRAY  2013-12-24 16:11:20  No: 45746

>WORD文書をテキスト形式に変換して取り込もうとしています。

こういうことをしたかったのですか ?
最初の文章からは推測できませんでした.

ワードの文書からテキストだけを取り出し,ファイルに保存するプログラムを作成している
[備考]
Word だと,型の WORD と区別しにくいので,検索の時はワードを使うとベター
「取り込み」言った場合は,取り込む先が何かが必要ですね

(1) http://talk-pc.sakura.ne.jp/anybody_setup_xdoc2txt.html
    から xdoc2txt.exe (バージョンは不明) をダウンロードし,
    xdoc2txt.exe と zlib.dll を D ドライブ直下に置いた 
    ([備考] ドライブ直下にはできる限り置かない方がいいかも)
    
(2) CommandLineUnit.pas を○○ (不明) からダウンロードして,
    テストのプロジェクトのフォルダ内に置いて,uses に CommandLineUnit を追加した
    
(3) 以下のコードをコンパイルして実行したが,保存したテキストファイル内の文字が化けてしまう
    なお,test() は,フォームに配置した Button1 をクリックして実行するようにしている
    
(4) 環境は,Windows XXX (不明) + Delphi XE5 Pro 版(UP不明)
    
ということでしょうか ?
不明の箇所を追記した方がいいでしょう(何故かは自分で考えてくださいませ).


DEKO  2013-12-24 17:15:15  No: 45747

xdoc2txt.exe に -f を付けて *.txt が吐かれるのを待ってそのテキストファイルを TStringList.LoadFromFile() すればいいような気もしますが...?
http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html

本当にリダイレクトを取り込む必要があるのですか?


QZ  2013-12-24 17:16:44  No: 45748

>こういうことをしたかったのですか ?
>最初の文章からは推測できませんでした.
申し訳ありません。

> ([備考] ドライブ直下にはできる限り置かない方がいいかも)
Delphiのexeと同じところにおいていたのですが、うまく動かず、デバッグしやすいように一時的にD:\に置いています。

> (2) CommandLineUnit.pas を○○ (不明) からダウンロードして,
Mr.XRAYさんのサイトからダウンロードしました。
    
>(3) 以下のコードをコンパイルして実行したが,保存したテキストファイル内の文字が化けてしまう
    なお,test() は,フォームに配置した Button1 をクリックして実行するようにしている
その通りです。
    
>(4) 環境は,Windows XXX (不明) + Delphi XE5 Pro 版(UP不明)
Windows 8.1、Delphi XE5 Starter版です。


Mr.XRAY  2013-12-24 18:39:58  No: 45749

>本当にリダイレクトを取り込む必要があるのですか?

取り込む必要がなければ,CreateProcess 等で,起動アプリの終了待ちにして

xdoc2txt.exe -f 文書名

で OK です.出力されるファイル名は,文書名の拡張子が .txt になります.
(動作確認済)


Mr.XRAY  2013-12-24 19:18:39  No: 45750

>> (2) CommandLineUnit.pas を○○ (不明) からダウンロードして,
>Mr.XRAYさんのサイトからダウンロードしました。

この CommandLineUnit ですが,以下の [552] [434] [000] のどれかのサンプルをダウンロードすると,
そのサンプルのプロジェクトに含まれています.
http://www.google.com/cse?cx=004772099268275017084%3A3mq4c9gixok&ie=&q=CommandLineUnit&sa=%8C%9F%8D%F5#gsc.tab=0&gsc.q=CommandLineUnit&gsc.page=1

また,以下でコードをコピペできます.
http://mrxray.on.coocan.jp/Delphi/plSamples/552_PipeRedirect.htm#04


QZ  2013-12-24 20:56:45  No: 45751

DEKOさん、Mr.XRAYさん、回答ありがとうございます。
>本当にリダイレクトを取り込む必要があるのですか?
別に、リダイレクトで取り込む必要はないのですが、そのほうがスマートかなと思いまして...

今、XPパソコンのRubyプログラムを移植しているんですが、
Rubyでは
    $command = "C:/Program Files/kwic/xdoc2txt.exe " + file_name
    output = `#$command`
で、いけるのでDelphiでも似たようなコマンドがあるかもと思っていました。
CreateProcess 等でやってみます。


QZ  2013-12-26 17:54:31  No: 45752

なぜかうまくいきません。
1.ShellExecute(Handle, 'open', 'D:\xdoc2txt.exe -f','D:\test.doc', nil, SW_NORMAL);
2.ShellExecute(Handle, 'open', 'D:\xdoc2txt.exe -f D:\test.doc',nil, nil, SW_NORMAL);
3.ShellExecute(Handle, 'open', 'D:\xdoc2txt.exe','"-f D:\test.doc"', nil, SW_NORMAL);

Delphiから試験的にテキストファイルを出力させようとしているのですが上の1〜3どれもだめです。
どのようにすればいいんでしょうか?


igy  2013-12-26 19:28:46  No: 45753

試していませんが・・
4.ShellExecute(Handle, 'open', 'D:\xdoc2txt.exe','-f D:\test.doc', nil, SW_NORMAL);
でもダメですか?


tor  2013-12-26 19:33:46  No: 45754

モナでプログラムを実行する場合は、ウ番目の引数ィニゥが実行ファイル名、エ番目ィミゥはそれに与えるパラメータです。
だからウが正解に近いのですが、二重引用符の位置がおかしいような……

プログラムに与えるスイッチィュゥとファイル名はそれぞれ別のパラメータですが、全部をヲサ「「ヲサで囲んだらそれで一つのパラメータと解釈されてしまいます。
×ヲサ「ュヲサトコワョ「
○ヲサュヲサトコワョ
○ヲサュヲサ「トコワョ「ヲサ(ファイルパスが空白を含む場合)

なのでウを少し修正した
ョョョヲサァトコワイョァャヲサァュヲサトコワョァャヲサョョョ
ョョョヲサァトコワイョァャヲサァュヲサ「トコワョ「ァャヲサョョョ
のどちらかでうまくいかないでしょうか?
スススススススススススススススススススススススススススススススススススススススス
ニコ ムレ
トコ イーアウッアイッイカィ木ゥ アアコアーコイー  書込者ノト:ロ 「。。 「 ン

さん、さん、回答ありがとうございます。

お二人のご指摘通りに変更したら、どちらもうまくテキストファイルが作成されました。
マヒ  モナィネャヲサァァャヲサァトコワイョァャァュヲサトコワョァャヲサャヲサモラ゜ホマメヘチフゥサ
マヒ  モナィネャヲサァァャァトコワイョァャヲサァュヲサ「トコワョ「ァヲサャヲサャヲサモラ゜ホマメヘチフゥサ

プログラムに組み込んでうまく動作するまで、もう少しおつきあいください。
スススススススススススススススススススススススススススススススススススススススス
ニコ ムレ
トコ イーアウッアイッイカィ木ゥ アオコイケコオイ  書込者ノト:ロ 「。。 「 ン
モコ 

みなさん、ありがとうございます。
次のようにして、うまく動作させることができました。
ヲサヲサヲサコスヲサァュヲサァヲサォヲサァ「ァヲサォヲサマトアョニホヲサォヲサァ「ァサ
ヲサヲサモナィネャヲサァァャヲサァテコワミヲサニヲサィクカゥヲサワワイョァャミティゥャヲサャヲサモラ゜ホマメヘチフゥサ

なお、モナだと、出力ファイルができる前に、次の読み出し処理が始まるようですが、モで妥協しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加