2011-08-14 15 views
7

にSTDIN:読むプログラムは、私は、次のバッチスクリプトいるデルファイ

そしてプログラムがこのソース(多かれ少なかれ)があります。

procedure TForm1.FormCreate(Sender: TObject); 
var buff: String; 
begin 
    Read(buff); 
    Memo1.Lines.Text:=buff; 
end; 

とメモで出力は次のようになります。

ドライブCのボリュームにはラベルがありません。

私が試した:

  • は条件としてeofとループに読み取り部分を入れて - それが終了します - 何とかstrlen(buff)が0になるまで読み続けるためにループを書く無限ループ
  • を引き起こし何らかの理由で二度目に
  • 私はstdinへの非同期書き込みについて考えていましたが、これも失敗しました。これはうまくいっていませんでした。
ところで

は、直接プログラムを実行して、STDINデータなしで、EInputOutput例外(I/Oエラー)コードを引き起こす6

答えて

10

GUI「はドンをアプリストリームアプローチを使用してみてくださいstdin、stdoutまたはstderrが自動的に割り当てられます。あなたのような何かを行うことができます:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    Buffer: array[0..1000] of Byte; 
    StdIn: TStream; 
    Count: Integer; 
begin 
    StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
    Count := StdIn.Read(Buffer, 1000); 
    StdIn.Free; 
    ShowMessageFmt('%d', [Count]); 
end; 

あなたが行う場合

dir *.pas | myapp.exe 
あなたは数> 0とメッセージボックスが表示されます、そして、あなたがしなければ

myapp.exe 

あなたはよ0のメッセージボックスを見てください。どちらの場合でも、フォームが表示されます。

+0

これはうまく動作します。 'Count Christian

+0

はい、Count

+0

完了。魅力的な作品! – Christian

3

代わりRead(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
関連する問題