ListView aktualisieren
-
Hallo.
Ich lese per ListView aus einer *.log Datei Daten Zeilenweise aus;
da sich am Ende der Datei jeder zeit eine neue Zeile einfügen kann, möchte ich natürlich auch die ListBox aktualisieren.Ich habe es schon mit einem Timer versucht...da flackert das ListView.
Vielleicht kann man mir geholfen werden !
mfg Maxx
-
timer ist doch ein guter ansatz - wenns flackert wuerde ich sagen das du die intervalle zu kurz hast
-
Mit flackern meine ich das neu "zeichnen" des ListViews"
Flackert natürlich bei 3000 alle 3 sekunden bei 5000->5 Sek. usw.
vielleicht gibt es eine andere lösung.
-
Naja wie updatest du denn?
Alle Einträge löschen und komplett neu erstellen?Eine andere möglichkeit wäre das "inkrementelle Update". D.H. du updatest nur das was auch geändert werden muss. Den Rest lässt wie es war. Das bedeutet natürlich eine gewisse Mehrarbeit aber sollte das Problem weitestgehend lösen. Wenn sich die log Datei natürlich alle paar sekunden komplett ändert hast du damit auch nix gewonnen

schirrmie
-
Bei Flackern hilft oft ein Back-Buffer. Ich weiß nicht genau, wie/ob man den in einem Listview realisieren kann, aber kannst es ja mal probieren.
Damit meine ich, dass du die WM_ERASEBKGND- und die WM_PAINT-Nachricht abfängst. In der WM_ERASEBKGND gibst du einfach != 0 zurück. In der WM_PAINT leerst du deinen Backbuffer, lässt den Listview-Inhalt reinzeichnen und blittest ihn in den Listview-DC.
Den Backbuffer kannst du mit CreateCompatibleDC und CreateCompatibleBitmap erzeugen, in der WM_PAINT rufst du die DefWindowProc mit WM_PAINT von der Listview auf (aus GetClassInfo(...) "lpfnWndProc") und übergibst als wParam deinen Backbuffer-DC. Danach halt blitten

-
Ich zeichne die Listview mit:
InitListViewItems(hwndLV,pfData); //initialisieren for (iItems = 0; fgets(g_achTemp, sizeof(g_achTemp), pfData); iItems++) { MYITEM *pItem = LocalAlloc(LPTR, sizeof(MYITEM)); pszEnd = strchr(g_achTemp, ','); *pszEnd = '\0'; pItem->aCols[0] = DupString(g_achTemp); for (iSubItem = 1; iSubItem < C_COLUMNS && pszEnd != NULL; iSubItem++) { pszStart = pszEnd + 1; if ((pszEnd = strchr(pszStart, ',')) != NULL) *pszEnd = '\0'; pItem->aCols[iSubItem] = DupString(pszStart); } lv.iItem = iItems; lv.iSubItem = 0; lv.lParam = (LPARAM) pItem; ListView_InsertItem(hwndLV, &lv);immer neu
der Log datei wird immer nur eine Zeile angehängt..alle anderen bleiben.kannst du mir einen Tip geben wie das mit dem Update gehen soll?
-
Hm, da gabs doch glaubich auch irgendwas mit "BeginUpdate" und "EndUpdate". Dann wird das Fenster erst wieder gezeichner, wenn alle Items drin sind, das könnte was für dich sein
-
Na wenn nur eine Zeile an die Log datei gehängt wird warum hängst du dann nicht nur eine Zeile an deine ListView?
schirrmie