Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Item Löschen: Runtime-Error

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.11.2006, 15:51 Uhr
www.pat



Hi!

Ich will Items aus meiner ListView löschen können.
Wenn ich das LETZTE löschen will kommt folgender Fehler:


Zitat von Fehlermeldung:

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentOutOfRangeException' ist in system.windows.forms.dll aufgetreten.

Zusätzliche Informationen: Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.



Solange ich nicht das unterste löschen will klappt alles wunderbar...
Folgender Code liest die Anzahl der Items,
überprüft dann, ob sie markiert sind, und falls ja, wird es gelöscht.
Wenn ein Item gelöscht wurde startet die Schleife von neuem, weil ich dachte, dass wenn Item[3] gelöscht wird, dass dann Item[6] zu Item[5] wird.


C++:
void Form1::menuItemRemove_Click(System::Object *  sender, System::EventArgs *  e)
{    
    bool Item_Removed = true; // gegen Endlosschleife
    while (Item_Removed)
    {
        Item_Removed = false;
        int count = this->listView1->Items->Count; // Items zählen
        for (int i=0; i<count; i++)
        {
            if (this->listView1->Items->Item[i]->Selected == true)
            {
                this->listView1->Items->Item[i]->Remove();
                this->button1->Focus(); // sonst wird das nächste Item markiert
                Item_Removed = true;
                break; // Nach jedem Löschen neu starten
            }    
            else Item_Removed = false; // wenn nichts gelöscht wurde
        }
    }
}



Das Programm hält an der Stelle "return 0" an:


C++:
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0; // <-----
}



Sieht jemand die Schwachstelle?
Wo verlasse ich den Wertebereich?
Und wie löse ich das am besten?

Dieser Post wurde am 17.11.2006 um 15:54 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.11.2006, 16:44 Uhr
LowFly



hmm ich denke das er hinter das ende der liste gerät

ich glaube das der fehler hier liegt;


Zitat von Verfasser:

int count = this->listView1->Items->Count;



bei listen, arrays usw. ist es doch immer so das wenn man die sich die listen/array größe zurückgeben läst sie immer im eins höher ist da mit 1 begonnen wird zu zählen.

listen & arrays beginnen aber mit dem element 0


Zitat von Verfasser:

int count = this->listView1->Items->Count-1;



sollte dann eigendlich funzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.11.2006, 10:14 Uhr
www.pat



Hi!

Danke für die Antwort!
Doch leider habe ich das schon ausgeglichen.


C++:
for (int i=0; i<count; i++)
        {...




Wenn es 10 Items gibt und i auf 10 steht ist es nicht mehr größer als die Itemanzahl...
Ich habs trotzdem probiert und jetzt kann man das letzte Item nicht mehr löschen.

Ich habe mitlerweile einen anderen code gefunden, einen Einzeiler ^^
Jedoch immernoch das selbe Problem...


C++:
void Form1::menuItemRemove_Click(System::Object *  sender, System::EventArgs *  e)
{    
    this->listView1->Items->Remove(this->listView1->SelectedItems->Item[0]);
}




In einem anderen Post habe ich erfahren, dass es auch an der Initialisierung meines Kontextmenüs liegen kann:


C++:
void Form1::listView1_MouseDown(System::Object *  sender, System::Windows::Forms::MouseEventArgs *  e)
{
    if (e->Button == System::Windows::Forms::MouseButtons::Right)
    {
        int count = this->listView1->Items->Count;
        for (int i=0; i!=count; i++)
        {
            if (this->listView1->Items->Item[i]->Selected)
            {
                this->menuItemCopyID->Enabled = true;
                this->menuItemMark->Enabled = true;
                this->menuItemRemoveMark->Enabled = true;
                this->menuItemRemove->Enabled = true;
                this->menuItemRW->Enabled = true;
                break;
            }
            else
            {
                this->menuItemCopyID->Enabled = false;
                this->menuItemMark->Enabled = false;
                this->menuItemRemoveMark->Enabled = false;
                this->menuItemRemove->Enabled = false;
                this->menuItemRW->Enabled = false;
            }
        }
    this->contextMenu1->Show(this->listView1,Point(e->X,e->Y));
    }                
}



Aber eine kritische Stelle kann ich hier auch nicht sehen...

EDIT: Ich habe die Item-Remove-Funktion auf einen Button gelegt. Da klappt es ohne Fehler. Es müsste also an meinem Kontext-Menü liegen

Dieser Post wurde am 20.11.2006 um 11:00 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.11.2006, 11:55 Uhr
www.pat



Hi!

Es hat geklappt!

Hab die Funktion ContextMenu gefunden (und ich hab noch geflucht, als ich mir den Stress mit der rechten Maustaste gegeben hab...^^)
Da taucht der Fehler nicht mehr auf.

Für alle Neulinge wie mich:

- Klick auf die ListView
- Eigenschaften
- Gaaanz unten bei "Verhalten": ContextMenu.
- Euer Menü auswählen

Wenn ihr noch ein paar initialisierungen machen wollt (z.B. einzelne Funktionen aktivieren / deaktivieren)

Doppelklick auf KontextMenu.
Dann wird folgendes automatisch erstellt:


C++:
void Form1::contextMenu1_Popup(System::Object *  sender, System::EventArgs *  e)
{
//...
}


Dieser Post wurde am 20.11.2006 um 11:56 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: