per while neue items der liste geben



  • ich hab mir eine listbox geschrieben und nun versucht mit hilfe einer whileschleife die items einzufügen.
    leider stürzt das programm dann ab.

    die schleife sieht folgendermaßen aus:

    while(rautepos < (int)wcslen(textpuffer) - 1)
    			{
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    				//name
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"<Name>");
    				posa = feldzeiger - textpuffer + 6;
    				feldzeiger = wcsstr(&textpuffer[posa],L";");
    				pose = feldzeiger - textpuffer;
    				textgrose = pose - posa;
    				name = new wchar_t[textgrose+2];
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				wcsncpy(name,&textpuffer[posa],textgrose);
    				item.mask     = LVIF_TEXT | LVIF_STATE ; 
    				item.state    = LVIS_FOCUSED|LVIS_SELECTED; 
    				item.iSubItem = 0; 
    				item.iItem = ListView_GetItemCount(hwndlb); 
    				ListView_InsertItem(hwndlb,&item);
    				UpdateWindow(hwndlb);
    				ShowWindow(hwndlb, SW_SHOW); 
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				delete[] name;
    				//ende name	
    
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    			}
    

    ich versuche also bei jedem while durchlauf der liste ein neues item zu geben:

    item.mask     = LVIF_TEXT | LVIF_STATE ; 
    				item.state    = LVIS_FOCUSED|LVIS_SELECTED; 
    				item.iSubItem = 0; 
    				item.iItem = ListView_GetItemCount(hwndlb); 
    				ListView_InsertItem(hwndlb,&item);
    				UpdateWindow(hwndlb);
    				ShowWindow(hwndlb, SW_SHOW);
    

    gibt es eine andere möglichkeit einer liste per while items zu geben?
    bzw. warum ist das falsch?
    sorry aber ich kenn micht mit listen noch nicht so gut aus.
    danke



  • sorry ich habe folgendes vergessen:
    item.pszText = name;
    das gehört noch in die schleife



  • es sieht also so aus:

    while(feldzeiger != NULL)
    			{
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    				//name
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"<Name>");
    				posa = feldzeiger - textpuffer + 6;
    				feldzeiger = wcsstr(&textpuffer[posa],L";");
    				pose = feldzeiger - textpuffer;
    				textgrose = pose - posa;
    				name = new wchar_t[textgrose+2];
    				memset(name,'\0\0', sizeof(wchar_t)*(textgrose+2));
    				wcsncpy(name,&textpuffer[posa],textgrose);
    				item.mask     = LVIF_TEXT | LVIF_STATE ; 
    				item.state    = LVIS_FOCUSED|LVIS_SELECTED; 
    				item.iSubItem = 0;				
    				item.cchTextMax = MAX_PATH;
    				item.pszText  = name;
    				item.iItem = ListView_GetItemCount(hwndlb);
    				ListView_InsertItem(hwndlb,&item);
    				UpdateWindow(hwndlb);
    				memset(name,'\0\0', sizeof(wchar_t)*(textgrose+2));
    				delete[] name;
    				//ende name	
    
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    			}
    
    			delete[] textpuffer;
    			ShowWindow(hwndlb, SW_SHOW);
    

    das lustige ist ja. es werden alle items angezeigt und danach schmiert es ab



  • dann wird es wohl an delete[] textpuffer; leigen 🙄 Kommentier das mal aus (nur zum Test) und zeig vielleicht den Code zur Speicherreservierung von textpuffer.
    Ansonsten mal mit Debugger ausführen, dann weißt du, wo es abstürzt 😉



  • HANDLE hdatei;
    			DWORD size;
    			DWORD bytes;
    			wchar_t* feldzeiger;
    			wchar_t* textpuffer;
    			wchar_t* name;
    			int rautepos = 0;
    			int posa,pose,textgrose;
    			int indexa = 0;
    			int indexb = 0;
    
    			hdatei = CreateFile(TEXT("\\programme\\wanderkarte\\events.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);     
    			size = GetFileSize(hdatei,NULL);
    			textpuffer = new wchar_t[size+2];
    			memset(textpuffer,'/0', sizeof(wchar_t)+(size+2));
    			ReadFile(hdatei,textpuffer,size,&bytes,NULL);
    			CloseHandle(hdatei);		
    
    			while(feldzeiger != NULL)
    			{
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    				//name
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"<Name>");
    				posa = feldzeiger - textpuffer + 6;
    				feldzeiger = wcsstr(&textpuffer[posa],L";");
    				pose = feldzeiger - textpuffer;
    				textgrose = pose - posa;
    				name = new wchar_t[textgrose+2];
    				memset(name,'\0\0', sizeof(wchar_t)*(textgrose+2));
    				wcsncpy(name,&textpuffer[posa],textgrose);
    				item.mask     = LVIF_TEXT | LVIF_STATE ; 
    				item.state    = LVIS_FOCUSED|LVIS_SELECTED; 
    				item.iSubItem = 0;				
    				item.cchTextMax = MAX_PATH;
    				item.pszText  = name;
    				item.iItem = ListView_GetItemCount(hwndlb);
    				ListView_InsertItem(hwndlb,&item);
    				UpdateWindow(hwndlb);
    				memset(name,'\0\0', sizeof(wchar_t)*(textgrose+2));
    				delete[] name;
    				//ende name	
    				//ort
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"<Ort>");
    				posa = feldzeiger - textpuffer + 5;
    				feldzeiger = wcsstr(&textpuffer[posa],L";");
    				pose = feldzeiger - textpuffer;
    				textgrose = pose - posa;
    				name = new wchar_t[textgrose+2];
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				wcsncpy(name,&textpuffer[posa],textgrose);
    				ListView_SetItemText(hwndlb,indexa++,1,name);
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				delete[] name;
    				//ende ort
    				//datum
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"<Beginn Datum>");
    				posa = feldzeiger - textpuffer + 14;
    				feldzeiger = wcsstr(&textpuffer[posa],L";");
    				pose = feldzeiger - textpuffer;
    				textgrose = pose - posa;
    				name = new wchar_t[textgrose+2];
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				wcsncpy(name,&textpuffer[posa],textgrose);
    				ListView_SetItemText(hwndlb,indexb++,2,name);
    				memset(name,'\0', sizeof(wchar_t)*(textgrose+2));
    				delete[] name;
    				//ende datum
    
    				feldzeiger = wcsstr(&textpuffer[rautepos + 1],L"#");
    				rautepos = feldzeiger - textpuffer;
    			}
    
    			delete[] textpuffer;
    			ShowWindow(hwndlb, SW_SHOW);
    

    der debugger zeigt nix er sagt nur "acces violation"



  • Wo, will ich wissen 😉
    Hast du die Zeile mal auskommentiert, oder davor einen Breakpoint gesetzt?



  • wenn ich:
    item.pszText = name;
    auslasse geht alles.
    es wird keine zeile angezeigt der disassembler springt auf und zeigt mir ein paar nette zeilen die ich nicht verstehe (assembler code) und eine messege box springt auf mit "acess violation 0xC0000005" das wars 😞



  • Also ich denk mal, du darfst entweder für item.cchTextMax nicht MAX_PATH sondern die tatsächliche Größe bzw. Länge des Strings übergeben, oder ganz evtl. darfst du den Speicher anschließend nicht freigeben (delete[] name;)



  • ich denke auch,
    dass es an delete[] name liegt.
    die frage ist jetzt wie gebe ich den speicher dann wieder frei?
    ich brauche den zeiger um beim nächsten durchlauf wieder speicher anzumelden.



  • Ich weiß jetzt nicht, ob sich das ListView den Text kopiert, aber falls nicht darfst du den Text ja gar nicht freigeben 😉 - klappt denn alles, wenn du das delete auskommentierst?
    Evtl. könntest du auch mit LPSTR_TEXTCALLBACK und LVN_GETDISPINFO arbeiten 🙄


Anmelden zum Antworten