Komische Fehlerausgabe <Ein ungültiges Argument wurde Festgestellt>



  • Hallo !

    Also ich habe eine Anwendung in der eine ListBox ist, in der Datensätze angezeigt werden aus einer CObject Liste (struct PERSON_DATA) dazu gehören 2 klassen CPerson und CPersonDB die, die Datensätze handeln. Wenn ich nun einen Selektierten Eintrag in der ListBox löschen will habe ich folgenden code zusammengebastelt

    void CSmsDlg::OnBnClickedDelsel()
    {
    	CPerson* pPerson;
    	POSITION pos = m_addrList.GetFirstSelectedItemPosition();
    	int zahl;
    	while (pos)
    	{
    		zahl = m_addrList.GetNextSelectedItem(pos);
    		if (m_addrList.GetItemState(zahl,LVIS_SELECTED) == LVIS_SELECTED)
    		{
    			pPerson = (CPerson*)theDatabase->personen.GetAt(pos);
    			delete pPerson;    // !!!!
    			theDatabase->personen.RemoveAt(pos);   // pointer aus liste entfernen
    			m_addrList.DeleteItem(zahl);
    		} 
    	}
    
    	char s[10];
    	itoa(zahl, s, 10);
    	AfxMessageBox(s);
    	AfxMessageBox("Sie haben keinen Eintrag selektiert!");
    	return;
    
    }
    

    Compiler meldet keinen Fehler und startet die Anwendung ohne probleme. bloß sobald ich den Button klicke zum Löschen eines eintrages aus der Liste und somit aus der DB bekomme ich ein Fehler fenster angezeigt mit "Ein ungültiges Argument wurde festgestellt" und nix weiter passiert....

    Ich währe für jegliche Hilfe sehr dankbar!

    PS: Bin noch nicht soooo erfahren in C++

    Gruß

    StarGate



  • 1. Es ist ein List Control, keine ListBox

    2. Du solltest zahl für GetAt verwenden, nicht pos.

    3. Die Abfrage mit GetItemState ist unnötig.

    4. Du solltest auf keinen Fall in dieser Schleife Elemente aus der Liste löschen. Dadurch verschieben sich die Indices der Elemente, die unter dem gelöschten liegen. Merk dir die zu löschenden Einträge und lösch sie hinterher, von hinten beginned.



  • MFK schrieb:

    1. Es ist ein List Control, keine ListBox
    -> ok sorry

    2. Du solltest zahl für GetAt verwenden, nicht pos.
    -> GetAt erwartet ein POSITION zeiger und kein INT !

    3. Die Abfrage mit GetItemState ist unnötig.

    -> Ich will aber das alle SELEKTIERTEN einträge gelöscht werden !

    4. Du solltest auf keinen Fall in dieser Schleife Elemente aus der Liste löschen. Dadurch verschieben sich die Indices der Elemente, die unter dem gelöschten liegen. Merk dir die zu löschenden Einträge und lösch sie hinterher, von hinten beginned.

    -> Sämtliche einträge in der DB haben in der struct PERSON_DATA ein value int Pers.indexnr; demnach sollte das nicht problematisch sein !

    Gruß StarGate



  • StarGate schrieb:

    -> GetAt erwartet ein POSITION zeiger und kein INT !

    Mag sein. pos ist aber ein interner Wert deines List Controls, damit kann theDatabase->personen (was immer es ist, hast du ja nicht verraten) nichts anfangen. pos kannst du nur für GetNextSelectedItem benutzen.

    -> Ich will aber das alle SELEKTIERTEN einträge gelöscht werden !

    GetFirstSelectedItemPosition/GetNextSelectedItem liefert dir nur die selektierten Einträge. Darum heißen die Funktionen so. Sonst könntest du ja auch gleich mit einer for-Schleife durch die Einträge laufen.

    -> Sämtliche einträge in der DB haben in der struct PERSON_DATA ein value int Pers.indexnr; demnach sollte das nicht problematisch sein !

    Bahnhof?
    Wenn du Einträge aus dem List Control löscht, verschieben sich die dahinterliegenden Einträge. Zudem wird deine aktuelle POSITION ungültig. Das könnte zu Problemen mit GetFirstSelectedItemPosition/GetNextSelectedItem führen.



  • Hier der code der dir wohl mehr verständnis liefert:

    CPerson.h

    struct PERSON_DATA
    {
    	int  indexnr;
    	char TelNr[20];
    	char Name[60]; 
    	char Extrainfo[120];
    }
    
    class CPerson : public CObject
    {
    public:
    	CPerson()
    	{
    		Pers.indexnr = 0;
    		*Pers.TelNr = '\0';
    		*Pers.Name = '\0';
    		*Pers.Extrainfo = '\0';
    	}
    	~CPerson() {};
    
    	PERSON_DATA Pers;
    
    };
    
    class CPersonDB
    {
    public:
    	CPersonDB() { dbName = "output.dat"; } // Sollte spter noch variabel sein
    	CString dbName; // global Filename to write to !
    	CObList personen;
    	......
    

    nach .... folgen nur noch die funktionen zum schreiben und lesen ins File!

    zusätzlich ist in meiner dialog.h folgendes im protected teil:

    CPersonDB* theDatabase;

    Gruß StarGate



  • Wenn du eine CObList hast, musst du den Index in eine POSITION umrechnen:

    POSITION personpos = theDatabase->personen.FindIndex(zahl);
    pPerson = (CPerson*)theDatabase->personen.GetAt(personpos);
    


  • MFG

    es tut mir echt leid, aber die Fehlermeldung kommt immer noch trotz deines codes
    den ich nun in die funktion mit eingebaut habe 😞

    😞 😞



  • StarGate schrieb:

    CPersonDB* theDatabase;

    Lässt du diesen Zeiger auch irgendwo auf eine Instanz von CPersonDB zeigen?



  • Ja MFK !



  • Dann wirst du wohl den Debugger bemühen müssen.


Log in to reply