| 
| Description |  | The Procedure keyword defines a subroutine that does not return a value. See the SubRoutines tutorial for details on using procedures. 
 Version 1
Defines a procedure that operates with no parameters.
 
 Version 2
Defines a procedure that is passed one or more parameters.
 
 When a procedure is defined in a class, it is commonly called a Method.
 
 The same name may be used for more than one procedure as long as the Overload directive is used. The other main directives, in the order that they should appear is given here:
 
 
 | Reintroduce | : Redefines a suppressed function |  | Overload | : Allows same name for 2 or more functions |  | Virtual | : Can be redefined in a child class |  | Override | : Redefines a parent class method |  | Abstract | : Forces child class to implement | 
 
 Version 3
Defines a procedure as a data type. This allows the procedure to be passed as a parameter, and used as a variable. The type definition defines just the profile of the procedure - and not the name.
 
 A variable of such a type could be assigned the name of any procedure with that profile. When assigned, the variable name can be treated as if it were a procedure name. See the example code.
 
 Further still, the Of Object option allows you to refer to an object method. Access to a variable of such type would then behave as if you were calling the object method directly. See the second example.
 |  |  |  | Related commands |  | 
| Abstract |  | Defines a class method only implemented in subclasses |  
| Const |  | Starts the definition of fixed data values |  
| Function |  | Defines a subroutine that returns a value |  
| Out |  | Identifies a routine parameter for output only |  
| Overload |  | Allows 2 or more routines to have the same name |  
| Override |  | Defines a method that replaces a virtual parent class method |  
| Var |  | Starts the definition of a section of data variables |  
| Virtual |  | Allows a class method to be overriden in derived classes |  
| Dynamic |  | Allows a class method to be overriden in derived classes |  |  |  | 
| Example code : A simple example |  | // Full Unit code. // -----------------------------------------------------------
 // You must store this code in a unit called Unit1 with a form
 // called Form1 that has an OnCreate event called FormCreate.
 
 unit Unit1;
 
 interface
 
 uses
 // The System unit does not need to be defined
 Forms, Dialogs;
 
 type
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 end;
 
 var
 Form1: TForm1;
 
 implementation
 {$R *.dfm} // Include form definitions
 
 Procedure ShowSum(a, b : Integer);
 var
 total : Integer;
 begin
 // Add the two numbers together
 total := a + b;
 
 // And display the sum
 ShowMessageFmt('%d + %d = %d',[a,b,total]);
 end;
 
 // The main form On Create routine - our main program
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 // Show the sum of a few number pairs
 ShowSum(1,2);
 ShowSum(245,62);
 end;
 
 end.
 
 |  
 | 1 + 2 = 3 245 + 62 = 307
 
 |  |  |  | Example code : Illustrating a Procedure and a Procedure type |  | // Full Unit code. // -----------------------------------------------------------
 // You must store this code in a unit called Unit1 with a form
 // called Form1 that has an OnCreate event called FormCreate.
 
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
 
 type
 // The form class itself
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 // In line functions
 Procedure ShowMsg(msg : string);
 begin
 ShowMessage(msg);
 end;
 
 Procedure ShowLongMsg(msg : string);
 begin
 WriteLn('Message text = '+msg);
 end;
 
 // Main line code
 procedure TForm1.FormCreate(Sender: TObject);
 type
 TShowProc = Procedure(msg : string);
 
 var
 showProc : TShowProc;
 
 begin
 // Use the ShowMsg proc directly
 WriteLn('Using ShowMsg directly :');
 ShowMsg('Hello World');
 
 // Use ShowMsg indirectly
 WriteLn('Using ShowMsg indirectly :');
 showProc := ShowMsg;
 showProc('Hello again');
 
 // Use ShowLongMsg indirectly
 WriteLn('Using ShowLongMsg indirectly :');
 showProc := ShowLongMsg;
 showProc('Hello again');
 end;
 
 end.
 
 |  
 | Using ShowMsg directly : Hello World
 Using ShowMsg indirectly :
 Hello again
 Using ShowLongMsg indirectly :
 Message text = Hello again
 
 |  |  |  | Example code : Using a type of a procedure of a class |  | // Full Unit code. // -----------------------------------------------------------
 // You must store this code in a unit called Unit1 with a form
 // called Form1 that has an OnCreate event called FormCreate.
 
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
 
 type
 // Define a simple class
 TSimple = class
 private
 name : string;
 public
 function GetName : string;
 Procedure SetName(name : string);
 constructor Create(name : string);
 end;
 
 // The form class itself
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 // Create a simple object
 constructor TSimple.Create(name: string);
 begin
 // Save the passed string
 self.name := name;
 end;
 
 // Returns the simple name
 function TSimple.GetName: string;
 begin
 Result := name;
 end;
 
 // Assigns the passed name
 Procedure TSimple.SetName(name : string);
 begin
 self.name := name;
 end;
 
 // Main line code
 procedure TForm1.FormCreate(Sender: TObject);
 type
 TNameProc = Procedure(name : string) of object;
 
 var
 simple   : TSimple;
 nameProc : TNameProc;
 
 begin
 // Create a simple object
 simple := TSimple.Create('Brian');
 
 // And set the name
 simple.SetName('New name');
 
 // Show the object name
 WriteLn('Name now = '+simple.GetName);
 
 // Refer to the SetName method
 nameProc := simple.SetName;
 
 // And set the name
 nameProc('Even newer name');
 
 // Show the object name
 WriteLn('Name now = '+simple.GetName);
 end;
 end.
 
 |  
 | Name now = New name Name now = Even newer name
 
 |  |