Der Index der Liste überschreitet das Maximum(0)



  • Hi, ich hab schnellmal folgendes gebastelt:

    int PHeight,PWidth,HAnzahlA,WAnzahlA,WAnzahl,HAnzahl;
    TPanel *PIcon;
    TImage *IconBild;
    TLabel *PText;
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    ScrollBox1->Visible = false;
    int panelcount=0;
    PHeight=110;
    PWidth=95;
    
    WAnzahl = ScrollBox1->Width/PWidth;
    HAnzahl = ScrollBox1->Height/PHeight;
    
    if (HAnzahlA != HAnzahl || WAnzahlA  != WAnzahl )
    {
    for(int j=0;j<ScrollBox1->ComponentCount;)
    {
    ScrollBox1->Components[j]->Free();
    delete ScrollBox1->Components[j];
    }
    
    for (int h=0;h<HAnzahl;h++)
    {
    for (int w=0;w<WAnzahl;w++)
    {
    PIcon = new TPanel (ScrollBox1);
    PIcon->Parent = ScrollBox1;
    PIcon->Height=PHeight;
    PIcon->Width=PWidth;
    PIcon->Name = "Test"+IntToStr(panelcount);
    PIcon->Top = h*PIcon->Height;
    PIcon->Left = w*PIcon->Width;
    IconBild = new TImage(PIcon);
    IconBild->Picture->Bitmap = Image1->Picture->Bitmap;
    IconBild->Parent = PIcon;
    PText = new TLabel(PIcon);
    PText->Parent = PIcon;
    PText->Caption = "Icon Nr. "+IntToStr(h);
    PText->Left = 40;
    PText->Top = 4;
    ScrollBox1->Update();
    ScrollBox1->Refresh();
    Application->ProcessMessages();
    panelcount++;
    }
    }
    WAnzahlA = ScrollBox1->Width/PWidth;
    HAnzahlA  = ScrollBox1->Height/PHeight;
    }
    ScrollBox1->Visible=true;
    

    Dieser Code berechnet die anzahl zu erzeugenden Panels beim resizen. Das klappt auch ganz gut. Manchmal bekomme ich aber folgenden Fehler: "Der Index der Liste überschreitet das Maximum(0)". Mir ist klar, was der Fehler bedeutet, nur wurndere ich mich, da er mir hier den Fehler anzeigt:

    delete ScrollBox1->Components[j];
    

    Hat jemand ne Ahnung warum das nur manchmal passiert?



  • Schonmal die Suchfunktion mit dieser fehlermeldung (ohne die Klammern und die Zahl) befragt.. hattten wir schon öfters hier...

    Als Tip: Die englische Variante lautet "...out of bounds" ...

    -junix



  • Zitat aus ¨einem anderen Thread:

    Tillmann David schrieb:

    [...]dass prob ist halt nur das beschriebene Maximum Dings da. Trotz der Suchfunktion hab ich kein Ergebnis gefunden, zumindest keins, was mir dabei weiterhilft

    Nein? Wieviele Threads liefert die Suchfunktion mit dem Suchstrung "Der Index der Liste überschreitet das Maximum"? und wieviele davon hast du gelesen? Ich weiss mindestens einer in dem ausführlich erklärt wird, wie der Fehler zu Stande kommt. Mit diesem Wissen versehen sollte es dir möglich sein, deinen Algo zu debuggen... Ausserdem solltest du dir mal angewöhnen Blöcke einzurücken, das sieht ja hässlich aus wie du deinen Source formatiert hast. Da könnte ich auch keine Übersicht halten...

    -junix



  • Ja, danke, ich weiß wie debuggen geht, das hatte ich 3 Jahre in der Berufsschule. 🙂

    was das einrücken angeht muss ich dir zustimmen, da meckert mien Chef manchmal auch, aber das was du hier siehst sollte eigendlich nur ein Beispiel für den Fehler sein.



  • Hallo Tillmann David,

    bei mir gibt es aber einen anderen Fehler, diesen aber dafür öfters als manchmal (immer jede 2 Reihe) "EListError - Zeile zu lang".

    Solche Fehler werden meist (wie der Fehler schon zeigt) von Listen erzeugt !!!

    Also, wo machst Du etwas mit einer Liste, dort wirst Du auch Deine Fehlerquelle finden.

    Mal noch nen Tip fürs debuggen, wenn ich einen Fehler habe, der selten oder unregelmäßig auftritt,
    und dann noch nicht mal im Code angezeigt wird, dann nehme ich mir ein 2.Formular, ein Memo rein und in allen möglichen Schleifen
    eine Statusmeldung eingefügt (Form2->Memo1-Lines->Add("ich bin hier...")), und schon kann ich verfolgen, wann und wo der Fehler auftritt.

    Gruß Mario
    (ich hoffe ich habe nicht zuviel verraten, sonst gibt haue vom Admin 😃 )



  • Tillmann David,

    Tillmann David schrieb:

    for(int j=0;j<ScrollBox1->ComponentCount;)
    {
    ScrollBox1->Components[j]->Free();
    delete ScrollBox1->Components[j];
    }
    Hat jemand ne Ahnung warum das nur manchmal passiert?

    Weil die Anzahl Deiner Komponenten mal gerade und mal ungerade ist.
    Tipp: Beobachte doch mal ScrollBox1->ComponentCount, während des Löschens.



  • Ausserdem steht doch eindeutig in der Hilfe: "Do not call the free Method directly"....

    @dschensky: Das hätte er eigentlich mit der Benutzung des Debuggers selber rausfinden können/müssen... (o;

    -junix



  • @dschensky: Deine Antwort hab ich leider erst jetzt gelesen. 😞

    So habs gelöst, war simpel:

    for(int j=0;j<ScrollBox1->ComponentCount;) 
    { 
    ShowMessage(ScrollBox1->ComponentCount); // Mein Debugmodus. :)
    delete ScrollBox1->Components[j]; 
    }
    

    Ohne Free, da hat er immer 2 komponenten aufeinmal gelöscht. (wegen Free und delete)

    Trozdem danke an euch. 🙂


Anmelden zum Antworten