1 Indexed property declaration; Default
2 Ordinal property declaration Default Ordinal constant;
Description
The Default directive is used in two separate, and quite different ways with properties to establish default processing.
Version 1
When you have one or more properties that used an index as a parameter (see the example and Index for further details), you can specify the Default directive. It allows you to use a more compact way of using the property.
Instead of :
myValue := MyObject.GetItem(23);
We can use :
myValue := MyObject[23];
This can make for more readable and compact code, but can be confusing for newcomers to Delphi - they will see MyObject is not an array and find it difficult to find the mechanism. Especially if the class is big.
Version 2
Has a much more specialised use. It stores the supplied default ordinal property value in the run time information for the class. Its use is beyond the scope of Delphi Basics.
Related commands
Private Starts the section of private data and methods in a class
Property Defines controlled access to class fields
Protected Starts a section of class private data accesible to sub-classes
Public Starts an externally accessible section of a class
Published Starts a published externally accessible section of a class
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
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
// Class with Indexed properties
TRectangle = class
private
fCoords: array[0..3] of Longint;
function GetCoord(Index: Integer): Longint;
procedure SetCoord(Index: Integer; Value: Longint);
public
property Left : Longint Index 0 read GetCoord write SetCoord;
property Top : Longint Index 1 read GetCoord write SetCoord;
property Right : Longint Index 2 read GetCoord write SetCoord;
property Bottom : Longint Index 3 read GetCoord write SetCoord;
property Coords[Index: Integer] : Longint
read GetCoord write SetCoord; Default;
end;
// The form class itself
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// TRectangle property 'Getter' routine
function TRectangle.GetCoord(Index: Integer): Longint;
begin
// Only allow valid index values
if (Index >= 0) and (Index <= 3)
then Result := fCoords[Index]
else Result := -1;
end;
// TRectangle property 'Setter' routine
procedure TRectangle.SetCoord(Index, Value: Integer);
begin
// Only allow valid index values
if (Index >= 0) and (Index <= 3)
then fCoords[Index] := Value;
end;
// Main line code
procedure TForm1.FormCreate(Sender: TObject);
var
myRect : TRectangle;
begin
// Create my little rectangle
myRect := TRectangle.Create;
// And set the corner coordinates
myRect.Left := 22; // Left using direct method
myRect.Top := 33;
myRect.SetCoord(2,44); // Right using indexed method
myRect.SetCoord(3,55);
// Get the first two coords using the get method name
ShowMessage('myRect coord 0 = '+intToStr(myRect.GetCoord(0)));
ShowMessage('myRect coord 0 = '+intToStr(myRect.GetCoord(1)));
// Now use the more compact version to get the remaining coords
// This is only possible when we have a 'default' indexed property
ShowMessage('myRect coord 1 = '+intToStr(myRect[2]));
ShowMessage('myRect coord 1 = '+intToStr(myRect[3]));
end;
end.
myRect coord 0 = 22
myRect coord 1 = 33
myRect coord 2 = 44
myRect coord 3 = 55