
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@270 8e941d3f-bd1b-0410-a28a-d453659cc2b4
153 lines
4.2 KiB
ObjectPascal
153 lines
4.2 KiB
ObjectPascal
unit ProcessDemoMainForm;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
|
|
StdCtrls, ExtCtrls, Process, LCLProc, ComCtrls;
|
|
|
|
type
|
|
|
|
{ TMultipleProcessDemoForm }
|
|
|
|
TMultipleProcessDemoForm = class(TForm)
|
|
Process2:TProcess;
|
|
Process2GroupBox:TGroupBox;
|
|
Process2InputLabel:TLabel;
|
|
Process2InputMemo:TMemo;
|
|
Process2OutputLabel:TLabel;
|
|
Process2OutputMemo:TMemo;
|
|
Process2SendInputButton:TButton;
|
|
Process2StartButton:TButton;
|
|
CommandLine2LabeledEdit:TLabeledEdit;
|
|
ReadOutputIdleTimer:TIdleTimer;
|
|
Process1:TProcess;
|
|
Process1SendInputButton:TButton;
|
|
Process1StartButton:TButton;
|
|
CloseButton:TButton;
|
|
CommandLine1LabeledEdit:TLabeledEdit;
|
|
Process1InputLabel:TLabel;
|
|
Process1OutputLabel1:TLabel;
|
|
Process1InputMemo:TMemo;
|
|
Process1GroupBox1:TGroupBox;
|
|
Process1OutputMemo:TMemo;
|
|
ProcessPanel:TPanel;
|
|
ProcessSplitter:TSplitter;
|
|
StatusBar1:TStatusBar;
|
|
procedure CloseButtonClick(Sender:TObject);
|
|
procedure MultipleProcessDemoFormClose(Sender:TObject;
|
|
var CloseAction:TCloseAction);
|
|
procedure ProcessSendInputButtonClick(Sender:TObject);
|
|
procedure ProcessStartButtonClick(Sender:TObject);
|
|
procedure ReadOutputIdleTimerTimer(Sender:TObject);
|
|
private
|
|
{ private declarations }
|
|
procedure StartProcess(Process: TProcess; StartButton: TButton;
|
|
const CommandLine: string);
|
|
procedure SendInput(Process: TProcess; InputMemo: TMemo);
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
MultipleProcessDemoForm: TMultipleProcessDemoForm;
|
|
|
|
implementation
|
|
|
|
{ TMultipleProcessDemoForm }
|
|
|
|
procedure TMultipleProcessDemoForm.CloseButtonClick(Sender:TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.MultipleProcessDemoFormClose(Sender:TObject;
|
|
var CloseAction:TCloseAction);
|
|
begin
|
|
if Process1.Running then
|
|
Process1.Terminate(0);
|
|
if Process2.Running then
|
|
Process2.Terminate(0);
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.ProcessSendInputButtonClick(Sender:TObject);
|
|
begin
|
|
if Sender=Process1SendInputButton then
|
|
SendInput(Process1, Process1InputMemo);
|
|
if Sender=Process2SendInputButton then
|
|
SendInput(Process2, Process2InputMemo);
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.ProcessStartButtonClick(Sender:TObject);
|
|
begin
|
|
if Sender=Process1StartButton then
|
|
StartProcess(Process1, Process1StartButton, CommandLine1LabeledEdit.Text);
|
|
if Sender=Process2StartButton then
|
|
StartProcess(Process2, Process2StartButton, CommandLine2LabeledEdit.Text);
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.ReadOutputIdleTimerTimer(Sender:TObject);
|
|
var
|
|
NoMoreOutput: boolean;
|
|
|
|
procedure DoStuffForProcess(Process: TProcess; StartButton: TButton;
|
|
OutputMemo: TMemo);
|
|
var
|
|
Buffer: string;
|
|
BytesAvailable: DWord;
|
|
BytesRead:LongInt;
|
|
begin
|
|
if not StartButton.Enabled then
|
|
StartButton.Enabled := not Process.Running;
|
|
if Process.Running then
|
|
begin
|
|
BytesAvailable := Process.Output.NumBytesAvailable;
|
|
BytesRead := 0;
|
|
while BytesAvailable>0 do
|
|
begin
|
|
SetLength(Buffer, BytesAvailable);
|
|
BytesRead := Process.OutPut.Read(Buffer[1], BytesAvailable);
|
|
OutputMemo.Text := OutputMemo.Text + copy(Buffer,1, BytesRead);
|
|
BytesAvailable := Process.Output.NumBytesAvailable;
|
|
NoMoreOutput := false;
|
|
end;
|
|
if BytesRead>0 then
|
|
OutputMemo.SelStart := Length(OutputMemo.Text);
|
|
end;
|
|
end;
|
|
begin
|
|
repeat
|
|
NoMoreOutput := true;
|
|
DoStuffForProcess(Process1, Process1StartButton, Process1OutputMemo);
|
|
DoStuffForProcess(Process2, Process2StartButton, Process2OutputMemo);
|
|
until noMoreOutput;
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.StartProcess(Process:TProcess;
|
|
StartButton: TButton; const CommandLine: string);
|
|
begin
|
|
if not Process.Running then begin
|
|
StartButton.Enabled := false;
|
|
Process.CommandLine := CommandLine;
|
|
Process.Execute;
|
|
end;
|
|
end;
|
|
|
|
procedure TMultipleProcessDemoForm.SendInput(Process:TProcess;InputMemo:TMemo);
|
|
var
|
|
InputStrings: string;
|
|
begin
|
|
if Process.Running then begin
|
|
InputStrings := InputMemo.Lines.Text;
|
|
Process.Input.Write(InputStrings[1], length(InputStrings));
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
{$I processdemomainform.lrs}
|
|
|
|
end.
|
|
|