Delphi 10.1 BerlinでDOSCommandコンポーネントを使う

TurboPackDOSCommandコンポーネントは、バッチファイルを実行し、出力された文字を受け取ることができるコンポーネントです。
VCLアプリケーションとFireMonkeyアプリケーションの両方で使用できます。
対応しているOSはWindowsのみです。

DOSCommand-2

GetItに登録されているので、簡単にインストールできます。

DOSCommand-1

コマンドラインを実行する

実行するコマンドラインを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コンポーネントを配置します。

DOSCommand-3

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;

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です