2011-08-14 168 views
7

我有以下批處理腳本:讀程序STDIN德爾福

程序已經此源(或多或少):

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

並在備忘錄中輸出爲:

驅動器C中的卷沒有標籤。

我想:

  • 把讀取的部分進入一個循環與eof作爲一個條件 - 在某種程度上造成一個無限循環
  • 編寫循環,以保持閱讀,直到strlen(buff)是0 - 它退出第二次由於某種原因
  • 閱讀過的東西0.5秒(我正在考慮異步寫入stdin),這也失敗了

順便說,直接運行該程序,而不標準輸入數據,導致EInputOutput異常(I/O錯誤)代碼6.

回答

10

GUI應用別t有自動分配的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));