Zugriffsverletzung
-
Hallo Zusammen,
ich hab da ein kleines Problem woraus ich leider nicht schlau werde.
Und zwar:Ich ein Programm mit mehreren Formularen. Hab dazu eine Klasse geschrieben und als Headerdatei gespeichert. In der Klasse werden auch auf die Elemente von den Formularen zugegriffen. Und genau da ist das Problem. Immer wenn ich eine Funktion in der Klasse aufrufe, die auf ein Element der Formulare zugreift, bekomm ich EAccesViolation Fehler. Die Header hab ich soweit in die richtigen Fomulare eingebunden. d.h. wo die Klasse drinsteht habe ich beim Hauptformular eingebunden usw.
Weiß einer Rat ???
-
es liegt glaube ich am includen.
du hast die header doch alle includet,oder?
Ich bin mir zwar nicht sicher, aber du musst meines wissens auch in beiden Formen beide header includen.War bei mir auch mal. nachdem ich den code zerpflückt hatte, hab ich gemerkt, dass es am includen lag.
hoffe daran lag´s,
J0
-
Hallo.
Wann rufst du die Funktionen denn auf?
Ich hatte letztens folgendes Problem: Als ich in der FormCreate Methode auf ein
anderes Formular zugegriffen habe, hat der mir immer eine Exception aufn Tisch
geschmissen, weil das Formular auf das ich zugreifen wollte zu diesem Zeitpunkt noch nicht bestand... Vielleicht liegt es ja daran..MFG Aoeke
-
Hallo nochmal,
Also ich hab folgendes Problem, ich habe eine kleine Klasse geschrieben, und in dieser Klasse versuche ich auf Elemente eines Formulars zuzugreifen.
Sobald ich aber die Funktion ausführe bekomme ich EAccessViolation Fehler.
Die Klasse ist wie folgt :Dateiname der Klasse ist klasse.h
//--------------------------------------------------------------------------- // Klasse Datenbank //--------------------------------------------------------------------------- #include "U_repair.h" class Datenbank { public: void DatenbankErstellen(); . .usw. . }; void Datenbank:atenbankErstellen() // Funktion Datenbank erstellen { // Datenbank generieren F_haupt->risQuery->Close(); F_haupt->risQuery->SQL->Clear(); F_haupt->risQuery->SQL->Add("create database if not exists ris"); F_haupt->risQuery->ExecSQL(); // Datenbank nutzen F_haupt->risQuery->Close(); F_haupt->risQuery->SQL->Clear(); F_haupt->risQuery->SQL->Add("use ris"); F_haupt->risQuery->ExecSQL(); // Tabellen erstellen // Auftragsnummer, Primärschlüssel, Autoinkrement(+1) F_haupt->risQuery->Close(); F_haupt->risQuery->SQL->Clear(); F_haupt->risQuery->SQL->Add("create table if not exists daten (auftragsnummer bigint not null auto_increment, \ permanent1 int, \ . . usw. . primary key(auftragsnummer))"); F_haupt->risQuery->ExecSQL(); }; Datenbank PC; //globales Objekt erzeugen //--------------------------------------------------------------------------- // Ende Klasse Datenbank //--------------------------------------------------------------------------- Das Formular auf das ich zugreifen will ist : //--------------------------------------------------------------------------- #include <vcl.h> #include "klasse.h" // Einbindung der Klasse Datenbank #include "U_repair.h" //--------------------------------------------------------------------------- #pragma hdrstop #pragma package(smart_init) #pragma link "mySQLDbTables" #pragma resource "*.dfm" TF_haupt *F_haupt; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TF_haupt::TF_haupt(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TF_haupt::TMI_datenbankErstellenClick(TObject *Sender) { PC.DatenbankErstellen(); } //---------------------------------------------------------------------------
Sobald ich versuche eine Datenbank zu generieren, kommen diese Fehler.
Also ich hab sämtliche Header hin- und hergetauscht, komme aber einfach nicht weiter. Weiß vielleicht einer von euch Rat ?Wäre sehr dankbar......
Edit:
Bitte die Code-Tags benutzen. Danke![ Dieser Beitrag wurde am 05.03.2003 um 09:40 Uhr von Jansen editiert. ]
-
Mit dem Debugger mal durchgesteppt und nachgesehen wo genau der Fehler aufrtitt hast du vermutlich ja schon. Also lass uns doch bitte an deinem Wissen teilhaben?
-junix
-
Danke für eure Hilfsbereitschaft !
void __fastcall TF_haupt::TMI_datenbankErstellenClick(TObject *Sender)
{
GENAU AN DIESER STELLE - PC.DatenbankErstellen();
}
//---------------------------------------------------------------------------Genau da tritt die Zugriffsverletzung auf. Die Klasse ist soweit bekannt.
Denn sobald ich PC. eintippe schlägt der Compiler mit die Funktionen, die in der Klasse drin sind vor...
-
eine Instanz der Klasse exisitert? Bist du schon in die Funktion hineingesteppt?
-junix
-
Was meinst du mit Instanz, vielleicht ein kleines Beispiel dazu !
Danke
-
Eine Instanz der Klasse eben... aber ich seh grad du hast das Teil ja auf dem Stack global erzeugt also erledigt sich die Frage. Was ist mit der zweiten Frage?
-junix
-
Original erstellt von junix:
Eine Instanz der Klasse eben...Wirklich pädagogisch wertvoll, junix. Muss man schon sagen. Was ist ein Bitmap? Na, ein Bitmap eben. Cool. Das wollte ich schon immer mal wissen.
@The.President: Wenn du ein Objekt deiner Klasse erstellst, dann ist das eine Instanz.
Schau junix, so einfach geht das!
-
void Datenbank:atenbankErstellen() // Funktion Datenbank erstellen { // Datenbank generieren F_haupt->risQuery->Close();
Was ist F_haupt? Das ist ja garnicht in der Klasse deklariert.
-
Fhaupt ist das Hauptformular.
Ich hatte bei der Klasse die Unit dazu eingebunden mit :
#include "U_repair.h"Damit sollte ich doch Zugriff auf das Formular und deren Elemente, in der Klasse haben. Soweit klappt das auch, aber sobald ich die Funktion aufrufe, kommt der Zugriffsfehler.
-
@Webfritzi: wenn man mit C++ Arbeitet sollte man zumindest die Terminologie kennen...
@The.President: Ist F_haupt oder wie die Variable hiess zum Zeitpunkt der Schutzverletzung gültig (also != NULL)?
Ausserdem schuldest du mir immernoch eine antwort auf meine Frage von oben.
-junix
-
Wenn ich versuche reinzusteppen, bricht dre Builder genau hier ab:
void __fastcall TF_haupt::TMI_datenbankErstellenClick(TObject *Sender)
{
GENAU AN DIESER STELLE - PC.DatenbankErstellen();
}Das Formular F_haupt ist ja in dem Moment vorhanden. D.H. Das Formular ist da, ich klick auf einen Button im Menü, und dann tritt dieser Fehler auf.
-
Ich habe jetzt einfach mal das aus der Hilfe gefischt:
Im Arbeitsspeicher existiert ein Objekt erst dann, wenn das Objekt mit dem Operator new (der den Konstruktor der Klasse aufruft) instantiiert wird.
Vielleicht hilft das ja weiter...
Oder musst du das hier nicht machen, weil, wie junix schon sagte, du das Teil ja auf dem Stack global erzeugt hast?MFG Aoeke
-
Original erstellt von Aoeke:
Oder musst du das hier nicht machen, weil, wie junix schon sagte, du das Teil ja auf dem Stack global erzeugt hast?Richtig. hier muss man das nicht machen.
-junix
-
nagut dann eben nicht.
man lernt nie aus...MFG Aoeke
-
Gibt es denn eine Möglichkeit, wie ich hier draus(F_haupt->risQuery-> ) eine Funktion machen kann ?
z.B. anstatt F_haupt->risQuery->Close();
Funktion->Close();
Danke im voraus....
-
Nein er braucht es nichtmehr mit new zu erstellen.
Er klatscht es ja global in den Speicher@President
Biste mal Step-by-Step in deine Funktion rein?
Wenn du nur mit "F8" über deinen Funktionsaufruf drübergehst schreit er natürlich an der Stelle des Aufrufs.. aber vielleicht ist der Fehler ja auch innerhalb deiner Klasse.
Mach dir noch nen Haltepunkt bei der Datenbank-Klasse und trace mal durch.
-
*grummel*
*deutet auf das Posting obendran*
Sorry Aoeke, die Site war bei mir nicht refresht *ist mal wieder zu spät gekommen*