Announcement

Collapse
No announcement yet.

Execption der Klasse EListError

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Execption der Klasse EListError

    Wenn ich in meinem Programm folgende Funktion aufrufe bekomme ich ab und zu die Meldung : "Im Projekt Auswert.exe ist eine Exception der Klasse EListError aufgetreten. Meldung : 'Der Index der Liste überschreitet das Maximum(3106)'. Prozess wurde angehalten. ..."

    Toll, ich verwende meines Wissens nach keine Liste, also wo soll dieser Fehler her kommen und was kann ich dagegen machen?
    <hr>
    Hier noch schnell der Quelltext :

    <code>
    void __fastcall TForm1::ZeitraumBtnClick(TObject *Sender) <br>
    {<br>
    <i> // Formular erstellen</i> <br>
    Application->CreateForm(__classid(TForm5), &Form5);<br>
    <br>
    <i> // Formular zurücksetzen</i><br>
    Form5->Date1->Date = StrToDate(DateToStr(StartZeit));<br>
    Form5->Date2->Date = StrToDate(DateToStr(StopZeit));<br>
    Form5->Time1->Time = StrToTime(TimeToStr(StartZeit));<br>
    Form5->Time2->Time = StrToTime(TimeToStr(StopZeit));<br>
    <br>
    <i> // Wenn Rückgabewert des Formulars = mrOk (Weiter-Button gedrückt), dann...</i> <br>
    if (Form5->ShowModal()==mrOk)<br>
    {<br>
    <i>// Startzeit neu definieren</i> <br>
    StartZeit = StrToDate(DateToStr(Form5->Date1->Date)) + StrToTime(TimeToStr(Form5->Time1->Time));<br>
    <br>
    <i>// Endzeit neu definieren</i> <br>
    StopZeit = StrToDate(DateToStr(Form5->Date2->Date)) + StrToTime(TimeToStr(Form5->Time2->Time));<br>
    <br>
    <i>// SQL-Abfrage formulieren</i><br>
    AnsiString s = "SELECT Anlagedatum, Stationsnummer, ";<br>
    int i = 0;<br>
    int j = RadioGroup1->ItemIndex*8; <i>// erster Kanal = Index * 8</i><br>
    for (i = j; i<(j+7); i++)<br>
    {<br>
    s = s + "B"+IntToStr(i)+"+"+IntToStr(1+ 2*(i-j))+", ";<br>
    }<br>
    i = j+7;<br>
    s = s + "B"+IntToStr(i)+"+"+IntToStr(1+2*(i-j)) + " FROM MDE_SIGNALE";<br>
    s = s + " WHERE Stationsnummer = "+ StationComboBox->Text;<br>
    s = s + " AND Anlagedatum < '" + DateTimeToStr(StopZeit);<br>
    s = s + "' AND Anlagedatum > '" +DateTimeToStr(StartZeit) + "';";<br>
    <br>
    <i>// SQL-Abfrage vorbereiten und ausführen</i><br>
    DataModule4->IBQuery1->Close();<br>
    DataModule4->IBQuery1->SQL->Clear();<br>
    DataModule4->IBQuery1->SQL->Add(s);<br>
    DataModule4->IBQuery1->Open();<br>
    <br>
    <i>// Automatische Achsenskalierung für untere Achse ausschalten</i><br>
    DBChart1->BottomAxis->Automatic = false;<br>
    <br>
    <i>// Minimum festlegen</i><br>
    MinSave = DBChart1->MinXValue(DBChart1->BottomAxis);<br>
    <br>
    <i>// Maximum festlegen</i><br>
    MaxSave = MinSave + EncodeTime(ScrollStunde, ScrollMinute, ScrollSekunde, ScrollMilliSek);<br>
    <br>
    <i>// Wenn Minimum > als aktuelles Maximum der unteren Achse, dann ...</i><br>
    if (DBChart1->MaxXValue(DBChart1->BottomAxis) < MinSave)<br>
    {<br>
    <i>// neues Maximum der unteren Achse festlegen</i><br>
    DBChart1->BottomAxis->Maximum = MaxSave;<br>
    <br>
    <i>// neues Minimum der unteren Achse festlegen</i><br>
    DBChart1->BottomAxis->Minimum = MinSave;<br>
    }<br>
    <br>
    <i>// Wenn Minimum < als aktuelles Maximum der unteren Achse, dann ...</i><br>
    if (DBChart1->MaxXValue(DBChart1->BottomAxis) > MinSave)<br>
    {<br>
    <i>// neues Minimum der unteren Achse festlegen</i><br>
    DBChart1->BottomAxis->Minimum = MinSave;<br>
    <br>
    <i>// neues Maximum der unteren Achse festlegen</i><br>
    DBChart1->BottomAxis->Maximum = MaxSave;<br>
    }<br>
    }<br>
    <i>// Formular aus dem Speicher löschen</i><br>
    Form5->Free();<br>
    }<br>
    </code>

  • #2
    Hi Martin,

    kannst Du die Zeile wo die Wxception geworfen wird nicht herausfinden?<br>
    Wenn es nur sporadisch auftritt ist es natürlich schwer mit Breakpoints zu arbeiten, aber Du könntest z.B. einen Zähler deklarieren, den Du nach verschiedenen Punkten incrementierst, dann schliesst Du Deine Funktion mit try{} catch{} ein und versuchst somit die Exception selbst zu fangen. Wenn das funzt kannst Du als Meldung den Zählerstand ausgeben und Du weisst welche Zeile die Exeption auslöst. Hier kannst Du dann ansetzen den Fehler zu finden.<br>
    Nebenbei, normalerweise hält im Debug-Mode der Compiler doch bei einer Exception an, wo steht er denn dann?

    Gruß Thorste

    Comment


    • #3
      Nirgens! Der Debugger gibt keine Position im Quelltext an, wie es sonst immer passiert. Ich habe die Funktion Schritt für Schritt ausgeführt und nichts ist passiert (also kein Fehler)! Ich habe daraufhin das Projekt neu erstellen lassen, weil der Compiler ja auch manchmal irgendwelche Macken hat, doch das war es dann auch nicht. Die Fehlermeldung erscheint erst zum Ende der Funktion hin. Wenn die Fehlermeldung erscheint, ist die Abfrage schon ausgeführt und DBChart1 schon fertig formatiert. Von daher weiß ich nicht, woran das liegen kann. evtl an Form5->Free(); ?! Kann ich mir aber nicht vorstellen

      Comment


      • #4
        Sind denn im Form5 irgendwelche Listen?<br> Und wieso erzeugst Du das mit CreateForm?<br> Ich erzeuge ein Form zu Laufzeit immer mit new und zerstöre es am Ende wieder mit delete. <br>Zu Free() auch nochmal ein Auszug aus der Hilfe :
        <pre>
        Die Methode Free löst die Instanz eines Objekts auf und gibt nötigenfalls den zugehörigen Speicher frei.

        __fastcall Free();

        Beschreibung

        <b>Rufen Sie die Methode Free eines Objekts nicht auf, sondern verwenden Sie statt dessen das Schlüsselwort delete</b>, das Free zur Freigabe eiens Objekts aufruft. Wenn die Objektreferenz nicht NULL ist, wird Destroy aufgerufen.
        </pre>

        Aber ich denke nicht das das Dein Problem ist.<br>
        Du könntest auch mal einezelne Teile der Funktion ausschliessen um denn Fehler vielleicht genauer einzukreisen, oder Du nimmst Dir Form5 nochmal genauer unter die Lupe, z.B. den Destruktor

        Comment


        • #5
          Gut ich werd mal die Sache mit dem Destruktor probieren. Auf dem Formular Form5 sind 4 DateTimePicker. Ich weiß nicht, sind die Dinger Listen-Objekte?

          Comment


          • #6
            OK, an dem Destuktor lag es nicht. Ich hab die Sache jetzt auf
            <code>
            <b> delete </b> Form5;<br>
            </code>
            geändert

            Comment


            • #7
              Was für eine Komponente ist denn DBChart?<br>
              Kann es sein, das DBChart noch Daten enthält, und DBChart nach dem Ändern der Grenzen versucht seine Daten neu darzustellen und dann den Overflow bekommt? <br>Das kannst Du mit der Anzahl der Deiner Daten vergleichen, die müsste sich bei Deinem Beispiel dann bei > 3106 liegen

              Comment


              • #8
                OK, hab die Fehlermeldung überlistet. Is an sich ne ganz komische Sache. Ich hab erst geschaut, ob ich bis an das Ende der Funktion komme. Dafür habe ich vor dem Befehl <code><b>delete</b> Form5;</code> den Befehl <code>ShowMessage("Fertig!");</code> eingefügt. Das komische daran ist, dass daraufhin die Fehlermeldung ausgeblieben ist. Nagut, ich hab den aufruf von ShowMessage jetzt rausgenommen und hab dafür ein <code>DBChart1->Refresh();</code> eingefügt. Funktioniert auch!
                Muss man sowas verstehen?! Ich glaube nicht. Obwohl, eine Erklärung wäre schon möglich! "ES LEBT!"

                Danke für die Hilfe!

                Ciao! Marti

                Comment

                Working...
                X