TurboPackのDOSCommandコンポーネントは、バッチファイルを実行し、出力された文字を受け取ることができるコンポーネントです。
VCLアプリケーションとFireMonkeyアプリケーションの両方で使用できます。
対応しているOSはWindowsのみです。
GetItに登録されているので、簡単にインストールできます。
コマンドラインを実行する
実行するコマンドラインをCommandLineプロパティに設定して、Executeメソッドでプロセスを実行します。
DosCommand1.CommandLine := 'C:\Users\yamamoto\Documents\dir.bat';
DosCommand1.Execute;
カレントディレクトリを設定するにはCurrentDirプロパティを使用します。
DosCommand1.CurrentDir := 'C:\Users\yamamoto\';
出力を取得する
OnNewCharイベントで新しく出力された文字を取得できます。
OnNewLineイベントで出力された行を取得できます。
procedure TForm1.DosCommand1NewLine(ASender: TObject; const ANewLine: string;
AOutputType: TOutputType);
begin
case AOutputType of
otEntireLine:
Memo1.Lines.Add(ANewLine);
end;
end;
memoやricheditに出力を直接渡したいときは、OutputLinesプロパティを使います。
DosCommand1.OutputLnes := Memo1.Lines;
Linesプロパティでコマンドのすべての出力を取得できます。
Memo2.Lines.AddStrings(DosCommand1.Lines);
入力を送信する
SendLine関数でDOSプロセスに入力を送信できます。
DosCommand1.SendLine('', True);
プロセスを中止する
OnTerminatedイベントでコマンドの終了を取得できます。
procedure TForm1.DosCommand1Terminated(Sender: TObject);
begin
Memo1.Lines.Add('終了しました。');
end;
プロセスが終わる前に止めたいときは、Stopメソッドを使います。
※未確認
X秒間実行した後にプロセスを止めたいときは、MaxTimeAfterBeginningプロパティを使います。
※未確認
X秒間出力がなければプロセスを止めたい場合は、MaxTimeAfterLastOutputプロパティを使います。
※未確認
その他の設定
Priorityプロパティでプロセスの優先度を変更できます。
uses Winapi.Windows;
DosCommand1.Priority := HIGH_PRIORITY_CLASS;
優先度には次の値を設定します。
- HIGH_PRIORITY_CLASS
- IDLE_PRIORITY_CLASS
- NORMAL_PRIORITY_CLASS
- REALTIME_PRIORITY_CLASS
TerminatedプロパティがTrueのとき、入力された文字を出力します。
※未確認
サンプルアプリケーション
フォームにTDosCommandコンポーネントと、TButtonコンポーネント、TMemoコンポーネントを配置します。
Button1を押すと、カレントディレクトリを「C:\Users\yamamoto\」にして、バッチファイル「C:\Users\yamamoto\Documents\dir.bat」を実行します。
出力された内容ははMemo1に表示します。
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
DosCommand1.CurrentDir := 'C:\Users\yamamoto\';
DosCommand1.CommandLine := 'C:\Users\yamamoto\Documents\dir.bat';
DosCommand1.Execute;
end;
procedure TForm1.DosCommand1NewLine(ASender: TObject; const ANewLine: string;
AOutputType: TOutputType);
begin
// 出力された文字を1行ずつ受け取る
case AOutputType of
otEntireLine:
Memo1.Lines.Add(ANewLine);
end;
end;
procedure TForm1.DosCommand1Terminated(Sender: TObject);
begin
Memo1.Lines.Add('終了しました。');
end;
could help make an Android chat delphi? I thank you!