Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zugriff auf Unterklassen (https://www.delphipraxis.net/113357-zugriff-auf-unterklassen.html)

cetinbiryoldayim 6. Mai 2008 17:51


zugriff auf Unterklassen
 
ich habe zuvor über eine verwandte Frage ein Thema erstellt gehabt und Antwort bekommen (siehe http://forum.delphi-treff.de/showthread.php?t=23607)

aber ich habe jetzt ein ähnliches Programm untersucht (von meinem Lehrer)
und habe gesehn, dass es bei diesem Programm geht
die klasse Steuerung kann hier einfach dieFunktion.Destroy() aufrufen

warum kann man das jetzt?
(ich könnte auch den vollständige Programmcode senden, ist halt etwas lang)

Delphi-Quellcode:
type TFkt_Typ = (GERADE, PARABEL, SINUS);
 
type
  TSteuerung = class;
 
  TF_Main = class(TForm)
    RG_fkt_typ: TRadioGroup;
    R_gerade: TRadioButton;
    r_parabel: TRadioButton;
    r_sinus: TRadioButton;
    E_a: TEdit;
    E_b: TEdit;
    E_c: TEdit;
    E_min: TEdit;
    E_max: TEdit;
    L_a: TLabel;
    L_b: TLabel;
    L_c: TLabel;
    L_min: TLabel;
    L_max: TLabel;
    B_berechne: TButton;
    B_ende: TButton;
    E_flaeche: TEdit;
    L_Flaeche: TLabel;
    procedure B_endeClick(Sender: TObject);
    procedure B_berechneClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  strict private
    dieSteuerung: TSteuerung;
    function getFloatFromEdit(Edit: TEdit; error_msg: String): real;
  public
    procedure zeigeErgebnis(flaeche: real);
    function gibFunktionsTyp(): TFkt_Typ;
    function gibXMin(): real;
    function gibXMax(): real;
    function gibParA(): real;
    function gibParB(): real;
    function gibParC(): real;
  end;
 
  TSteuerung = class
    strict private
      dieOberflaeche: TF_Main;
      dieFunktion: TFunktion;
      procedure ermittleFlaeche();
    public
      constructor erzeugeSteuerung(myForm: TF_Main);
      procedure tastaturEreignis();
      procedure beendeProgramm();
  end;
 
type TFunktion = class abstract
  strict protected
    a:   real;
    b:   real;
    c:   real;
    xMin: real;
    xMax: real;
  strict protected
    function berechneFunktionswert(x: real): real; virtual; abstract;
  strict private
    function berechneFlaeche(n: cardinal): real;
  public
    function berechneFlaeche2(epsilon: real): real;
    procedure setzeParameter(pa: real; pb: real; pc: real);
    procedure setzeGrenzen(min: real; max: real);
end;
 
type TGerade = class(TFunktion)
  strict protected
    function berechneFunktionswert(x: real): real; override;
end;
 
type TParabel = class(TFunktion)
  strict protected
    function berechneFunktionswert(x: real): real; override;
end;
 
type TSinus = class(TFunktion)
  strict protected
    function berechneFunktionswert(x: real): real; override;
end;
 
 
 
 
procedure TSteuerung.ermittleFlaeche();
  var fkt_typ : TFkt_Typ;
      a, b, c : real;
      min, max: real;
begin
  fkt_typ := dieOberflaeche.gibFunktionsTyp();
  case fkt_typ of                               // erzeuge Funktions-Objekt
    GERADE : dieFunktion := TGerade.Create;
    PARABEL: dieFunktion := TParabel.Create;
    SINUS : dieFunktion := TSinus.Create;
  end;
  a := dieOberflaeche.gibParA();
  b := dieOberflaeche.gibParB();
  if fkt_typ <> GERADE then
    c := dieOberflaeche.gibParC()
  else
    c := 0;
  min := dieOberflaeche.gibXMin();
  max := dieOberflaeche.gibXMax();
  dieFunktion.setzeParameter(a, b, c);
  dieFunktion.setzeGrenzen(min, max);
  dieOberflaeche.zeigeErgebnis(dieFunktion.berechneFlaeche2(0.0000001));
  dieFunktion.Destroy;                      // ??????????????????????????????
end;

DeddyH 6. Mai 2008 17:58

Re: zugriff auf Unterklassen
 
Da ist ja auch noch die abstrakte Klasse TFunktion "dazwischengeschaltet".

cetinbiryoldayim 6. Mai 2008 18:01

Re: zugriff auf Unterklassen
 
aber das hat doch keinen Einfluss auf den Aufruf des Destruktors (dieFunktion.Destroy)
oder?

mkinzler 6. Mai 2008 18:03

Re: zugriff auf Unterklassen
 
Wie erwähnt, sollte man Destroy nie direkt aufrufen, sondern .Free

cetinbiryoldayim 6. Mai 2008 18:06

Re: zugriff auf Unterklassen
 
ja das hab ich verstanden :)
das Problem ist nur, dass es vorhin mit einem direkten Aufruf nicht geklappt hat, wobei es im Programm meines Lehers funktioniert.
woran das liegt, das habe ich nicht vertanden..

DeddyH 6. Mai 2008 18:10

Re: zugriff auf Unterklassen
 
Jede Klasse, bei der der Vorfahr nicht anders angegeben ist, erbt automatisch von TObject. Beim Aufruf von Destroy wird also der destruktor Destroy von TObject ausgeführt. Sollte ich etwas übersehen oder falsch dargestellt haben, korrigiere man mich bitte.

cetinbiryoldayim 6. Mai 2008 18:21

Re: zugriff auf Unterklassen
 
könntest du dann auch sagen, warum es im anderen Programm nicht ging? warum hat er dann dort nicht den Standartdestruktor erkannt? er müsste ihn doch geerbt haben von TObject..

mkinzler 6. Mai 2008 18:25

Re: zugriff auf Unterklassen
 
Vielleicht wegen den Klammern?

bluesbear 6. Mai 2008 19:08

Re: zugriff auf Unterklassen
 
Zitat:

Zitat von DeddyH
Jede Klasse, bei der der Vorfahr nicht anders angegeben ist, erbt automatisch von TObject. Beim Aufruf von Destroy wird also der destruktor Destroy von TObject ausgeführt. Sollte ich etwas übersehen oder falsch dargestellt haben, korrigiere man mich bitte.

Hmm, jetzt verwirr mich nicht. Es wird doch immer die zuletzt überrittene Methode genommen. Also auch beim destructor :gruebel:

mkinzler 6. Mai 2008 19:09

Re: zugriff auf Unterklassen
 
In diesem Fall hat der Vorfahr aber auch keine eigenen Destruktor


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

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz