lazarus-ccr/examples/process/processdemomainform.pas

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.