You've already forked lazarus-ccr
+ added process demo
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
157
examples/process/processdemomainform.pas
Normal file
157
examples/process/processdemomainform.pas
Normal file
@@ -0,0 +1,157 @@
|
||||
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
|
||||
|
||||
uses
|
||||
{$ifdef win32}
|
||||
windows;
|
||||
{$else}
|
||||
baseunix, unix;
|
||||
{$endif}
|
||||
|
||||
{ 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
|
||||
TotalBytesAvailable: integer;
|
||||
Buffer: string;
|
||||
BytesRead:LongInt;
|
||||
begin
|
||||
if not StartButton.Enabled then
|
||||
StartButton.Enabled := not Process.Running;
|
||||
if Process.Running then begin
|
||||
Windows.PeekNamedPipe(Process.Output.Handle, nil, 0, nil,
|
||||
@TotalBytesAvailable, nil);
|
||||
while TotalBytesAvailable>0 do begin
|
||||
SetLength(Buffer, TotalBytesAvailable);
|
||||
BytesRead := Process.OutPut.Read(Buffer[1], TotalBytesAvailable);
|
||||
OutputMemo.Text := OutputMemo.Text + copy(Buffer,1, BytesRead);
|
||||
Windows.PeekNamedPipe(Process.Output.Handle, nil, 0, nil,
|
||||
@TotalBytesAvailable, nil);
|
||||
NoMoreOutput := false;
|
||||
end;
|
||||
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.
|
||||
|
Reference in New Issue
Block a user