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.
|