Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: TCollection, TCollectionItem

  Alt 13. Okt 2006, 14:00
Hi uwewo,

so, jetzt mal zum Ansatz und Aufbau deiner neuen Kompo TDateLine.

TDateLine ist vom Typ TCustomGrid und damit ein Nachfahre von TComponent.
TDateLine hält einen Member TDateItems vom Typ TCollection.
TDateItems hält die Einträge TDateItem vom Typ TCollectionItem.

Da du deine Einträge gerne als TCustomControls haben möchtest, hält jetzt genau jedes TDateItem ein TControlDateItem vom Typ TCustomControl. Somit verknüpfen wir ursächlich jedes Control mit einem Listeneintrag im DateLine.

das sieht im Objectaufbau etwa so aus:
Delphi-Quellcode:
  // Forward
  TDateLine = class;
  TDateItems = class;

 TControlDateItem = class(TCustomControl)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    procedure Paint; override;
  public
    { Public-Deklarationen }
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  published
    { Published-Deklarationen }
 end;
 
  TDateItem = class(TCollectionItem)
  private
    FParent : TDateItems;
    FControlDateItem : TControlDateItem;
  protected
  public
    constructor Create(Collection: TCollection); override;
  end;

  TDateItems = class(TCollection)
  private
    FDateLine: TDateLine;
    function GetItem(Index: Integer): TDateItem;
    procedure SetItem(Index: Integer; Value: TDateItem);
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TDateItem); reintroduce;
  public
    constructor Create(DateLine: TDateLine);
    function Add: TDateItem;
    procedure Refresh;
    property Items[Index: Integer]: TDateItem read GetItem write SetItem;
    default;
  end;

TDateLine = class(TCustomGrid)
  private
    { Private-Deklarationen }
    FDateItems : TDateItems;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
      property Items: TDateItems read FDateItems write SetDateItems;
  end;
Ich habe hier die spezifischen Eigenschaften weg gelassen.

Ein neues Item im DateLine kann jetzt wie gewohn erschaffen werden.

Delphi-Quellcode:
var Item : TDateItem;
begin
  Item := MyLineControl.Items.Add;
Im Constructor von TDateItem geschieht jetzt folgendes:
Delphi-Quellcode:
constructor TDateItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FParent := TDateItems(Collection);
  FControlDateItem := TControlDateItem.Create((Collection as TDateItems).FDateLine);
end;
Es wird automatisch ein zugehöriges TControlDateItem kreiert. Achte aber darauf, dass der Owner hier nicht self (das Item) sonder TDateLine, also die Kompo ist. Dort soll das Control ja auch platziert werden.

Jetzt ist mir aufgefallen, dass du ne menge obstruser Eigenschaften definierst. Bsp.
Delphi-Quellcode:
 TControlDateItem = class(TCustomControl)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
   property Height;// default 65;
   property Width;// default 65;
   property ColLeft : Integer read FColLeft write FColLeft;
   property RowTop : Integer read FRowTop write FRowTop;
   property ColCount : Integer read FColCount write FColCount;
   property RowCount : Integer read FRowCount write FRowCount;
   property Shape : TItemForm read FShape write SetShape;
   property Brush : TBrush read FBrush write SetBrush;
   property Pen : TPen read FPen write SetPen;
   property Text : String read FText write SetText;
   property Font : TFont read FFont write SetFont;
 end;
Ich unterstell mal, das bei entsprechenden Kalendereinträgen niemand die Breite und Höhe in Pixeln eingibt. Damit sind diese Werte für diese Anwendung wenn schon nicht im Public, so doch im published-Teil sehr fraglich.

Hie veröffentlicht mann eher die Eigenschaften:
Delphi-Quellcode:
  property StartDate : TDateTime read FStartDate write SetStartDate;
  property EndDate : TDateTime read FEndDate write SetEndDate;
die entsprechenden Set-Methoden berechnen und setzen dann die richtigen Werte für Höhe, Breite und Position im DateLine. Bei einer Aktualisierung brauchen dann auch nur noch diese Methoden aufgerufen werden und das Control passt sich automatisch den neuen Einstellungen von DateLine an.

Bu, jetzt hab ich krumme Finger, bis später

oki

P.S. in meinem Code per PM entferne die Auskommentierungen vom 11.10 in TDateItems!
  Mit Zitat antworten Zitat