From f9b38ed18fb21fb6bf2f71d2dea63e402e958251 Mon Sep 17 00:00:00 2001 From: vsnijders Date: Tue, 29 Aug 2006 20:00:47 +0000 Subject: [PATCH] + added process demo git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- examples/process/processdemo.lpi | 71 +++++++ examples/process/processdemo.lpr | 15 ++ examples/process/processdemomainform.lfm | 254 +++++++++++++++++++++++ examples/process/processdemomainform.lrs | 85 ++++++++ examples/process/processdemomainform.pas | 157 ++++++++++++++ 5 files changed, 582 insertions(+) create mode 100644 examples/process/processdemo.lpi create mode 100644 examples/process/processdemo.lpr create mode 100644 examples/process/processdemomainform.lfm create mode 100644 examples/process/processdemomainform.lrs create mode 100644 examples/process/processdemomainform.pas diff --git a/examples/process/processdemo.lpi b/examples/process/processdemo.lpi new file mode 100644 index 000000000..38dee068d --- /dev/null +++ b/examples/process/processdemo.lpi @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/process/processdemo.lpr b/examples/process/processdemo.lpr new file mode 100644 index 000000000..3c8fc0655 --- /dev/null +++ b/examples/process/processdemo.lpr @@ -0,0 +1,15 @@ +program ProcessDemo; + +{$mode objfpc}{$H+} + +uses + Interfaces, // this includes the LCL widgetset + Forms + { add your units here }, ProcessDemoMainForm; + +begin + Application.Initialize; + Application.CreateForm(TMultipleProcessDemoForm,MultipleProcessDemoForm); + Application.Run; +end. + diff --git a/examples/process/processdemomainform.lfm b/examples/process/processdemomainform.lfm new file mode 100644 index 000000000..621d6f363 --- /dev/null +++ b/examples/process/processdemomainform.lfm @@ -0,0 +1,254 @@ +object MultipleProcessDemoForm: TMultipleProcessDemoForm + Left = 334 + Height = 502 + Top = 179 + Width = 630 + HorzScrollBar.Page = 629 + VertScrollBar.Page = 501 + ActiveControl = CloseButton + Caption = 'Demo of using multple processes' + OnClose = MultipleProcessDemoFormClose + object CloseButton: TButton + Left = 288 + Height = 25 + Top = 464 + Width = 75 + Anchors = [akLeft, akBottom] + BorderSpacing.InnerBorder = 4 + Caption = 'Close' + OnClick = CloseButtonClick + TabOrder = 0 + end + object ProcessPanel: TPanel + Left = 8 + Height = 438 + Top = 8 + Width = 614 + Align = alClient + BorderSpacing.Bottom = 48 + BorderSpacing.Around = 8 + BevelOuter = bvNone + FullRepaint = False + TabOrder = 1 + object Process1GroupBox1: TGroupBox + Height = 438 + Width = 315 + Align = alLeft + Caption = 'Process 1' + TabOrder = 0 + object Process1InputLabel: TLabel + AnchorSideTop.Control = CommandLine1LabeledEdit + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 17 + Top = 48 + Width = 65 + BorderSpacing.Top = 8 + Caption = 'Input' + Color = clNone + ParentColor = False + end + object Process1OutputLabel1: TLabel + AnchorSideTop.Control = Process1InputMemo + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 17 + Top = 184 + Width = 65 + BorderSpacing.Top = 8 + Caption = 'Output' + Color = clNone + ParentColor = False + end + object CommandLine1LabeledEdit: TLabeledEdit + Left = 8 + Height = 24 + Top = 16 + Width = 289 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Left = 5 + BorderSpacing.Right = 5 + EditLabel.Left = 8 + EditLabel.Height = 17 + EditLabel.Top = -4 + EditLabel.Width = 80 + EditLabel.Caption = 'CommandLine' + EditLabel.Color = clNone + EditLabel.ParentColor = False + ParentColor = False + TabOrder = 0 + Text = '"C:\Program Files\PuTTY\plink.exe" yourputtysessionname' + end + object Process1SendInputButton: TButton + AnchorSideTop.Control = Process1InputMemo + AnchorSideTop.Side = asrBottom + Left = 222 + Height = 25 + Top = 176 + Width = 75 + Anchors = [akTop, akRight] + BorderSpacing.InnerBorder = 4 + Caption = 'Send Input' + OnClick = ProcessSendInputButtonClick + TabOrder = 2 + end + object Process1StartButton: TButton + AnchorSideTop.Control = CommandLine1LabeledEdit + AnchorSideTop.Side = asrBottom + Left = 222 + Height = 25 + Top = 40 + Width = 75 + Anchors = [akTop, akRight] + BorderSpacing.InnerBorder = 4 + Caption = 'Start' + OnClick = ProcessStartButtonClick + TabOrder = 3 + end + object Process1InputMemo: TMemo + AnchorSideTop.Control = Process1InputLabel + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 103 + Top = 73 + Width = 291 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + TabOrder = 1 + end + object Process1OutputMemo: TMemo + AnchorSideTop.Control = Process1OutputLabel1 + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 199 + Top = 209 + Width = 289 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Top = 8 + ScrollBars = ssBoth + TabOrder = 4 + WordWrap = False + end + end + object ProcessSplitter: TSplitter + Left = 315 + Height = 438 + Width = 5 + end + object Process2GroupBox: TGroupBox + Left = 320 + Height = 438 + Width = 294 + Align = alClient + Caption = 'Process 2' + TabOrder = 1 + object Process2InputLabel: TLabel + AnchorSideTop.Control = CommandLine1LabeledEdit + Left = 6 + Height = 17 + Top = 48 + Width = 65 + BorderSpacing.Top = 8 + Caption = 'Input' + Color = clNone + ParentColor = False + end + object Process2OutputLabel: TLabel + AnchorSideTop.Control = Process1InputMemo + Left = 8 + Height = 17 + Top = 184 + Width = 65 + BorderSpacing.Top = 8 + Caption = 'Output' + Color = clNone + ParentColor = False + end + object CommandLine2LabeledEdit: TLabeledEdit + Left = 8 + Height = 24 + Top = 16 + Width = 268 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Left = 5 + BorderSpacing.Right = 5 + EditLabel.Left = 8 + EditLabel.Height = 17 + EditLabel.Top = -4 + EditLabel.Width = 80 + EditLabel.Caption = 'CommandLine' + EditLabel.Color = clNone + EditLabel.ParentColor = False + ParentColor = False + TabOrder = 0 + Text = '"C:\Program Files\PuTTY\plink.exe" yourputtysessionname' + end + object Process2SendInputButton: TButton + AnchorSideTop.Control = Process1InputMemo + Left = 201 + Height = 25 + Top = 176 + Width = 75 + Anchors = [akTop, akRight] + BorderSpacing.InnerBorder = 4 + Caption = 'Send Input' + OnClick = ProcessSendInputButtonClick + TabOrder = 2 + end + object Process2StartButton: TButton + AnchorSideTop.Control = CommandLine1LabeledEdit + Left = 201 + Height = 25 + Top = 40 + Width = 75 + Anchors = [akTop, akRight] + BorderSpacing.InnerBorder = 4 + Caption = 'Start' + OnClick = ProcessStartButtonClick + TabOrder = 3 + end + object Process2InputMemo: TMemo + AnchorSideTop.Control = Process1InputLabel + Left = 6 + Height = 103 + Top = 73 + Width = 270 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + TabOrder = 1 + end + object Process2OutputMemo: TMemo + AnchorSideTop.Control = Process1OutputLabel1 + Left = 8 + Height = 199 + Top = 209 + Width = 268 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Top = 8 + ScrollBars = ssBoth + TabOrder = 4 + WordWrap = False + end + end + end + object Process1: TProcess + Options = [poUsePipes, poStderrToOutPut, poNoConsole] + Priority = ppNormal + left = 456 + top = 8 + end + object ReadOutputIdleTimer: TIdleTimer + Interval = 100 + OnTimer = ReadOutputIdleTimerTimer + left = 456 + top = 152 + end + object Process2: TProcess + Options = [poUsePipes, poStderrToOutPut, poNoConsole] + Priority = ppNormal + left = 456 + top = 72 + end +end diff --git a/examples/process/processdemomainform.lrs b/examples/process/processdemomainform.lrs new file mode 100644 index 000000000..8f4492979 --- /dev/null +++ b/examples/process/processdemomainform.lrs @@ -0,0 +1,85 @@ +{ This is an automatically generated lazarus resource file } + +LazarusResources.Add('TMultipleProcessDemoForm','FORMDATA',[ + 'TPF0'#24'TMultipleProcessDemoForm'#23'MultipleProcessDemoForm'#4'Left'#3'N'#1 + +#6'Height'#3#246#1#3'Top'#3#179#0#5'Width'#3'v'#2#18'HorzScrollBar.Page'#3'u' + +#2#18'VertScrollBar.Page'#3#245#1#13'ActiveControl'#7#11'CloseButton'#7'Capt' + +'ion'#6#31'Demo of using multple processes'#7'OnClose'#7#28'MultipleProcessD' + +'emoFormClose'#0#7'TButton'#11'CloseButton'#4'Left'#3' '#1#6'Height'#2#25#3 + +'Top'#3#208#1#5'Width'#2'K'#7'Anchors'#11#6'akLeft'#8'akBottom'#0#25'BorderS' + +'pacing.InnerBorder'#2#4#7'Caption'#6#5'Close'#7'OnClick'#7#16'CloseButtonCl' + +'ick'#8'TabOrder'#2#0#0#0#6'TPanel'#12'ProcessPanel'#4'Left'#2#8#6'Height'#3 + +#182#1#3'Top'#2#8#5'Width'#3'f'#2#5'Align'#7#8'alClient'#20'BorderSpacing.Bo' + +'ttom'#2'0'#20'BorderSpacing.Around'#2#8#10'BevelOuter'#7#6'bvNone'#11'FullR' + +'epaint'#8#8'TabOrder'#2#1#0#9'TGroupBox'#17'Process1GroupBox1'#6'Height'#3 + +#182#1#5'Width'#3';'#1#5'Align'#7#6'alLeft'#7'Caption'#6#9'Process 1'#8'TabO' + +'rder'#2#0#0#6'TLabel'#18'Process1InputLabel'#21'AnchorSideTop.Control'#7#23 + +'CommandLine1LabeledEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#6#6 + +'Height'#2#17#3'Top'#2'0'#5'Width'#2'A'#17'BorderSpacing.Top'#2#8#7'Caption' + +#6#5'Input'#5'Color'#7#6'clNone'#11'ParentColor'#8#0#0#6'TLabel'#20'Process1' + +'OutputLabel1'#21'AnchorSideTop.Control'#7#17'Process1InputMemo'#18'AnchorSi' + +'deTop.Side'#7#9'asrBottom'#4'Left'#2#8#6'Height'#2#17#3'Top'#3#184#0#5'Widt' + +'h'#2'A'#17'BorderSpacing.Top'#2#8#7'Caption'#6#6'Output'#5'Color'#7#6'clNon' + +'e'#11'ParentColor'#8#0#0#12'TLabeledEdit'#23'CommandLine1LabeledEdit'#4'Lef' + +'t'#2#8#6'Height'#2#24#3'Top'#2#16#5'Width'#3'!'#1#7'Anchors'#11#5'akTop'#6 + +'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#5#19'BorderSpac' + +'ing.Right'#2#5#14'EditLabel.Left'#2#8#16'EditLabel.Height'#2#17#13'EditLabe' + +'l.Top'#2#252#15'EditLabel.Width'#2'P'#17'EditLabel.Caption'#6#11'CommandLin' + +'e'#15'EditLabel.Color'#7#6'clNone'#21'EditLabel.ParentColor'#8#11'ParentCol' + +'or'#8#8'TabOrder'#2#0#4'Text'#6'7"C:\Program Files\PuTTY\plink.exe" yourput' + +'tysessionname'#0#0#7'TButton'#23'Process1SendInputButton'#21'AnchorSideTop.' + +'Control'#7#17'Process1InputMemo'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Le' + +'ft'#3#222#0#6'Height'#2#25#3'Top'#3#176#0#5'Width'#2'K'#7'Anchors'#11#5'akT' + +'op'#7'akRight'#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#10'Send Inp' + +'ut'#7'OnClick'#7#27'ProcessSendInputButtonClick'#8'TabOrder'#2#2#0#0#7'TBut' + +'ton'#19'Process1StartButton'#21'AnchorSideTop.Control'#7#23'CommandLine1Lab' + +'eledEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#3#222#0#6'Height'#2 + +#25#3'Top'#2'('#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#25'BorderS' + +'pacing.InnerBorder'#2#4#7'Caption'#6#5'Start'#7'OnClick'#7#23'ProcessStartB' + +'uttonClick'#8'TabOrder'#2#3#0#0#5'TMemo'#17'Process1InputMemo'#21'AnchorSid' + +'eTop.Control'#7#18'Process1InputLabel'#18'AnchorSideTop.Side'#7#9'asrBottom' + +#4'Left'#2#6#6'Height'#2'g'#3'Top'#2'I'#5'Width'#3'#'#1#7'Anchors'#11#5'akTo' + +'p'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#8#8'TabOrder'#2#1#0#0#5'T' + +'Memo'#18'Process1OutputMemo'#21'AnchorSideTop.Control'#7#20'Process1OutputL' + +'abel1'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#8#6'Height'#3#199#0#3 + +'Top'#3#209#0#5'Width'#3'!'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8 + +'akBottom'#0#17'BorderSpacing.Top'#2#8#10'ScrollBars'#7#6'ssBoth'#8'TabOrder' + +#2#4#8'WordWrap'#8#0#0#0#9'TSplitter'#15'ProcessSplitter'#4'Left'#3';'#1#6'H' + +'eight'#3#182#1#5'Width'#2#5#0#0#9'TGroupBox'#16'Process2GroupBox'#4'Left'#3 + +'@'#1#6'Height'#3#182#1#5'Width'#3'&'#1#5'Align'#7#8'alClient'#7'Caption'#6#9 + +'Process 2'#8'TabOrder'#2#1#0#6'TLabel'#18'Process2InputLabel'#21'AnchorSide' + +'Top.Control'#7#23'CommandLine1LabeledEdit'#4'Left'#2#6#6'Height'#2#17#3'Top' + +#2'0'#5'Width'#2'A'#17'BorderSpacing.Top'#2#8#7'Caption'#6#5'Input'#5'Color' + +#7#6'clNone'#11'ParentColor'#8#0#0#6'TLabel'#19'Process2OutputLabel'#21'Anch' + +'orSideTop.Control'#7#17'Process1InputMemo'#4'Left'#2#8#6'Height'#2#17#3'Top' + +#3#184#0#5'Width'#2'A'#17'BorderSpacing.Top'#2#8#7'Caption'#6#6'Output'#5'Co' + +'lor'#7#6'clNone'#11'ParentColor'#8#0#0#12'TLabeledEdit'#23'CommandLine2Labe' + +'ledEdit'#4'Left'#2#8#6'Height'#2#24#3'Top'#2#16#5'Width'#3#12#1#7'Anchors' + +#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#5 + +#19'BorderSpacing.Right'#2#5#14'EditLabel.Left'#2#8#16'EditLabel.Height'#2#17 + +#13'EditLabel.Top'#2#252#15'EditLabel.Width'#2'P'#17'EditLabel.Caption'#6#11 + +'CommandLine'#15'EditLabel.Color'#7#6'clNone'#21'EditLabel.ParentColor'#8#11 + +'ParentColor'#8#8'TabOrder'#2#0#4'Text'#6'7"C:\Program Files\PuTTY\plink.exe' + +'" yourputtysessionname'#0#0#7'TButton'#23'Process2SendInputButton'#21'Ancho' + +'rSideTop.Control'#7#17'Process1InputMemo'#4'Left'#3#201#0#6'Height'#2#25#3 + +'Top'#3#176#0#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#25'BorderSpa' + +'cing.InnerBorder'#2#4#7'Caption'#6#10'Send Input'#7'OnClick'#7#27'ProcessSe' + +'ndInputButtonClick'#8'TabOrder'#2#2#0#0#7'TButton'#19'Process2StartButton' + ,#21'AnchorSideTop.Control'#7#23'CommandLine1LabeledEdit'#4'Left'#3#201#0#6'H' + +'eight'#2#25#3'Top'#2'('#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#25 + +'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#5'Start'#7'OnClick'#7#23'Proces' + +'sStartButtonClick'#8'TabOrder'#2#3#0#0#5'TMemo'#17'Process2InputMemo'#21'An' + +'chorSideTop.Control'#7#18'Process1InputLabel'#4'Left'#2#6#6'Height'#2'g'#3 + +'Top'#2'I'#5'Width'#3#14#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17 + +'BorderSpacing.Top'#2#8#8'TabOrder'#2#1#0#0#5'TMemo'#18'Process2OutputMemo' + +#21'AnchorSideTop.Control'#7#20'Process1OutputLabel1'#4'Left'#2#8#6'Height'#3 + +#199#0#3'Top'#3#209#0#5'Width'#3#12#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akR' + +'ight'#8'akBottom'#0#17'BorderSpacing.Top'#2#8#10'ScrollBars'#7#6'ssBoth'#8 + +'TabOrder'#2#4#8'WordWrap'#8#0#0#0#0#8'TProcess'#8'Process1'#7'Options'#11#10 + +'poUsePipes'#16'poStderrToOutPut'#11'poNoConsole'#0#8'Priority'#7#8'ppNormal' + +#4'left'#3#200#1#3'top'#2#8#0#0#10'TIdleTimer'#19'ReadOutputIdleTimer'#8'Int' + +'erval'#2'd'#7'OnTimer'#7#24'ReadOutputIdleTimerTimer'#4'left'#3#200#1#3'top' + +#3#152#0#0#0#8'TProcess'#8'Process2'#7'Options'#11#10'poUsePipes'#16'poStder' + +'rToOutPut'#11'poNoConsole'#0#8'Priority'#7#8'ppNormal'#4'left'#3#200#1#3'to' + +'p'#2'H'#0#0#0 +]); diff --git a/examples/process/processdemomainform.pas b/examples/process/processdemomainform.pas new file mode 100644 index 000000000..eb40fcaf0 --- /dev/null +++ b/examples/process/processdemomainform.pas @@ -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. +