Laufzeitfehler bei Form->Show() / ShowModal()

Supa

Erfahrenes Mitglied
Hy,

ich hab folgendes Problem, mit dem ich mich nun schon mehrere Stunden erfolglos rumschlage. Vielleicht wisst ihr ja ne Lösung:

Ich hab ein Formular, Name "KundenDetails". In der Unit zu diesem Formular hab ich eine Funktion implementiert, die ein paar Einstellungen vornimmt und letztendlich mit Show() bzw. ShowModal() sich selbst anzeigen soll.

Sobald eine der Show() Funktionen aufgerufen wird (festgestellt mit Haltepunkt und Einzelschritten), kommt folgender Fehler:
"Im Projekt Projekt1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:'Zugriffsferletzung bei Speicheradresse 00555B97 im Modul 'Projekt1.exe'. Lesen von Adresse 00000038'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Strat fortsetzen."

Dann kann ich quasi noch zwei mal F9 zum fortsetzen drücken und dann hängt er sich komplett mit ner ähnlichen Meldung, nur anderen Adressen (00550094 und FFFFFFEC) aus.

Woran liegt das und wie krieg ich das weg?

Alle anderen Formulare (die z.T. ähnlich aufgebaut sind) Funktionieren einwandfrei!
 
Bin leider gerade nicht mehr auf'er Arbeit, aber ich poste sofort morgen früh etwas von dem Code.

Soviel sei schonmal gesagt, die selbstgeschriebene Funktion wird einfach von einem anderen Formular aus, per ButtenClick aufgerufen und übergibt einen Integer Wert etwa so:

Code:
KundeDetails->zeigeAlsBearbeiten(1234);
(Die Zahl is quasi die Nummer des Kunden in einer DB.)

die Fkt. selbst sieht etwa wie folgt aus:

Code:
void TKundeDetails::zeigeAlsBearbeiten(int i)
{
//hier werden Kundendaten aus der DB gelesen und ein paar Voreinstellungen
//für das Formular gemacht (z.b. EditXY->ReadOnly = true; usw...)

//dann kommt der aufruf:
ShowModal(); //hier wird die besagte Exception erzeugt...
}

Aber wie gesagt, morgen früh poste ich mal die ganze besagte Funktion und den Aufruf dazu.
 
soooo, hier der Aufruf meiner funktion:
Code:
void __fastcall TForm2::BitBtn2Click(TObject *Sender)
{
   if(IBQuery1->RecordCount >0)
   {
      select(0,0,KundeDetails->zeigeAlsBearbeiten(IBQuery1->FieldByName("KUNDE_NR")->AsInteger));
   }
}
und hier die Funktion selbst:
Code:
int TKundeDetails::zeigeAlsBearbeiten(int kunde_nr)
{
   status = "bearbeiten"; //globale Variable, damit ich weiß, wie das Formular aufgerufen wurde...

   //Kunde Laden
   holeKundenDetails(kunde_nr); //hier werden zwei objekte einer Klasse "Kunde" erzeugt und mit Daten aus der DB gefüllt

   //Kunde anzeigen
   kundeAnzeigen(k_auswahl); //hier werden die geladenen Daten ein div. Edits und CheckBoxen eingefügt
                                  //k_auswahl is dabei ein Zeiger auf ein Objekt der Klasse Kunde(global deklariert)

   //Voreinstellungen
   Label1->Caption = "Kunde bearbeiten / ansehn";
   Label1->Font->Color = clBlack;
   Label16->Caption = "Änderungen übernehmen?";
   Label16->Font->Color = clBlue;
   BitBtn1->Caption = "Übernehmen";

   benutzerEinstellungen(); //readOnlys gesetzt usw.

   ShowModal(); // <---- hier is mein Problem!

   return k_bearbeitung->getKundeNr();
}

Was mich halt am meinsten fertig macht, ist die Tatsache, das ein anderes Formular, welches fast genau so aufgebaut ist, eben einwandfrei funktioniert.

Ich hab jetzt gedacht, das die Borland Software vielleicht nen Fehler beim umbennenen des Formulars oder generieren von Standart Quellcode gemacht hat und hab n neues Formular angelegt und meine Funktionen darauf kopiert... natürlich is der Fehler immernoch da :(
 
Hallo,

ich denke das es daran liegt wenn du ShowModal() in deiner Funktion aufrufst der BitBnt2Click nicht ganz ausgeführt wird da das return deiner Funktion erst kommt wenn das Fenster wieder geschlossen wird. Probier mal das ShowModal in dem BitBtn2Click aufzurufen ob dann der Fehler immer noch kommt.
 
Hy...

danke für die Mühen, aber ich bin gerade selbst auf den Fehler gestoßen...

Klassischer C++-Speicher-Zeiger- Fehler.

Hab in einer Funktion ein bool Array von 40 Elementen in einer Schleife mit Werten überschrieben, obwohl ich es damals auf eine Größe von 20 Elementen geändert hatte... *peinlich*

btw. wie kann ich die Anzahl Elemente eines Arrays auslesen, wenn ich es wie folgt deklariert hab:
Code:
int test[20];

Ich hab gerade was von sizeof() gelesen...
Code:
int anzahlelemente = sizeof(test)/sizeof(test);
Kann das sein?
 
Zurück