Frequently Asked Component Specific Questions

Options

Display all FAQ items

Search FAQ items:


Displaying items 1 to 1 of 1, page 1 of 1

<< previous next >>

TPlanner
Using a custom TPlannerItem class

For maintaining custom data with each planner item you can assign any TObject descendent class to the PlannerItem's public Object property. However there is a more convenient way to create a descendent class from TPlanner that has a TPlannerItem with new custom properties which can be used at design time and at run time to hold any additional values with each planner item. The code involved comes down to:

1. Write your descendent class of TPlannerItem and add the additional properties. Override the assign procedure to copy the extra properties added.

2. Write your descendent class of the TPlannerItems collection and override the GetItemClass method to instruct the collection to create collection items from your descendent TPlannerItem class.

3. Write your descendent class of TPlanner and override the protected CreateItems method to let the planner use your descendent TPlannerItems collection.

Following code where a new property MyProperty was added to the TPlannerItem, makes this clear:
Example:
unit MyPlanner;
interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Planner;
type 
  TMyPlannerItem = class(TPlannerItem) 
  private 
    FMyProperty: string; 
  public 
    procedure Assign(Source: TPersistent); override; 
  published 
    property MyProperty: string read FMyProperty write FMyProperty; 
  end;

  TMyPlannerItems = class(TPlannerItems) 
  public 
    function GetItemClass: TCollectionItemClass; override; 
  end;

  TMyPlanner = class(TPlanner) 
  private 
    { Private declarations } 
  protected 
    { Protected declarations } 
    function CreateItems: TPlannerItems; override; 
  public 
    { Public declarations } 
  published 
    { Published declarations } 
  end;

procedure Register;

implementation

procedure Register; 
begin 
  RegisterComponents('TMS', [TMyPlanner]); 
end;

{ TMyPlannerItems }

function TMyPlannerItems.GetItemClass: TCollectionItemClass; 
begin 
  Result := TMyPlannerItem; 
end;

{ TMyPlanner }

function TMyPlanner.CreateItems: TPlannerItems; 
begin 
  Result := TMyPlannerItems.Create(Self); 
end;

{ TMyPlannerItem }

procedure TMyPlannerItem.Assign(Source: TPersistent); 
begin 
  inherited Assign(Source); 
  if Assigned(Source) then
    FMyProperty := TMyPlannerItem(source).MyProperty;
end;
end.
Note: the same method can be used for creating custom TPlannerItem classes with the TDBPlanner. In some events, such a TDBItemSource.OnFieldsToItem or TDBItemSource.OnItemToFields, the extra properties of the custom TPlannerItem class can be accessed by casting the Item parameter to the custom TPlannerItem class.