Autor Beitrag
os
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.02.07 11:28 
hallo,
als delphi-autodidakt bin ich gerade dabei, mich in die OOP-konzeption der vererbung mit DELPHI5 hinein zu denken.
Dazu habe ich ein sehr einfaches beispiel-prog (s.unten) konstruiert, mit dem ein rechteck bzw. ein kreis gezeichnet werden soll. dazu gibt es eine oberklasse TGrafikklasse, in der die attribute bildschirmposition, fuellfarbe und randfarbe und eine methode anzeigen() definiert werden; hinzu kommen zwei unterklassen für das rechteck und den kreis, die die attribute und methode von TGrafikklasse erben sollen. das programm funktioniert soweit auch,d.h. die Objekte werden an den gewünschten positionen angezeit, ausser, dass die beiden grafikobjekte weiss bleiben, also clGreen bzw. clYellow nicht realisiert werden. Warum werden fuellfarbe bzw. randfarbe aus der Oberklasse nicht die unterklassen durchgereicht? Oder liegt woanders der fehler??


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
unit UZeichenprogramm1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TGrafikklasse = class
   x,y : integer;
   fuellfarbe : TColor;
   randfarbe : TColor;
  procedure anzeigen; virtual;
  end;

  TRechteck = class(TGrafikklasse)
  r,s:integer;
  procedure anzeigen; override;
  end;

  TKreis = class(TGrafikklasse)
  radius: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 TRechteck.anzeigen;
begin
     Form1.canvas.rectangle(x,y,x+100,y+100);
end;

procedure TKreis.anzeigen;
begin
     Form1.canvas.ellipse(x,y,x+radius*2,y+radius*2);
end;

procedure TGrafikklasse.anzeigen;
begin
     Form1.canvas.pen.color := randfarbe;
     Form1.canvas.brush.color := fuellfarbe;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Rechteck  : TRechteck;
begin
     Rechteck := TRechteck.create;
     Rechteck.x:=50;
     Rechteck.y:=60;
     Rechteck.randfarbe:=clGreen;
     Rechteck.fuellfarbe:=clYellow;
     Rechteck.anzeigen;
     Rechteck.destroy;
end;

procedure TForm1.Button2Click(Sender: TObject);
var Kreis  : TKreis;
begin
     Kreis := TKreis.create;
     Kreis.x:=200;
     Kreis.y:=70;
     Kreis.radius:=100;
     Kreis.randfarbe:=clGreen;
     Kreis.fuellfarbe:=clYellow;
     Kreis.anzeigen;
     Kreis.destroy;
end;

end.


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 21.02.07 11:34 
Du musst in den anzeigen-Methoden der abgeleiteten Klassen noch mittels inherited die Methode der Vorfahrklasse aufrufen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
os Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.02.07 15:06 
kannst du das am beispiel der
procedure TRechteck.anzeigen;
noch etwas konkretisieren??
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 21.02.07 15:15 
Eigentlich kannste das genau wörtlich nehmen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TRechteck.anzeigen;
begin
  inherited;
  Form1.canvas.rectangle(x,y,x+100,y+100);
end;


Siehe auch Delphi-Hilfe ;-)

//edit:

Ach ja, es macht keinen Sinn, in den Klassen TRechteck, etc. auf die globale Variable Form1 zuzugreifen. Du willst ja nicht, dass die Klassen nur auf einer Form mit genau diesem Namen arbeiten. Sinn von Klassen ist es auch wiederverwertbaren Code zu produzieren. Der hier ist es überhaupt nicht.
Sinnvoller wäre es, der Methode anzeigen ein Objekt vom Typ TCanvas zu übergeben, auf welches gezeichnet wird.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
os Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.02.07 15:43 
das es so einfach ist wollte ich eigentlich nicht glauben; aber es funktioniert. Also, was habe ich gelernt: inherited = geerbt oder ererbt verschafft den zugriff auf die attribute und methoden der vorgängerklasse..
.. bin gerade auf de.wikibooks.org/wik...i:_Pascal:_Vererbung gestossen, in dem diese zusammenhänge auch recht anschaulich erläutert werden.

vielen dank auch für den berechtigten zusätzlichen verbesserungshinweis zu Form1 und canvas; wie ich jedoch dies umsetzen kann, muss ich noch etwas darüber nachdenken.