Difference between revisions of "Property"

From Lazarus wiki
m (Objects as properties)
(Example: Fixed property name. Thanks Fred vS!)
Line 17: Line 17:
 
     procedure SetColor(CarColor: string);
 
     procedure SetColor(CarColor: string);
 
   public
 
   public
     property TheColor: string read FColor write SetColor; //Reads directly from the FColor variable;  
+
     property Color: string read FColor write SetColor; //Reads directly from the FColor variable;  
     // directs writes to the SetColor procedure that then changes the FColor variable..
+
     // directs writes to the SetColor procedure that then changes the FColor variable.
 +
    // Another option could be to just do "write FColor" to directly write to the FColor variable..
  
 
   end;
 
   end;
Line 24: Line 25:
 
procedure TCar.SetColor(CarColor: string);
 
procedure TCar.SetColor(CarColor: string);
 
begin
 
begin
   //we can do other things here to, such as housekeeping, notifying others of changes,
+
   //we can do other things here, too, such as housekeeping, notifying others of changes,
   //validating against other variables, logging, etc
+
   //validating against other variables, logging, etc -e.g.
 +
  if CarColor='Pink' then
 +
    ShowMessage('Note: pink is not a very common color for a car.');
 
   FColor:=CarColor;
 
   FColor:=CarColor;
 
end;
 
end;

Revision as of 19:32, 6 December 2012

Template:property
Back to the Reserved words.

Documentation

Official FPC documentation: [1]

Description

The reserved word property is part of object-oriented programming. It can allow various levels (read, read/write etc) outside access to variables inside the class.

Example

type
  TCar = class
  private
    FColor: string;
    FBuildYear: integer;
    procedure SetColor(CarColor: string);
  public
    property Color: string read FColor write SetColor; //Reads directly from the FColor variable; 
    // directs writes to the SetColor procedure that then changes the FColor variable.
    // Another option could be to just do "write FColor" to directly write to the FColor variable..

  end;

procedure TCar.SetColor(CarColor: string);
begin
  //we can do other things here, too, such as housekeeping, notifying others of changes,
  //validating against other variables, logging, etc -e.g.
  if CarColor='Pink' then
    ShowMessage('Note: pink is not a very common color for a car.');
  FColor:=CarColor;
end;

procedure PropertyExample();   //shows how to set properties and read them
var
  MyCar: TCar;                 // Will hold a TCar instance; used in the example subAuto
begin
  MyCar := TCar.Create;        // Create the object
  try
    MyCar.Color:='Green';      // Sets the color property... which calls the setcolor function... which sets the object's FColor variable
    showmessage(MyCar.Color);  // Now read the object property again... should show Green
  finally
    MyCar.Free;                // Free the memory for the object again, regardless of what errors occurred in the rest of the code
  end;
end;

Objects as properties

You can assign objects as properties, e.g.:

type
  TEngine = class
  ...
  TCar = class
  private
    FMyEngine: TEngine;
  public
    property Engine: TEngine read FMyEngine;
  implementation
  ...
  Code in TCar that creates and frees FMyEngine as needed (e.g. in the constructor and destructor)
  ...

Read access here means something that may not be obvious at first glance. Outside code has read only access to the pointer/reference to the TEngine object in question, which means it cannot create or destroy the object.

However, it can use this read access to access the properties of the FMyEngine object and change those.

If you wish to give calling code the responsibility of creating and destorying the object, you can also assign write access, e.g.

...
  public
    property Engine: TEngine read FMyEngine write FMyEngine;
...