AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

constructor access violation

Ein Thema von TheAn00bis · begonnen am 13. Nov 2005 · letzter Beitrag vom 13. Nov 2005
Antwort Antwort
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#1

constructor access violation

  Alt 13. Nov 2005, 12:16
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:
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;
Wie in den Kommentaren geschildert, wird bis vorher alles ausgeführt, aber beim Erstellen kommt eine Access Violation.


Folgende Methode funktioniert allerdings einwand frei:

Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var karte1:Tkarte;
begin
karte1.init('asdf','asddf');
end;
Daraus habe ich zunächst geschloßen, dass es an der Methode laden liegt, aber ich könnte mir nicht vorstellen woran es liegt.

Wäre für Hilfe echt dankbar...

/edit: titel geändert
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:17
Hi,

versuch mal:

Karte := TKarte.Init(<Params>);
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#3

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:24
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:
karte1 := TKarte.init('asdf','asddf'); sein. Aber wies schon gesagt. Konstruktoren in Delphi sollte imm der Namen Create haben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:29
Zitat von TheAn00bis:
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?
Es muss immer eine Zuweisung sein. Objektvariablen sind ja nur Zeiger. Delphi erstellt nun beim Konstruktoraufruf ein neues Objekt irgendwo im Speicher und gibt einen Pointer auf dieses zurück, das du dann in einer Variable speicherst, um auf es zugreifen zu können.
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:
Aber wies schon gesagt. Konstruktoren in Delphi sollte imm der Namen Create haben.
Genau. Dieses "Feature" ist IMO ziemlich sinnlos. [/add]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:33
Zitat von Khabarakh:
Zitat:
Aber wies schon gesagt. Konstruktoren in Delphi sollte imm der Namen Create haben.
Genau. Dieses "Feature" ist IMO ziemlich sinnlos.
Es ist ja keine Verpflichtung sondern "nur" ein Namenskonvention.
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#7

Re: constructor access violation

  Alt 13. Nov 2005, 12:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: constructor accesviolation

  Alt 13. Nov 2005, 12:45
Zitat von Bernhard Geyer:
Zitat von Khabarakh:
Zitat:
Aber wies schon gesagt. Konstruktoren in Delphi sollte imm der Namen Create haben.
Genau. Dieses "Feature" ist IMO ziemlich sinnlos.
Es ist ja keine Verpflichtung sondern "nur" ein Namenskonvention.
Aber da sich jeder an die Namenskonvention halten sollte, finde ich die Möglichkeit, den Konstruktor umzubenennen, eben ziemlich sinnlos. Delphi ist auch die einzige mir bekannte Sprache, die das ermöglicht.
Zitat:
Manchmal ist es nämlich ganz sinnvoll mehrere Constructoren zu haben.
Du kannst ja mehrere überladene Create-Konstruktoren erstellen. Dann sieht der Programmierer auch sofort, dass es mehrere Möglichkeiten gibt.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: constructor accesviolation

  Alt 13. Nov 2005, 13:10
Zitat von Bernhard Geyer:
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.
Nein, das bekommt er hin und ruft Create auf.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: constructor accesviolation

  Alt 13. Nov 2005, 14:25
Zitat von Khabarakh:
Zitat von Bernhard Geyer:
Es ist ja keine Verpflichtung sondern "nur" ein Namenskonvention.
Aber da sich jeder an die Namenskonvention halten sollte, finde ich die Möglichkeit, den Konstruktor umzubenennen, eben ziemlich sinnlos. Delphi ist auch die einzige mir bekannte Sprache, die das ermöglicht.
Ach so. Ich hatte deinen Einwand anders verstanden

Zitat von Muetze1:
Zitat von Bernhard Geyer:
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.
Nein, das bekommt er hin und ruft Create auf.
OK. Habe ich nicht ausprobiert.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
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