Página 1 de 1

array en listview (solucionado)

Publicado: 04 Jun 2010, 02:37
por taoru
hola, quiero listar personas a las cual se pueden enviar mensajes.
las personas las listo en un array.

pero como accedo que opcion del listview se seleccionó?.

así puedo optener su id.
quiero poner 2 arrays, una con los nombres, y otra con los array.
si en el listview se selecciona la persona 3, tomar la id 3 asi se de quien se trata, hay alguna forma de saber ese dato?.
o de armar un listview con 2 datos?. un oculto y un visible para q se liste por nombre, y por código optenga la id?.


dejo aqui mi código que hice hasta el momento...en este código puedo optener su nombre.
pero a la hora de listar sus mensajes es muy largo...asi que lo que necesitaría que me de el valor o la pocición del array.
ejemplo: si selelccionamos en este código a vanesa, no me de el nombre, si no el número 3, que es la pocición del array en el cual se encuentra.
como lo puedo mejorar a este código?...

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Func MsgList($title,$datos)
 Local $listview, $button, $item1, $item2, $item3, $input1, $msg
    
$FormList = GUICreate($title, 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF)

    $listview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 

150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Valor?", 75, 170, 70, 20)

for $msg in $datos
GUICtrlCreateListViewItem($msg, $listview)
next

GUISetState()

Dim $AccelKeys[1][2] = [["{ENTER}", $button]]
GUISetAccelerators($AccelKeys)


While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
                    GUIDelete($FormList)
ExitLoop
Case $button
$us=GUICtrlRead(GUICtrlRead($listview))
$us=StringReplace($us, "|", "")
MsgBox(0, "opcion elegida", $us)
EndSwitch
WEnd
EndFunc ;==> lista los mensajes:

$title="mensajes"
dim $datos[4]=["andres", "david", "jennifer", "vanesa"]
MsgList($title,$datos)
gracias!.

Re: array en listview

Publicado: 04 Jun 2010, 15:06
por Chefito
Mira en la ayuda el ejemplo de la función _GUICtrlListView_Create. Hay está lo que quieres. Mira el "index" que genera alguna de las opciones de la función WM_NOTIFY.

Saludos.

Re: array en listview (solucionado)

Publicado: 04 Jun 2010, 18:51
por taoru
hooola.
muchas gracias!, pude llegar a la solución.

dejo aqui mi código solucionado por si alguien tiene el mismo problema.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Func MsgList($title,$datos)
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
    
$FormList = GUICreate($title, 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF)

    $listview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150)

$button = GUICtrlCreateButton("Valor?", 75, 170, 70, 20)

for $msg in $datos
GUICtrlCreateListViewItem($msg, $listview)
next

GUISetState()

Dim $AccelKeys[1][2] = [["{ENTER}", $button]]
GUISetAccelerators($AccelKeys)


While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
                    GUIDelete($FormList)
ExitLoop
Case $button
$us=GUICtrlRead(GUICtrlRead($listview))
$us=StringReplace($us, "|", "")
MsgBox(0, "opcion elegida", $us)
$i=_GUICtrlListView_GetSelectedIndices($listview)
MsgBox(0, "indice del item", $i)
EndSwitch
WEnd
EndFunc ;==> lista los mensajes:

$title="mensajes"
dim $datos[4]=["andres", "david", "jennifer", "vanesa"]
MsgList($title,$datos)
saludos!

Re: array en listview (solucionado)

Publicado: 04 Jun 2010, 18:55
por taoru
me olvide comentarlo...
la solución lo encontré utilizando la función: _GUICtrlListView_GetSelectedIndices.
ya lo pueden ver en mi código.

gracias Chefito por la ayuda, buscando de esas funciones vi que utilizaban esta.

saludos!

Re: array en listview (solucionado)

Publicado: 04 Jun 2010, 20:46
por Chefito
Me alegra que hayas encontrado una solución posible :smt023 . Pero yo te pregunto, no te interesaba que al darle un click, o un doble click, o cambiase de elemento en la listview te indicase el index y el nombre en vez de tener que darle a un botón? (esto se hace a través de la captura de eventos del elemento listview como te dije que vieses).
Si te interesa y no sabes como hacer (primero intentalo :smt002 ), dimelo y te pongo un ejemplo.

Saludos.

Re: array en listview (solucionado)

Publicado: 12 Jun 2010, 03:15
por taoru
lo estube revisando pero no lo entendí.
me podrías dar un ejemplo?.

gracias. :$

Re: array en listview (solucionado)

Publicado: 14 Jun 2010, 20:02
por Chefito
He adaptado el ejemplo a tu código. Verás que he añadido muy poco respecto a los ejemplos de la ayuda que te indiqué anteriormente. Practicamente he copiado y pegado las partes que me interesaban :smt005 .
He averiguado el índice del item del listview utilizando una estructura ($tagNMITEMACTIVATE) la cual tiene en uno de sus elementos (index) el índice señalado. Esto es algo más complicado, pero viendo el código ejemplo de la función _GUICtrlListView_Create, copiando y pegando y variando un poco lo que te interesa, puedes sacar información de los elementos que te interese :smt002 .
También te he puesto otras dos formas de sacar el texto del item sabiendo su index.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Func MsgList($title,$datos)
Local $button, $item1, $item2, $item3, $input1, $msg
    
$FormList = GUICreate($title, 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF)

    $listview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150)

$button = GUICtrlCreateButton("Valor?", 75, 170, 70, 20)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

for $msg in $datos
GUICtrlCreateListViewItem($msg, $listview)
next

GUISetState()

Dim $AccelKeys[1][2] = [["{ENTER}", $button]]
GUISetAccelerators($AccelKeys)


While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
                    GUIDelete($FormList)
ExitLoop
Case $button
$us=GUICtrlRead(GUICtrlRead($listview))
$us=StringReplace($us, "|", "")
MsgBox(0, "opcion elegida", $us)
$i=_GUICtrlListView_GetSelectedIndices($listview)
MsgBox(0, "indice del item", $i)
EndSwitch
WEnd
EndFunc ;==> lista los mensajes:


Global $listview,$formlist
$title="mensajes"
dim $datos[4]=["andres", "david", "jennifer", "vanesa"]
MsgList($title,$datos)

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)	;recoge los eventos de la ventana (notify)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
;~  Local $tBuffer
	$hWndListView = GUICtrlGetHandle($ListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; Si pulsas click con el ratón en la lista entra aquí.
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)	;estructura que averigua distintos datos. Nos interesa averiguar el indel del item.
                    $i=DllStructGetData($tInfo, "Index")	;cogemos el index del item cliqueado de la estructura anterior. El index es un elemento de la estructura.
					$us=ControlListView($formlist, "", "SysListView321", "GetText", $i)	;1º opción para averiguar el texto del item.
					;$us=_GUICtrlListView_GetItemText($hWndListView,$i)		;2º opción para averiguar el texto del item.
					MsgBox(0, "opcion elegida", $us)
					MsgBox(0, "indice del item", $i)								
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Espero que te haya servido.
Recuerda que también puedes interactuar con otras opciones además del click. Mira el código ejemplo de la función _GUICtrlListView_Create.

Saludos.

Re: array en listview (solucionado)

Publicado: 15 Jun 2010, 01:19
por taoru
ups, ahora entiendo porque no lo había entendido antes.
claro, yo lo adapté para teclado, y saltié un paso importante, el mouse.

si yo quito que se active con enter desde el botón, funciona con mouse pero no con teclado.
y cuando funciona con el mouse, y preciono enter sin el accesskey, no funciona, por eso con el lector de pantalla no entendía porque no funcionaba, ahora que le di un click con el mouse funcionó.

gracias!, ese detalle se me estaba pasando por alto.

una consulta mas:
este mismo formulario yo lo reutilizo para mostrarle los mensajes recibidos
habrá alguna forma de mostrarle con algun icono en el item cuando el mensaje está leído o cuando no?.

gracias!

Re: array en listview (solucionado)

Publicado: 16 Jun 2010, 16:31
por Chefito
taoru escribió:este mismo formulario yo lo reutilizo para mostrarle los mensajes recibidos
habrá alguna forma de mostrarle con algun icono en el item cuando el mensaje está leído o cuando no?.
Claro :smt001 .
Mira la udf GUIImageList en la ayuda. Son las funciones que empiezan por _GUIImageList_....... .
Por ejemplo, mira el código de ejemplo en la ayuda de la función _GUIImageList_AddIcon.
Y ya que estamos te indico uno de los pocos scripts completos que tengo hecho donde utilizo iconos en un listview :smt005 :
http://www.emesn.com/autoitforum/viewto ... 1816#p6218

Saludos.