EAccessViolat. bei Funktion-Verlassen [gelöst]
-
Die Methode MenuCfgRTClick sieht so aus:
void __fastcall TFormMain::MenuCfgRTClick(TObject *Sender) { TFormRTCfg *FrmRTCfg= new TFormRTCfg(Application); FrmRTCfg->ShowModal(); delete(FrmRTCfg); }
Edit: Selbst wenn ich das Formular beim Programmstart erzeugen lassen und dann nur mit ShowModal() anzeige wenn man auf den Button klickt, bekomme ich eine Zugriffsverletzung...
Ich gebs auf! Ich mach das Formular am Montag nochmal neu für das neue Projekt... Ist zwar n Haufen Fummelei, aber wenn ich ewig nach nem mysteriösem Fehler suche, komm ich auch nicht weiter.
Ich denk mir meinen Teil dazu - zB zum Thema "Wiederverwendbarkeit von Objekten"...
-
Den einzigen Fehler, den ich hier sehe, ist, dass Du das Formular wieder löschst, obwohl Du die Application als Eigentüber angibst. Also entweder löschen weglassen, oder (mE besser) keinen Eigentümer angeben.
Sollte aber mit dem Problem selbst nichts zu tun haben...
Hast Du einfach mal die ListBox vom Furmular gelöscht und neu eingefügt?
-
ersetze doch mal das hier
delete(FrmRTCfg);
durch das hier
delete FrmRTCfg;
Dann schau mal rein ob im Konstruktor von TFormRTCfg noch ein Ei sein könnte.
-
Joe_M. schrieb:
Den einzigen Fehler, den ich hier sehe, ist, dass Du das Formular wieder löschst, obwohl Du die Application als Eigentüber angibst. Also entweder löschen weglassen, oder (mE besser) keinen Eigentümer angeben.
Verstehe ich nicht... Ich muss doch einen Eigentümer angeben!?! Folgende Varianten erzeugen erwartungsgemäß eine Fehlermeldung:
TFormRTCfg *FrmRTCfg= new TFormRTCfg(); // Variante 1 ohne Owner TFormRTCfg *FrmRTCfg= new TFormRTCfg; // Variante 2 ohne Owner
Und zwar erzeugen beide Varianten diese Fehlermeldung:
[C++Fehler] Main.cpp(92): Could not find a match for 'TFormRTCfg::TFormRTCfg()'.
Also bitte Joe_M, schreib mir noch, wie ich das Formular ohne Owner instanziiere und warum es falsch ist mit Application als Owner.
Joe_M. schrieb:
Sollte aber mit dem Problem selbst nichts zu tun haben...
Hast Du einfach mal die ListBox vom Furmular gelöscht und neu eingefügt?
Das habe ich jetzt mal gemacht - keine Veränderung! Ich habe der ListBox sogar einen neuen Namen verpasst.
Braunstein schrieb:
ersetze doch mal das hier
delete(FrmRTCfg);
durch das hier
delete FrmRTCfg;
Was soll die Ersetzung bewirken?
Braunstein schrieb:
Dann schau mal rein ob im Konstruktor von TFormRTCfg noch ein Ei sein könnte.
Den Konstruktor haben wir hier doch schon durchgekaut...
__fastcall TFormRTCfg::TFormRTCfg(TComponent* Owner) : TForm(Owner) { GrpIdx= 0, UseLstLen= 0, ComboBoxGroups->ItemIndex= 0; MidValSelCnt= 0; AnsiString TmpStr; for(int Idx=0; Idx<18; Idx++) { TmpStr= PutEntry(0, Idx); LstBxGet->Items->Add(TmpStr); // Hier entsteht die Zugriffsverletzung } }
-
Kolumbus schrieb:
Joe_M. schrieb:
Den einzigen Fehler, den ich hier sehe, ist, dass Du das Formular wieder löschst, obwohl Du die Application als Eigentüber angibst. Also entweder löschen weglassen, oder (mE besser) keinen Eigentümer angeben.
Verstehe ich nicht... Ich muss doch einen Eigentümer angeben!?! Folgende Varianten erzeugen erwartungsgemäß eine Fehlermeldung:
TFormRTCfg *FrmRTCfg= new TFormRTCfg(0); // korrekte Variante ohne Owner
Braunstein schrieb:
ersetze doch mal das hier
delete(FrmRTCfg);
durch das hier
delete FrmRTCfg;
Was soll die Ersetzung bewirken?
Das die überflüssigen Klammern verschwinden. delete ist ein Operator, keine Funktion.
Aber beide Sachen sind nur Schönheitskorrekturen und haben mit der eigentlichen Access Violation nichts zu tun.
bis bald
akari
-
Das Erzeugen der Form sollte so aussehen.
TFormRTCfg *FrmRTCfg= new TFormRTCfg(0); // 0 bedeutet, kein Owner
Kolumbus schrieb:
Verstehe ich nicht... Ich muss doch einen Eigentümer angeben!?
Nein, musst du nicht. Der Eigentümer ist für das Löschen der Form zuständig. Das übernimmst du aber selbst. Also brauchst du keinen.
-
Mehr Aufgaben hat der Eigentümer in diesem Fall nicht? Nicht, dass andere Funktionalitäten auch nicht mehr gegeben sind wenn ich keinen Eigentümer angebe?
Zum eigentlichen Problem: Ich habe ein neues Formular erstellt und vom alten Formular nur die Komponenten kopiert -> Zugriffsverletzung ist noch da!
Da hat doch der Teufel seine Finger im Spiel!
-
Kannst Du dieses Testprojekt irgendwo hochladen?
-
Also irgendwie wird scheinbar eine Adresse nicht richtig angegeben. Wenn ich mit Breakpoint auf
ListBox1->Items->Add(TmpStr)
im Konstruktor stehe und F7 drücke, sieht es direkt danach im Builder so aus -> Link.
@Joe_M: Ich könnte es als e-mail senden! ok?
-
[EDIT] Mailadresse entfernt...
-
Ok, ist raus...
-
Ist angekommen. BCB 3... Ich hoffe, da kann ich was mit anfangen, da hat sich doch etliches geändert, seit dem 3er.
-
Ja, ist schon komisch läuft bei mir (nachdem es automatisch auf Version 6 aktualisiert wurde) problemlos.
Zwei Dinge musste ich ändern.
Die Datei EingabeSerNr ist nicht dabei gewesen, also habe ich alle Referenzen darauf auskommentiert. Aber da der Fehler nicht in dieser Datei passiert, kann man das wohl getrost ignorieren.
Die Zeile:GrpIdx= 0, UseLstLen= 0, ComboBoxGroups->ItemIndex= 0;
Musste ich ändern in:
GrpIdx= 0; UseLstLen= 0; ComboBoxGroups->ItemIndex= 0;
Ansonsten lässt sich das Projekt nicht compilieren, mit der Fehlermeldung:
Erzeugen[C++ Fehler] EACfg.cpp(51): E2492 Zuweisung von Eigenschaften nur mit einfachen Anweisungen wie \\\042prop = value;\\\042
Teste diese Änderung bitte mal bei Dir.
-
Danke dass du mal drüber geschaut hast!
Joe_M. schrieb:
Die Datei EingabeSerNr ist nicht dabei gewesen, also habe ich alle Referenzen darauf auskommentiert. Aber da der Fehler nicht in dieser Datei passiert, kann man das wohl getrost ignorieren.
Oh, da hab ich wohl was übersehen... einfach in Main.cpp das #include "EingabeSerNr.h" ändern in #include "EingabeNr.h".
Joe_M. schrieb:
Die Zeile:
GrpIdx= 0, UseLstLen= 0, ComboBoxGroups->ItemIndex= 0;
Musste ich ändern in:
GrpIdx= 0; UseLstLen= 0; ComboBoxGroups->ItemIndex= 0;
Ansonsten lässt sich das Projekt nicht compilieren, mit der Fehlermeldung:
Erzeugen[C++ Fehler] EACfg.cpp(51): E2492 Zuweisung von Eigenschaften nur mit einfachen Anweisungen wie \\\042prop = value;\\\042
Teste diese Änderung bitte mal bei Dir.
Ich habe die Änderung gemacht und bekomme immernoch eine Zugriffsverletzung.
Nun, es bleibt mir wohl nichts Anderes übrig, als das Formular wirklich nochmal Komponente für Komponente, Ereignis-Methode für Ereignis-Methode neu zu erstellen. Immerhin kann ich den Inhalt der Methoden kopieren + einfügen, sofern ich die Komponenten-Namen ordentlich übernehme...
PS: Wo du das Testprojekt schonmal da hast: Ist das Projekt sonst vom Aufbau und Quelltext vertretbar?
-
Ich weiß nicht, ob ein Neuaufbau des Formulars hilft. So weit ich das gelesen habe, hat sich mit der Einführung des BCB 4 einiges geändert, unter anderem auch der Zeitpunkt zu dem ein Konstruktor aufgerufen wird. Ich hatte aber niemals den BCB 3...
Kolumbus schrieb:
Wo du das Testprojekt schonmal da hast: Ist das Projekt sonst vom Aufbau und Quelltext vertretbar?
Kann ich nichts zu sagen, so genau hab ich mir den Code nicht angesehen.
Positiv ist mir aufgefallen, dass Du recht ausführlich kommentierst.
Negativ sind mir ein paar Dinge bei der Codeformatierung aufgefallen. zB schreibst Du einige Schleifen und if-Anweisungen komplett in eine Zeile. Respektive schreibst Du mehrere Anweisungen in eine Zeile.Beispiel:
if(UseLstLen>0) { BtnDel->Enabled= true; BtnClr->Enabled= true; }
sähe bei mir so aus:
if(UseLstLen > 0) { BtnDel->Enabled= true; BtnClr->Enabled= true; }
Finde ich persönlich einfacher zu lesen. Ist aber wohl Gewohnheits- / Geschackssache.
-
Joe_M. schrieb:
Ich weiß nicht, ob ein Neuaufbau des Formulars hilft. So weit ich das gelesen habe, hat sich mit der Einführung des BCB 4 einiges geändert, unter anderem auch der Zeitpunkt zu dem ein Konstruktor aufgerufen wird. Ich hatte aber niemals den BCB 3...
Ich hoffe doch, dass der Neubau was bringt - den bekomme ich heute fertig. Es steht ja immernoch der Fakt, dass das Formular unter identischen Bedingungen in einem anderen Projekt funktioniert. Dort habe ich das Formular ursprünglich erstellt. Dann habe ich das Formular nur noch kopiert und in ein neues Projekt eingefügt. Im Orginal-Projekt funktioniert das Formular, im neuen Projekt nicht... Daher hoffe ich jetzt, dass beim Kopieren ein Fehler entstanden ist, der nach dem Neubau nicht vorhanden ist!
Ich poste nachher, ob der Neubau funktioniert.
-
Ich habe nun den Neubau des Formulars abgeschlossen -> ZugriffsFehler ist nach wie vor vorhanden!
Ich würde jetzt gern den Smilie einfügen, der sich den Kopf an einer Mauer blutig schlägt... wo ist der?
Ich bin echt am Ende... kA wie ich jetzt weitermachen soll... Folgende Kleinigkeiten hab ich noch versucht:
Die Schleife zum Füllen der Liste aus dem Konstruktor in eine Button-Klick-Methode verschoben und den Funktionsaufruf in der Schleife durch die Anweisungen der Funktion ersetzt (dh. kein Funktionsaufruf mehr):
void __fastcall TFormNewEACfg::Button1Click(TObject *Sender) { for(int Idx=0; Idx<18; Idx++) { Eintrag= Wert[0][Idx]; Eintrag.Delete(Eintrag.LastDelimiter("~"),2); this->LstBxGet->Items->Add(Eintrag); // ZugriffsFehler !!! } }
Nach wie Vor erhalte ich den Zugriffsfehler!
Ich weiß nicht weiter...
Edit: Hat nicht jemand noch einen BCB3 installiert, um den Fehler eventuell nachzuvollziehen?
-
Lösung siehe hier