Setz doch mal einen Haltepunkt auf das inherited und geh schrittweise durch, dann siehst Du, was dort geschieht. Und damit es nicht heißt, wir würden nur meckern, hier ein Alternativvorschlag:
Delphi-Quellcode:
type
TGrafikobjekt = class
private
Fx, Fy: integer;
FfuellFarbe: TColor;
FrandFarbe: TColor;
protected
FCanvas: TCanvas;
procedure anzeigen; virtual;
public
constructor Create(ACanvas: TCanvas); virtual;
property X: integer read Fx write Fx;
property Y: integer read Fy write Fy;
property fuellFarbe: TColor read FfuellFarbe write FfuellFarbe;
property randFarbe: TColor read FrandFarbe write FrandFarbe;
end;
TKreis = class(TGrafikobjekt)
private
FRadius: integer;
public
constructor Create(ACanvas: TCanvas); override;
procedure anzeigen; override;
property Radius: integer read FRadius write FRadius;
end;
TRechteck = class(TGrafikobjekt)
private
FLaenge: integer;
FHoehe: integer;
public
constructor Create(ACanvas: TCanvas); override;
procedure anzeigen; override;
property Laenge: integer read FLaenge write FLaenge;
property Hoehe: integer read FHoehe write FHoehe;
end;
...
{ TGrafikobjekt }
procedure TGrafikobjekt.anzeigen;
begin
if Assigned(FCanvas) then
begin
FCanvas.Brush.Color := FfuellFarbe;
FCanvas.Pen.Color := FrandFarbe;
end;
end;
constructor TGrafikobjekt.Create(ACanvas: TCanvas);
begin
inherited Create;
FCanvas := ACanvas;
FfuellFarbe := clWhite;
FrandFarbe := clBlack;
end;
{ TKreis }
procedure TKreis.anzeigen;
begin
inherited;
if Assigned(FCanvas) then
FCanvas.Ellipse(X, Y, X + FRadius * 2, Y + FRadius * 2);
end;
constructor TKreis.Create(ACanvas: TCanvas);
begin
inherited;
FRadius := 20;
end;
{ TRechteck }
procedure TRechteck.anzeigen;
begin
inherited;
if Assigned(FCanvas) then
FCanvas.Rectangle(X, Y, X + FLaenge, Y + FHoehe);
end;
constructor TRechteck.Create(ACanvas: TCanvas);
begin
inherited;
FLaenge := 40;
FHoehe := 30;
end;
...
procedure TfrmDemo.btnKreisClick(Sender: TObject);
var
Kreis: TKreis;
begin
Kreis := TKreis.Create(Canvas);
try
Kreis.X := 70;
Kreis.Y := 100;
Kreis.randFarbe := clGreen;
Kreis.fuellFarbe := clRed;
Kreis.Radius := 30;
Kreis.anzeigen;
finally
Kreis.Free;
end;
end;
procedure TfrmDemo.btnRechteckClick(Sender: TObject);
var
Rechteck: TRechteck;
begin
Rechteck := TRechteck.Create(Canvas);
try
Rechteck.X := 10;
Rechteck.Y := 10;
Rechteck.Laenge := 50;
Rechteck.Hoehe := 20;
Rechteck.randFarbe := clRed;
Rechteck.fuellFarbe := clYellow;
Rechteck.anzeigen;
finally
Rechteck.Free;
end;
end;
Obwohl das Zeichnen eigentlich nicht in einen ButtonClick gehört, sondern ins OnPaint-Ereignis, aber das lassen wir mal außen vor.