April 29, 2024, 01:21:44 PM

News:

Own IWBasic 2.x ? -----> Get your free upgrade to 3.x now.........


Listview @LVGetSelected problem

Started by aurelCB, January 17, 2011, 12:18:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

aurelCB

Hi all...
As i say in title i have problem with listview @LVgetselected.
In help is written this:
Quoteselected = CONTROLCMD( window | dialog, ID, @LVGETSELECTED, item)

Use this function to determine the selected state of the item.

item is the zero-based index of the item.


I use for test Listview example and as result i recive weird things.
When i select first item and clik button i recive result 2.
When i select second item and clik button i recive result 0.
???
How is that posible?
Or what i do wrong?
here is code:
'This is a simple list view demo. The list view is created in report mode
'and two columns are added.
'requires EBASIC 1.0 or greater

'Compile as a WINDOWS target

def d1:Dialog
def str:STRING
def p as pointer
int lvitem
int getselecteditem
string text
'standard NMLISTVIEW
'when a column ic clicked on Windows sends a variable
'of this type in @LPARAM.
TYPE NMLISTVIEW
def hwndFrom:UINT
def idFrom:INT
def code:INT
    def iItem:INT
    def iSubItem:INT
    def uNewState:UINT
    def uOldState:UINT
    def uChanged:UINT
    def ptActionx:INT
def ptActiony:INT
    def lParam:INT
ENDTYPE

CREATEDIALOG d1,0,0,405,368,0x80C80080,0,"List view test",&handler
CONTROL d1,@LISTVIEW,"",27,24,240,110,0x50000001,1
CONTROL d1,@STATIC,"TEST",27,140,240,20,0x50000000,2

CONTROL d1,@BUTTON,"Button1",54,235,70,20,0x50000000,3

domodal d1
end

SUB handler
select @MESSAGE
case @IDINITDIALOG
centerwindow d1
'insert columns and some items
'after an item is inserted we use @LVSETTEXT to
'change the subitems text
CONTROLCMD d1,1,@LVINSERTCOLUMN,0,"Column1"
CONTROLCMD d1,1,@LVINSERTCOLUMN,1,"Column2"
CONTROLCMD d1,1,@LVINSERTITEM,0,"Item 1"
CONTROLCMD d1,1,@LVSETTEXT,0,1,"Subitem 1"
CONTROLCMD d1,1,@LVINSERTITEM,1,"Item 2"
CONTROLCMD d1,1,@LVSETTEXT,1,1,"Subitem 2"
case @IDCONTROL
if(@CONTROLID = 1)
'someone clicked on a column header. Read the data from @LPARAM which is
' a pointer to a NMLISTVIEW UDT. Using the C dereferencing style makes
' it much easier

if(@NOTIFYCODE = @LVNCOLUMNCLICK)
'CONTROLCMD d1,1,@LVSETCOLUMNTEXT,*<NMLISTVIEW>@LPARAM.iSubItem,"Clicked!"

endif
ENDIF
if @CONTROLID = 3
getselecteditem=CONTROLCMD( d1, 1, @LVGETSELECTED, lvitem)
'CONTROLCMD d1, 1, @LVSETSELECTED,getselecteditem
MESSAGEBOX 0,"SELECTED:"+str$(getselecteditem),"TEST"
CONTROLCMD(d1,1, @LVGETTEXT, lvitem,1, text)
MESSAGEBOX 0,"SELECTED_IS:"+text,"TEST"
ENDIF

endselect
return
ENDSUB


sapero

January 17, 2011, 01:49:33 PM #1 Last Edit: January 17, 2011, 01:55:14 PM by sapero
CONTROLCMD @LVGETSELECTED is a wrapper for SendMessage+LVM_GETITEMSTATE which returns a set of LVIS_*** flags for the specified item (by index).
The selected state bit is LVIS_SELECTED = 2.

With CONTROLCMD+@LVGETSELECTED you can check if a item is selected or not.
If you want to enumerate selected items, include windowssdk.inc and commctrl.inc, and then:

HWND hwndList = GETCONTROLHANDLE( ... )
int itemIndex = SendMessageA(hwndList, LVM_GETNEXTITEM, -1, LVNI_SELECTED)
while (itemIndex >= 0)
' item 'itemIndex' is selected
itemIndex = SendMessageA(hwndList, LVM_GETNEXTITEM, itemIndex, LVNI_SELECTED)
wend

LarryMc

Aurel
Try my version

LarryMc
'This is a simple list view demo. The list view is created in report mode
'and two columns are added.
'requires EBASIC 1.0 or greater

'Compile as a WINDOWS target

def d1:Dialog
def str:STRING
def p as pointer
int lvitem
int getselecteditem
string text
'standard NMLISTVIEW
'when a column ic clicked on Windows sends a variable
'of this type in @LPARAM.
TYPE NMLISTVIEW
def hwndFrom:UINT
def idFrom:INT
def code:INT
    def iItem:INT
    def iSubItem:INT
    def uNewState:UINT
    def uOldState:UINT
    def uChanged:UINT
    def ptActionx:INT
def ptActiony:INT
    def lParam:INT
ENDTYPE

CREATEDIALOG d1,0,0,405,368,0x80C80080,0,"List view test",&handler
CONTROL d1,@LISTVIEW,"",27,24,240,110,0x50000001,1
CONTROL d1,@STATIC,"TEST",27,140,240,20,0x50000000,2

CONTROL d1,@BUTTON,"Button1",54,235,70,20,0x50000000,3

domodal d1
end

SUB handler
select @MESSAGE
case @IDINITDIALOG
centerwindow d1
'insert columns and some items
'after an item is inserted we use @LVSETTEXT to
'change the subitems text
CONTROLCMD d1,1,@LVINSERTCOLUMN,0,"Column1"
CONTROLCMD d1,1,@LVINSERTCOLUMN,1,"Column2"
CONTROLCMD d1,1,@LVINSERTITEM,0,"Item 1"
CONTROLCMD d1,1,@LVSETTEXT,0,1,"Subitem 1"
CONTROLCMD d1,1,@LVINSERTITEM,1,"Item 2"
CONTROLCMD d1,1,@LVSETTEXT,1,1,"Subitem 2"
case @IDCONTROL
if(@CONTROLID = 1)
'someone clicked on a column header. Read the data from @LPARAM which is
' a pointer to a NMLISTVIEW UDT. Using the C dereferencing style makes
' it much easier

if(@NOTIFYCODE = @LVNCOLUMNCLICK)
'CONTROLCMD d1,1,@LVSETCOLUMNTEXT,*<NMLISTVIEW>@LPARAM.iSubItem,"Clicked!"

endif
ENDIF
if @CONTROLID = 3
int x
for x= 0 to (CONTROLCMD(d1,1, @LVGETCOUNT)-1)
if CONTROLCMD(d1,1, @LVGETSELECTED, x)
CONTROLCMD(d1,1, @LVGETTEXT, x,1, text)
MESSAGEBOX d1,"SELECTED_IS:"+text,"Row"+str$(x)+" (0 based)"
endif
next x
ENDIF

endselect
return
ENDSUB
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

aurelCB

Thank you guys!
I think that i must use counter but i need this in first place bacose i want implement this
in ABasic .Hmmm im still not sure what to use ....
I will see ...
thanks again...

all best
Aurel

LarryMc

Sapero's code goes through only those items that are selected.
My example goes through all items and checks to see which ones are selected.

Therefore Sapero's way is the fastest.

LarryMc
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

aurelCB

Yes Larry ,Sapero way is faster for sure but your is simplier for me .
I also found one Wayne example which use similiar method.
Here is piece of code how i store listview item in LinkedList in ABasic and work fine...

IF CONTROLEXISTS(w2,cID)
count=ControlCMD(w2,cID,@LVGetCount)
For lvitem = 0 to count
IF ControlCMD(w2,cID,@LVGetSelected,lvitem)
getselecteditem = lvitem
BREAKFOR
ENDIF
Next lvitem
'store lvitem in LList
error=1
PosInList = ListGetFirst(intList)
WHILE (PosInList <> 0)
intVar = ListGetData(PosInList)
IF #intVar.intName = GW3
#intVar.intValue = getselecteditem
error=0
ENDIF
PosInList = ListGetNext(PosInList)
ENDWHILE

LarryMc

Aurel
In your last example you need to get rid of the BREAKFOR statement.

With it in there you will only find a max of 1 selected items.

LarryMc
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

aurelCB

January 18, 2011, 01:36:29 PM #7 Last Edit: January 18, 2011, 01:40:46 PM by aurelCB
No Larry it work as espected.
I have two commands for this :
button sub is:

SUBID 110
GetLVselected lvID selected
GetLVText lvID selected 1 g$
Print 20 220 "                                                                "
Print 20 220 g$
ENDSUB


And work ok..
by the way you can download lates release and try example Listview1.aon in ABasic.
http://aurelbasicsoft.ucoz.com/ABasic1v0.zip

LarryMc

form the help file
QuoteBREAKFOR allows an early exit of a FOR/NEXT loop before the loop has finished all of the iterations.
from your posted code:
count=ControlCMD(w2,cID,@LVGetCount)
For lvitem = 0 to count
IF ControlCMD(w2,cID,@LVGetSelected,lvitem)
getselecteditem = lvitem
BREAKFOR
ENDIF
Next lvitem
'<== BREAKFOR continues here

if count is 1000 and all are selected, the FOR loop will be exited while the ivitem=0 and will never check the rest of the selected items.

The only way your posted code will work correctly is if you limit selections to 1 at a time by the user.

to make your code work for multiple selections you would need to replace the BREAKFOR with a call to subroutine that adds the selection to your linked lists.

LarryMc
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

aurelCB

Yeah ...you right , im limit selection to 1.
I will remeber what you say ,good point  ;)