List View Item aus Liste buffen?
-
Ich will ein Listviewitem aus der Liste buffen. Dazu nutze ich
SendMessage(hWnd,LVM_GETITEMTEXT, i, (LPARAM)&lviB);Der erste Parameter ist ein handle, der Zweite ist die Msg, dass man ein Item anfordert, der Dritte ist wParam von WM_NOTIFY und gibt indem Fall an, das wievielte Item man aus der Liste auslesen will und der Vierte ist lParam und sollte eigentlich ein Item aus der Liste buffen vom Typ LVITEM. Nur ich scheine irgendetwas falsch zu machen, denn immer wenn ich das Member pszText verabreiten will, crasht das Programm. Auf andere Werte kann ich jedoch zu greifen. Und wenn ich dem String manuell einen Wert zu weise, dann kann ich auch mit ihm arbeiten. Mein Ziel ist letztendlich lviB.pszText mit anderen Strings zu vergleichen.
Und nebenbei gefragt, wieso muss bei SendMessage beim 4. Parameter (LPARAM) davor stehen? Ist das casting? Wenn ja, kann ich mir nur vorstellen, dass SendMessage dort einen LPARAM Wert erwartet und man daher den LVITEM Typ casten muss. Beim 3. Parameter muss man es nicht in wParam umwandeln, weil i mit wParam verwandt ist. Ist das so korrekt? Ich war mir da schon lange unsicher, aber zu so einer speziellen Frage konnte ich keine Antwort finden. Außerdem frage ich mich, wenn nun lviB in LPARAM gecastet wurde, ob man es dann wieder in LVITEM zurück casten muss. Zwar abe ich es nicht gemacht und es klingt ziemlich skurril, aber andererseits auch sinnvoll.
MfG
-
Was zum Teufel ist denn "buffen"?
Sowas wie "progger"?
-
Also buffen geht mal überhaupt nicht, aber du kannst den Text auslesen. Dann machst du das mal einfach so wie MS das vorschlägt:
LVM_GETITEMTEXT
LVM_GETITEMTEXT
wParam = (WPARAM) (int) iItem;
lParam = (LPARAM) (LPLVITEM) pitem;Retrieves the text of a list view item or subitem. You can send this message explicitly or by using the ListView_GetItemText macro.
If you send this message explicitly, it returns the length of the retrieved string.
If you can send this message implicitly by using the ListView_GetItemText macro, there is no return value.iItem
Index of the list view item.
pitem
Address of an LVITEM structure. The iSubItem member specifies the index of a subitem, or it can be zero to get the item label. The pszText member points to a buffer that receives the text, and the cchTextMax member specifies the size of the buffer.Zu beachten sind die von mir FETT markierten Passagen des Textes! Diese Angaben müssen vor dem Senden der Nachricht angegeben werden.
-
"The pszText member points to a buffer that receives the text" steht ja dort, d.h. zu deutsch es erhält den Text und darum kann man vorher auch keinen Wert angeben. Ich habe verstanden, Du wolltest, dass ich dort manuell etwas angebe.
Jedenfalls besteht mein Problem noch und bin alle mir bekannten Lösungen schon mehrmals durchgegangen. Könnte jemand mal eine kurze MessageBox-Anweisung formulieren mit der man den pszText ausgibt? Vielleicht mache ich ja einen Flüchtigkeitsfehler. Danke.
-
hier mal ein Beispiel:
void GetItemText(HWND hLVWnd, int itempos){ char buffer[128] LVITEM lv_item; memset(&lv_item, 0, sizeof(lv_item)); memset(&buffer, 0, sizeof(buffer)); lv_item.pszText = buffer; lv_item.cchTextMax = sizeof(buffer); SendMessage(hLVWnd, LVM_GETITEMTEXT, itempos, (LPARAM)&lv_item); MessageBox(hLVWnd, message, buffer, MB_OK | MB_ICONINFORMATION); }also ich habs jetzt nicht getestet und hoffe daß es geht.
-
Vielen Dank. Es hatgeklappt. Mein Fehler war, dass ich pszText keinen Buffer zugewiesen habe, sondern davon ausging, dass pszText direkt auf den Textzeigt, aber es zeigt ja auf einen Buffer. Es ist auch ein Verhalten, dass ich das erste mal sehe, daher wirkt es sehr weit hergeholt. Zudem konnte man normalauch direkt eine Addresse von einem String zu weisen, was es nochmal merkwürdig macht. Aber nun gut, danke für die Hilfe.