![]() |
Re: Access Violation und kein Ende in Sicht
es muss so aussehen:
Delphi-Quellcode:
Oben bei der Declaration haben Funktionsaufrufe und Constructoraufrufe nichts zu suchen. Diese musst du unten im Teil wo der Quelltext plaziert wird plazieren.
//declaration
public variable: KlassenTyp; [...] variable := KlassenTyp.ConstructorAufruf(eventuelleParameter); |
Re: Access Violation und kein Ende in Sicht
hab dir mal zwei fehler im constructor und destructor korrigiert:
Delphi-Quellcode:
du solltest nicht vergessen die gerbten methoden für die initalisierung und freigabe aufzurufen, sonst wirst noch experte mit dem debugger ;-) . rekursionen habt ihr ja schon integriert.
UNIT mBruch;
INTERFACE USES Math; TYPE TBruch = CLASS strict private zZaehler: integer; zNenner: integer; protected public CONSTRUCTOR init; PROCEDURE setzeZaehler(pZaehler: integer); PROCEDURE setzeNenner(pNenner: integer); FUNCTION gibZaehler: integer; FUNCTION gibNenner: integer; FUNCTION gibDezimalzahl: extended; FUNCTION ggt(zZaehler, zNenner: integer): integer; PROCEDURE ErweitereUm(pFaktor: integer); PROCEDURE KuerzeUm(pFaktor: integer); PROCEDURE KuerzeVoll; //procedure KehreUm ; DESTRUCTOR gibFrei; published END; IMPLEMENTATION {Bruch} CONSTRUCTOR TBruch.init; BEGIN inherited create; //nicht vergessen zZaehler := 0; zNenner := 1; END; PROCEDURE TBruch.setzeZaehler(pZaehler: integer); BEGIN IF zNenner <> 0 THEN BEGIN zZaehler := pZaehler; END; END; PROCEDURE TBruch.setzeNenner(pNenner: integer); BEGIN IF zZaehler <> 0 THEN BEGIN zNenner := pNenner; END; END; FUNCTION TBruch.gibZaehler; BEGIN Result := zZaehler; END; FUNCTION TBruch.gibNenner; BEGIN Result := zNenner; END; FUNCTION TBruch.GibDezimalzahl; BEGIN Result := zZaehler / zNenner; END; PROCEDURE TBruch.ErweitereUm(pFaktor: integer); BEGIN IF pFaktor <> 0 THEN BEGIN zZaehler := zZaehler * pFaktor; zNenner := zNenner * pFaktor; END; END; PROCEDURE TBruch.KuerzeUm(pFaktor: integer); BEGIN IF (zZaehler mod pFaktor = 0) and (zNenner mod pFaktor = 0) THEN zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; END; FUNCTION TBruch.ggt(zZaehler, zNenner: integer): integer; BEGIN IF zZaehler = zNenner THEN Result := zZaehler ELSE Result := ggt(min(zNenner, zZaehler), abs(zZaehler - zNenner)); END; PROCEDURE TBruch.KuerzeVoll; BEGIN self.KuerzeUm(ggT(zZaehler, zNenner)); END; DESTRUCTOR TBruch.gibFrei; BEGIN free; //nicht vergessen END; END. ausserdem, sollten klassen resp. typen mit "T" beginnen, damit man weiss was man anfasst. |
Re: Access Violation und kein Ende in Sicht
Zitat:
|
Re: Access Violation und kein Ende in Sicht
bitte erstelle für eine neue Frage ein neues Thema damit es hier nicht ein reisen Durcheinander wird wenn sich jemand zur ursprünglichen Frage äußert dann wieder jemand zur nächsten etc. Zudem passt dann der Titel zum Beitrag und man findet das Thema auch besser über die Suche :-)
|
Re: Access Violation und kein Ende in Sicht
Zitat:
|
Re: Access Violation und kein Ende in Sicht
das hat nix mit benennung zu tun, sondern, da du über die deklaration
Delphi-Quellcode:
von einer bestehenden klasse ableitest. das heisst, damit diese ordungsgemäss funktionieren sollte auch immer die geerbte methode ausgeführt werden. i.a.r. mit inherited. da du jedoch andere bezeichnungen verwendetst für den constructor/desctructor geht das über das schlüsselwort nicht mehr...
type xy = class (...)
|
Re: Access Violation und kein Ende in Sicht
Das hier funktioniert zwar ist aber nicht ganz richtig:
Delphi-Quellcode:
besser so:
DESTRUCTOR TBruch.gibFrei;
BEGIN free; //nicht vergessen END;
Delphi-Quellcode:
DESTRUCTOR TBruch.gibFrei;
BEGIN inherited Destroy(); END; |
Re: Access Violation und kein Ende in Sicht
Und verwende besser den Standart-Destruktor Destroy
|
Re: Access Violation und kein Ende in Sicht
Der Destructor "Destroy" ist virtuell.
Objekte werden über den Aufruf von "Free" freigegeben. "Free" ruft intern den Destructor "Destroy" auf. Deshalb sollten Klassen die einen eigenen Destructor benötigen, immer "Destroy" mit override überschreiben. Hab noch einen Fehler gefunden:
Delphi-Quellcode:
richtiger z.B. so:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin self.setzeEingabe; hatBruchrechner.Addition(hatBruch1, hatBruch2); LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler); LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner); end;
Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin setzeEingabe; {der alte hatErgebnisbruch wird freigegeben} hatErgebnisbruch.Free; {eine neue Instanz von Bruch wird erzeugt und hatErgebnisbruch zugewiesen} hatErgebnisbruch := hatBruchrechner.Addition(hatBruch1, hatBruch2); LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler); LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner); end; |
Re: Access Violation und kein Ende in Sicht
Danke, habe es mal geändert, funktioniert einwandfrei.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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