Und generell bringt dir das mit dem Array auch nicht viel, ausser, dass du die Instanzen dort speichern kannst.
Doch bei jedem Zugriff musst du immer erst den Typ ermitteln, um mit der Instanz etwas anstellen zu können.
Das ist nicht so wirklich
OOP
Aber darauf haben wir ja schon mehrmals hingewiesen, allerdings sehe ich in deinen Klassendefinitionen niemals eine Veränderung.
Hier nochmal ein letzter Versuch:
Delphi-Quellcode:
type
//
Tgeo_objects = class
// Jede Ableitung muss diese procedure überschreiben (override)
procedure Zeichne( aCanvas : TCanvas ); virtual; abstract;
end;
Tgeo_objects_array = array of Tgeo_objects;
TPunkt = class( Tgeo_objects )
x, y : integer;
// Zeichnen eines Punkts
procedure Zeichne( aCanvas : TCanvas ); override;
end;
TLinie = class( Tgeo_objects )
p1, p2 : TPunkt;
// Zeichnen einer Linie
procedure Zeichne( aCanvas : TCanvas ); override;
end;
TRechteck = class( Tgeo_objects )
p1, p2 : TPunkt;
// Zeichnen eines Rechtecks
procedure Zeichne( aCanvas : TCanvas ); override;
end;
implementation
procedure TPunkt.Zeichne( aCanvas : TCanvas );
begin
// Hier jetzt auf den übergebenen Canvas (aCanvas) malen
end;
procedure TLinie.Zeichne( aCanvas : TCanvas );
begin
// Hier jetzt auf den übergebenen Canvas (aCanvas) malen
end;
procedure TRechteck.Zeichne( aCanvas : TCanvas );
begin
// Hier jetzt auf den übergebenen Canvas (aCanvas) malen
end;
Der Gewinn hierbei ist:
Delphi-Quellcode:
procedure TForm1.BtnZeichneArray( Sender : TObject );
var
idx : integer;
begin
// Jedes Element im Array wird nun gezeichnet und zwar auf
// dem Canvas der aktuellen Form-Instanz (Self.Canvas oder einfach Canvas)
for idx := Low( GeoArray ) to High( GeoArray ) do
GeoArray[ idx ].Zeichne( {Self.}Canvas );
end;
Abhängig von der Instanz im Array, wird so automatisch immer die zugehörige Methode Zeichne aufgerufen