![]() |
constructor access violation
Ich komme einfach nicht weiter.
Ich habe eine Klasse TKarte, die so aussieht: unit UKarte;
Delphi-Quellcode:
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls; type TTest = CLASS public constructor init(pFrage, pAntwort: string); //und weitere... end; implementation var Frage, Antwort:String; constructor TKarte.init(pFrage, pAntwort: string); begin inherited; //self.schreibeAntwort(pAntwort); //self.schreibeFrage(pFrage) end; //... end. Ich erstelle sie so:
Delphi-Quellcode:
Wie in den Kommentaren geschildert, wird bis vorher alles ausgeführt, aber beim Erstellen kommt eine Access Violation.
procedure TKarteikasten.Laden (name: String);
var i,j: integer; karte1: TKarte; fach: TFach; aktDatensatz: KartenTyp; begin showMessage('laden'); Liste:=TList.create; AssignFile(datei, name); if FileExists(name) then begin showMessage('existiert, öffnen'); ReSet(datei) end else begin ReWrite(datei); showMessage('existiert nicht, neu erstellen') end; for i:=0 to filesize(datei)-1 do begin seek(datei,i); read(datei,aktDatensatz); showmessage(aktdatensatz.antwort); showmessage(aktdatensatz.frage); showmessage(inttostr(aktdatensatz.fach)); //wird noch ausgegeben karte1.init(aktDatensatz.frage,aktDatensatz.antwort); //HIER!!!! //mit karte1.init('test','test'); das gleiche, liegt also nicht an den Parametern showmessage('so far...'); //wird nicht mehr ausgegeben, Access Violation if aktDatensatz.fach>Liste.count-1 then begin for j:=liste.count-1 to aktdatensatz.fach do begin Fach:=TFach.create; Liste.add(Fach); end; end; TFach(Liste[aktDatensatz.fach]).fuegeKartehinzu(karte1); end; end; Folgende Methode funktioniert allerdings einwand frei:
Delphi-Quellcode:
Daraus habe ich zunächst geschloßen, dass es an der Methode laden liegt, aber ich könnte mir nicht vorstellen woran es liegt.
procedure TForm1.Button6Click(Sender: TObject);
var karte1:Tkarte; begin karte1.init('asdf','asddf'); end; Wäre für Hilfe echt dankbar... /edit: titel geändert |
Re: constructor accesviolation
Hi,
versuch mal:
Delphi-Quellcode:
Karte := TKarte.Init(<Params>);
|
Re: constructor accesviolation
Wow, jetzt gehts...
Danke. Das habe ich gar nicht versucht, weil es in der anderen MEthode ja auch anders geht. Warum muss das denn da mit := sein und bei der anderen gehts so? |
Re: constructor accesviolation
1, Konstruktoren sollten in Delphi immer den Namen Create besitzen.
2, In deinem Konstruktor rufst Du mit inherited eine nicht vorhandene Init-Funktion in der Basis-Klasse auf. In der Basis-Klasse heißt der Konstruktor aber Create. 3, Konstruktoren sind Klassen-Funktionen. Der Aufruf in Button6Click bewirkt das eine neue Tkarte angelegt wird und als Rückgabeparameter der Methode zurückkommt. Der Aufruf müsste:
Delphi-Quellcode:
sein. Aber wies schon gesagt. Konstruktoren in Delphi sollte imm der Namen Create haben.
karte1 := TKarte.init('asdf','asddf');
|
Re: constructor accesviolation
Zitat:
Ohne Zuweisung hat die Variable irgendeinen zufälligen Wert. Wenn dieser beim Konstruktoraufruf nicht im Speicher, der von deinem Programm verwaltet wird, liegt, knallt es. [add] Zitat:
|
Re: constructor accesviolation
Zitat:
Jeder Delphi-Entwickler wird eine Konstruktor zuerst unter dem Namen Create suchen. Für mich (und sicherlich vielen anderen) Delphi-Enwicklern schaut eine Init-Methode nach einer jederzeit aufrufbaren Methode auf (Wie z.B. die Clear-Methode bei TStrings) um den "Urzustand" der Klasse wieder herzustellen. |
Re: constructor access violation
Danke Leute, leuchtet ein.
Aber wenn ich "inherited create" aufrufe, dann nimmt er doch das "Create" des Vorfahren, oder? Dann könnte ich den Constructor doch auch anders nennen? Manchmal ist es nämlich ganz sinnvoll mehrere Constructoren zu haben. Zu dem kam auch bei der Methode "init" kein Fehler, als ich "inherited" aufgerufen habe. //edit: Wurde praktisch schon beantwortet. |
Re: constructor accesviolation
Zitat:
Zitat:
|
Re: constructor accesviolation
Zitat:
|
Re: constructor accesviolation
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz