Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DELPHI XE4 obj.orient. Programmierung (https://www.delphipraxis.net/174989-delphi-xe4-obj-orient-programmierung.html)

twofel 23. Mai 2013 10:23

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.

DeddyH 23. Mai 2013 10:28

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:

mkinzler 23. Mai 2013 10:37

AW: DELPHI XE4 obj.orient. Programmierung
 
Ein fest vercodetes Formular ist auch suboptimal.

Lemmy 23. Mai 2013 10:38

AW: DELPHI XE4 obj.orient. Programmierung
 
Zitat:

Zitat von DeddyH (Beitrag 1216187)
Ansonsten ist der Code sowieso suboptimal

das ist aber noch sehr nett umschrieben.

twofel 23. Mai 2013 10:46

AW: DELPHI XE4 obj.orient. Programmierung
 
Zitat:

Zitat von DeddyH (Beitrag 1216187)
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:


@Detlef


Danke...das Schlüsselwort hat geholfen.

haentschman 23. Mai 2013 10:47

AW: DELPHI XE4 obj.orient. Programmierung
 
Hallo...
Zitat:

Danke...das Schlüsselwort hat geholfen.
...und hast du mal recherchiert warum ? 8-)

twofel 23. Mai 2013 10:56

AW: DELPHI XE4 obj.orient. Programmierung
 
Zitat:

Zitat von haentschman (Beitrag 1216191)
Hallo...
...und hast du mal recherchiert warum ? 8-)

nehme an inherited sorgt dafür, dass alle notwendigen Initialisierungen aufgerufen werden ....oder ?

DeddyH 23. Mai 2013 11:01

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

Der schöne Günther 23. Mai 2013 11:15

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?

uligerhardt 23. Mai 2013 11:15

AW: DELPHI XE4 obj.orient. Programmierung
 
Zitat:

Zitat von DeddyH (Beitrag 1216195)
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:

Ich würde den Canvas lieber an
Delphi-Quellcode:
anzeigen
statt an den Konstruktor übergeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.
Seite 1 von 2  1 2      

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