This is a new site that's currently running on alpha code. There are going to be bugs. If you discover any, please report them on the site's issues page (GitHub account required). Thanks.
Warning: Many URLs are going to change. Refer to the README file to discover which library project's documentation has been completed.
Applies to: ~>3.0
All our example applications so far have been Windows GUI applications. You shouldn’t get the impression that you can only use TPJConsoleApp with GUI applications - it works perfectly well with console applications and this example will show.
Start a new Delphi console application. Now create a new unit in the project and save it as
UMain.pas. Add the following class declaration to the new unit’s interface:
type TMain = class(TObject) private fVisible: Boolean; fNewConsole: Boolean; fTitle: string; procedure WorkHandler(Sender: TObject); procedure ParseCommandLine; public procedure Execute; end;
You don’t have to use
Timed. However note we need a program that runs for at least 2 or 3 seconds.
Add the following implementation of TMain:
uses SysUtils, PJConsoleApp; procedure TMain.Execute; var App: TPJConsoleApp; begin ParseCommandLine; App := TPJConsoleApp.Create; try // Set properties based on parameters App.Visible := fVisible; App.UseNewConsole := fNewConsole; App.ConsoleTitle := fTitle; // Set OnWork handler App.OnWork := WorkHandler; // Run the application WriteLn('Starting Timed.exe'); if not App.Execute('Timed 3') then raise Exception.CreateFmt( '%X: %s', [App.ErrorCode, App.ErrorMessage] ); WriteLn('Timed.exe completed with exit code: ', App.ExitCode); finally App.Free; end; end; procedure TMain.ParseCommandLine; var Param: string; Idx: Integer; begin for Idx := 1 to ParamCount do begin Param := ParamStr(Idx); if Param = '-v' then fVisible := True else if Param = '-n' then fNewConsole := True else if (Param <> _) and (Param <> '-') then fTitle := Param else raise Exception.CreateFmt('Unknown parameter "%s"', [Param]); end; end; procedure TMain.WorkHandler(Sender: TObject); var App: TPJConsoleApp; begin App := Sender as TPJConsoleApp; if App.UseNewConsole then WriteLn('Waited ', App.ElapsedTime, ' ms for Timed.exe'); end;
WorkHandler checks to see if the console application is sharing the main program’s console. If so the handler does not write any output - this would interfere with text written by the child process. If the child process is displaying in its own console (which could be hidden if the Visible property is
False), then the event handler writes out the elapsed time to the main console.
The ParseCommandLine method checks the command line for valid commands and sets the appropriate field values. Valid parameters are:
||The child process is visible. If this switch is not provided the child process is not visible. If the child process is displayed in the host program’s console this switch is ignored.|
||Displays the child process in its own console window. If this switch is not provided the child process outputs to the host’s console window.|
||Text to be displayed in the console window’s title bar. If not supplied the child process’ console window has its default title. Any title is ignored if the child process does not have its own console. Quote any title that contains spaces.|
Now switch back to the project file and enter the following code in the program body:
begin try WriteLn('TPJConsoleApp Example 10'); with TMain.Create do try Execute; finally Free; end; WriteLn('TPJConsoleApp Example 10: Done'); except on E: Exception do WriteLn('ERROR: ', E.Message); end; end.
This code simply displays some text before executing the main code in TMain and signing off. The code also handles any exceptions.
Run the application with various parameters and note its behaviour. See the table above for details of the command line parameters.