i cant see to work out a method to tell if my listview has anything in it. i have a toolbar button that when i press it, it deletes the entire contents of the listview but first verifies if the user wants to really delete with a yes or no message box.
is what i would like to do is to first test if my listview has contents then if it does... "the would you like to clear the list view" message box will appear. if the listview is empty a message box will appear that says that the listview is empty and nothing can be deleted.
;;===============================;;
;; BUTTON2 CLEAR LISTVIEW ;;
;;===============================;;
.if ax == TB_CLEAR <-- if the clear toolbar button is pressed
invoke MessageBoxEx,hWin,ADDR ClearListView,ADDR MessageBox1,MB_YESNO,0
.if eax == IDYES
invoke SendMessage,hListView,LVM_DELETEALLITEMS,0,0
invoke SetWindowText,hEditBox1,NULL
invoke SetWindowText,hEditBox2,NULL
invoke SetWindowText,hEditBox3,NULL
invoke SetWindowText,hEditBox4,NULL
.else
.endif
.endif
Hi Smurf,
I wonder if you could use ListView_GetItem to retrieve the text of a list view item or subitem and check to see if there's actually anything there.
Or maybe even better, use the LVM_GETITEMTEXT message explicitly as it returns the length of the retrieved string, then cmp it to zero.
If some of your entries might be empty anyway, you might have to check them all though until you get one with text.
Kayaker
errr, how about LVM_GETITEMCOUNT?
god bless msdn!
i went through the msdn and definetly missed the getitemcout api. thanks for pointing that out fresh.
kayaker i was setting up to use the getitemtext api but getitemcount is much more suitable for the job. thank you too for your reply.
smurf
im having a problem with LVM_GETITEMCOUNT. when i populate my listview with about 10 items or so LVM_GETITEMCOUNT on returns that i have 1 item. anyone know why this is. here is a code snipet im using to get the count and then put it in a textbox.
invoke SendMessage,hListView,LVM_GETITEMCOUNT,0,0
mov TotalItems,eax
invoke SetWindowText,hEditBox1,ADDR TotalItems
HI Smurf,
I think the problem you have is cause by the result you get in EAX when calling LVM_GETITEMCOUNT.This result is in binary, you have to translate it to ascii.
You can do something like this:
invoke SendMessage,hListView,LVM_GETITEMCOUNT,0,0
mov ecx,1
.if eax > 9
mov ecx,2
.endif
lea edi,TotalItems
invoke CvDec
invoke SetWindowText,hEditBox1,ADDR TotalItems
;This will translate the number in EAX to ascii in TotalItems
CvDec PROC USES EBX ECX EDX EDI
.IF ECX != 0 ;Just exit if null (bad) length.
LEA EDI, ;Get EDI => past last digit in field.
MOV EBX,10 ;Setup divisor.
.REPEAT
DEC EDI ;Point to previous ASCII slot,
XOR EDX,EDX ;EDX:EAX = Dividend.
.IF EAX != 0 ;Save bunch of cycles if no more to divide.
DIV EBX ;EAX = EAX/10, EDX = remainder.
.ENDIF
OR DL,'0' ;Turn BCD digit to ASCII,
MOV ,DL ;store ASCII digit,
DEC ECX ;decrement loop count,
.UNTIL ZERO? ;loop again if digit(s) left.
.ENDIF
RET
CvDec ENDP
thank you guy that was my problem. how did you know that the result would be returned in binary? the msdn didn't say anything about that!
smurf
Try the following code:
;On edit creation, get its dialog ID equivalent
invoke GetDlgCtrlID, hEdit
mov EditID, eax
...
invoke SendMessage, hListView,LVM_GETITEMCOUNT,0,0
invoke SetDlgItemInt, hWnd, EditID, eax, FALSE
If that gives you the correct answer, then your problem is because you aren't converting the return value from SendMessage correctly.
MirnoSmurf,
All results from INVOKE are binary in EAX. Remember, computer' registers talk in binary, we have to translate it to ascii if we want to get the correct result.
Regards,
Guy
.data
fMtStrinG db "%lu",0
.data?
buffer db 512 dup(?)
TotalItems dd ?
invoke SendMessage,hListView,LVM_GETITEMCOUNT,0,0
mov TotalItems,eax ;TotalItems is a dd not ascii
invoke wsprintf,ADDR Buffer,ADDR fMtStrinG,TotalItems
;change to ascii
invoke SetWindowText,hEditBox1,ADDR Buffer