![]() |
DELPHI XE4 obj.orient. Programmierung
Hallo Community,
beim Testen von Delphi XE4 habe ich Probleme bei der Ausführung des folgenden Programms. Der Fehler : nach dem Compilieren startet das Programm welches zwei Kreise und ein Rechteck darstellt , aber die Objekte werden nicht mit Farben ausgefüllt. Irgendwas scheint mit der Objektorienten Programmierung nicht zu stimmen. ( also dieses Objekt BRUSH ) Könnt ihr mir helfen ? Hier der Code aus Computerbild 8/2000
Delphi-Quellcode:
unit Zeichenprogramm2;
// Zeichenprogramm Kreis, Rechteck interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TGrafikobjekt=class x,y: integer; fuellFarbe:TColor; randFarbe:TColor; procedure anzeigen;virtual; end; TKreis = class(TGrafikobjekt) radius:integer; procedure anzeigen;override; end; TRechteck=class(TGrafikobjekt) r,s:integer; procedure anzeigen;override; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TKreis.anzeigen; begin Form1.canvas.ellipse(x,y,x+radius*2,y+radius*2); end; procedure TRechteck.anzeigen; begin Form1.canvas.rectangle(x,y,x+100,y+100); end; procedure TGrafikObjekt.anzeigen; begin Form1.canvas.pen.color:=randFarbe; Form1.canvas.brush.color:=fuellFarbe; end; procedure TForm1.Button1Click(Sender: TObject); var Kreis:TKreis; var Kreis2:TKreis; begin Kreis:=TKreis.create; Kreis.x:=50; Kreis.y:=60; Kreis.radius:=100; Kreis.randFarbe:=clGreen; Kreis.fuellFarbe:=clYellow; Kreis.anzeigen; Kreis.destroy; Kreis2:=TKreis.create; Kreis2.x:=20; Kreis2.y:=70; Kreis2.radius:=200; Kreis2.randFarbe:=clRed; Kreis2.fuellFarbe:=clBlue; Kreis2.anzeigen; Kreis2.destroy; end; procedure TForm1.Button2Click(Sender: TObject); var Rechteck:TRechteck; begin Rechteck:=TRechteck.create; Rechteck.x:=100; Rechteck.y:=50; Rechteck.randfarbe:=clGreen; Rechteck.fuellfarbe:=clYellow; Rechteck.anzeigen; Rechteck.destroy; end; end. |
AW: DELPHI XE4 obj.orient. Programmierung
Setz doch in die überschriebenen Methoden ("anzeigen") mal ein inherited in die jeweils erste Zeile. Ansonsten ist der Code sowieso suboptimal, aber bei der Quellenangabe... :roll:
|
AW: DELPHI XE4 obj.orient. Programmierung
Ein fest vercodetes Formular ist auch suboptimal.
|
AW: DELPHI XE4 obj.orient. Programmierung
Zitat:
|
AW: DELPHI XE4 obj.orient. Programmierung
Zitat:
@Detlef Danke...das Schlüsselwort hat geholfen. |
AW: DELPHI XE4 obj.orient. Programmierung
Hallo...
Zitat:
|
AW: DELPHI XE4 obj.orient. Programmierung
Zitat:
|
AW: DELPHI XE4 obj.orient. Programmierung
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:
Obwohl das Zeichnen eigentlich nicht in einen ButtonClick gehört, sondern ins OnPaint-Ereignis, aber das lassen wir mal außen vor.
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; |
AW: DELPHI XE4 obj.orient. Programmierung
Um objektorientierte Programmierung und in diesem Beispiel Polymorphie (Stichwort 'virtual' und 'inherited') zu lernen sieht das bislang nach einem nicht sonderlich tollen Beispiel zum Lernen aus.
Hast du noch eine anderes Tutorial außer der Zeitung? |
AW: DELPHI XE4 obj.orient. Programmierung
Zitat:
Delphi-Quellcode:
statt an den Konstruktor übergeben.
anzeigen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz