EAccessViolat. bei Funktion-Verlassen [gelöst]



  • Ich hatte jetzt noch die Idee, dass ich im Konstruktor noch nicht zuverlässig auf ListBox1 zugreifen kann, weil ich nicht weiß ob die Komponente schon erstellt wurde!?! Also hab ich die Schleife aus dem Konstruktor mal ins OnShow geschoben, aber die Zugriffsverletzung tritt trotzdem auf... 😞



  • Hallo

    Im Konstruktor von abgeleiteten Form-Klassen sind alle mit dem OI erstellte Komponenten vorhanden, die werden vom TForm-Konstruktor erstellt.

    OnShow ist übrigens keine Alternative zum Konstruktor, das wird erst aufgerufen wenn das Form überhaupt angezeigt wird, dann aber bei jedem Aufruf von Show().

    bis bald
    akari



  • Ok, dann bin ich immernoch nicht weiter. Habt ihr meinen letzten Post auf Seite 1 auch gelesen? Ich hatte 2x geantwortet...



  • Hier der CallStack, direkt nachdem der Zugriffsfehler auftrat und das Programm vom BCB angehalten wurde: Link



  • Wie man da sehen kann, wird der Fehler von MenuCfgRTClick verursacht. Also schau da mal rein.



  • 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.


Anmelden zum Antworten