ListView Controll läst sich nicht leeren
-
Hi,
Ich hab ein Dialog, indem ein ListView, ein button und ein Static drauf sind.
In den ListView sollen mir alle aktuell laufenden prozesse angezeigt werden.
In den Static, was gerade gemacht/passiert ist.
Und beim klick auf den button, soll die Liste aktualisiert werden.
Soweit sogut..Dialog funktioniert, ListView läst sich auch mit der aktuellen Prozessliste füllen, aber das ListView läst sich aus irgendeinen Grund nicht leeren. Hier der Codeteil, vom Button:case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED) { switch(LOWORD(wParam)) { case ID_BUTTON_REFRESH: { HANDLE hSnap; PROCESSENTRY32 peProc; int index = 0; BOOL bDeleteRet = TRUE; SetStatus(hWnd, L"Aktualisiere.."); SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEALLITEMS, NULL, NULL); ListView_DeleteAllItems(GetDlgItem(hWnd, ID_LIST_PROCESS)); while(!bDeleteRet) { bDeleteRet = (BOOL)SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEITEM, (WPARAM)0, NULL); } if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL)) != INVALID_HANDLE_VALUE) { peProc.dwSize = sizeof(PROCESSENTRY32); if(Process32First(hSnap, &peProc)) { while(Process32Next(hSnap, &peProc)) { index = SendDlgItemMessage(hWnd, ID_LIST_PROCESS, LB_ADDSTRING, NULL, (LPARAM)peProc.szExeFile); } } } if(!ListView_DeleteAllItems(GetDlgItem(hWnd, ID_LIST_PROCESS))) { WCHAR tmp[128]; swprintf(tmp, 127, L"Error: %d", GetLastError()); MessageBox(NULL, tmp, NULL, NULL); } SetStatus(hWnd, L"Aktualisiert."); return 0; } } } return 0;Ich hab schon auf mehreren Arten versucht, das ListView zu lerren. Über
SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEALLITEMS, NULL, NULL);Oder über das makro
ListView_DeleteAllItemsAls fehlermeldung bekomm ich ein
Error: 18zurück, was laut Google ERROR_NO_MORE_FILES bedeutet.
Hoffe ihr könnt mir helfen, such schon den ganzen Tag nach einer Lösung.Gruss, JoeBB.
-
Ist ID_LIST_PROCESS nun eine Listview oder eine Listbox? Die Verwendung von ListView_DeleteAllItems lässt Ersteres vermuten. Neue Elemente fügst du aber mit LB_ADDSTRING ein, für eine Listview geht es nur mit einem LVITEM und LVM_INSERTITEM, also irgendwie so:
LVITEM lvi; memset(&lvi,0,sizeof(LVITEM)); lvi.iItem = SendMessage(hwndLV,LVM_GETITEMCOUNT,0,0);//nr lvi.mask = LVIF_TEXT|LVIF_GROUPID; lvi.iGroupId = 1; lvi.iSubItem = 0; lvi.pszText = TEXT("Spalte 0"); ListView_InsertItem(hwndLV, &lvi); lvi.mask = LVIF_TEXT; lvi.iSubItem = 1; lvi.pszText = TEXT("Spalte 1"); ListView_SetItem(hwndLV,&lvi);Falls du keine Gruppenansicht verwendest, muss lvi.mask natürlich nur LVIF_TEXT sein. Da du Elemente in einer Schleife einfügst, würde ich auch vorher und nachher ein WM_SETREDRAW mit WPARAM == 0 bzw. 1 an die Listview senden.
-
Ich sehe, du verwendest anscheinend doch eine Listbox. Die Elemente einer Listbox werden mit LB_RESETCONTENT gelöscht.
-
Ist eine ListBox. Dummer Anfänger Fehler
