Logo

  DELPHI - FAQ

  Delphi-FAQ | Allgemeine Tipps | Grafik | Datenbanken | VCL | DLL-Programmierung |
 
  Delphi-FAQ | VCL | Komponentenentwicklung |
  Property Array of Record ...

Property Array of Record ...

Oft ist es notwendig, eine beliebige Anzahl von Parametern vom Typ eines Records in einer Komponente zur Entwicklungszeit zu editieren. Ab Delphi 3 ist die einfache Erstellung solch einer Komponente ohne Schreiben von eigenen Eigenschaftseditoren möglich. Ein typisches Beispiel ist ein Chart mit einer beliebigen Anzahl von Serien. Für jede Serie soll die Farbe, Weite und Typ der Linie einzelln eingestellt werden können.
unit WlsChart;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls;


type
  TWlsChart = class;

  // enthält eine Serie mit den gewünschten Eigenschaften
  TWlsSerie = class(TCollectionItem)
  private
    FWidth: Integer;
    FColor: TColor;
    FStyle: TPenStyle;
    procedure SetColor(const Value: TColor);
    procedure SetStyle(const Value: TPenStyle);
    procedure SetWidth(const Value: Integer);
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    procedure Paint(Chart: TWlsChart);
  public
    { Public-Deklarationen }
    procedure Assign(Source: TPersistent); override;
  published
    { Published-Deklarationen }
    property Color: TColor read FColor write SetColor;
    property Width: Integer read FWidth write SetWidth;
    property Style: TPenStyle read FStyle write SetStyle;
  end;

  // Behälter mit variabler Anzahl von Serien (Array of...)
  TWlsSerien = class(TOwnedCollection)
  private
    function GetSerie(Index: Integer): TWlsSerie;
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    // Diese Eigenschaft ist nur für den einfachen Zugriff
    // auf eine Serie notwendig
    property Serie[Index: Integer]: TWlsSerie read GetSerie; default;
  published
    { Published-Deklarationen }
  end;

  // eigendliches Chart
  TWlsChart = class(TCustomPanel)
  private
    FSerien: TWlsSerien;
    procedure SetSerien(const Value: TWlsSerien);
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    procedure Paint; override;
  public
    { Public-Deklarationen }
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property Serien: TWlsSerien read FSerien write SetSerien;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TWlsChart]);
end;

{ TWlsSerie }

// Assign muß überschrieben werden, daß die Komponente auch auf
// vererbten Formularen funktioniert.
procedure TWlsSerie.Assign(Source: TPersistent);
begin
  if Source is TWlsSerie then begin
    FColor := TWlsSerie(Source).FColor;
    FWidth := TWlsSerie(Source).FWidth;
    FStyle := TWlsSerie(Source).FStyle;
  end;
end;

procedure TWlsSerie.Paint(Chart: TWlsChart);
begin
  // Hier die Serie zeichnen
end;

procedure TWlsSerie.SetColor(const Value: TColor);
begin
  FColor := Value;
end;

procedure TWlsSerie.SetStyle(const Value: TPenStyle);
begin
  FStyle := Value;
end;

procedure TWlsSerie.SetWidth(const Value: Integer);
begin
  FWidth := Value;
end;

{ TWlsChart }

constructor TWlsChart.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  FSerien := TWlsSerien.Create(self, TWlsSerie);
end;

destructor TWlsChart.Destroy;
begin
  FSerien.Free;
  inherited Destroy;
end;

procedure TWlsChart.Paint;
var
  z: integer;
begin
  inherited Paint;
  for z := 0 to Serien.Count - 1 do
    Serien[z].Paint(Self);
end;

procedure TWlsChart.SetSerien(const Value: TWlsSerien);
begin
  FSerien.Assign(Value);
end;

{ TWlsSerien }

function TWlsSerien.GetSerie(Index: Integer): TWlsSerie;
begin
  Result := Items[Index] as TWlsSerie;
end;

end.




 26.01.2006 © wlsoft www.wlsoft.de