Pregunta sencilla con listview

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Lucho
Mensajes: 14
Registrado: 01 Ago 2009, 09:45

Pregunta sencilla con listview

Mensaje por Lucho »

Hola, mi pregunta es:

tengo un listview que toma datos de un txt

tiene ID - Nombre

y el txt

520|nombre1
300|nombre2

lo toma bien todo, pero quiero que el usuario pueda borrar uno de ahi y que lo borre del txt claro, como sera para saber la linea que selecciona del listview y la que tiene el txt para borrarlo?

el code

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form2 = GUICreate("programa", 451, 403, 327, 293, BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS))
GUISetBkColor(0x4C5844)
$aceptar = GUICtrlCreateButton("Guardar", 337, 361, 97, 33, $WS_GROUP)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
$hListView = GUICtrlCreateListView("ID|Nombre", 18, 60, 413, 292)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 60)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 349)
GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
$borrar = GUICtrlCreateButton("Borrar", 227, 362, 97, 33, $WS_GROUP)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


$file = FileOpen("indice.txt", 0)
While 1
    $line = FileReadLine($file)
	If @error = -1 Then ExitLoop
	$lista = GUICtrlCreateListViewItem($line, $hListView)
Wend
FileClose($file)


While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
case $borrar
 		GUICtrlDelete(GUICtrlRead($hListView))
 // aca algo para borrar la linea del txt

EndSwitch
WEnd

mucyhas gracias!
Lucho
Mensajes: 14
Registrado: 01 Ago 2009, 09:45

Re: Pregunta sencilla con listview

Mensaje por Lucho »

hola, lo hize asi

Código: Seleccionar todo


$file= "indice.txt"
$contenido = FileRead($file)
$contenido = StringReplace($contenido,GUICtrlRead(GUICtrlRead($hListView)),"")
FileDelete($file)
FileWrite($file,$contenido)
GUICtrlDelete(GUICtrlRead($hListView))
pero donde reemplaza deja un espacio, como evito esto?

ejemplo si tengo:

----------------------------
566|nombre1
233|nombre2
------------------------------
y elimino el nombre 1, queda asi el txt

----------------------------

233|nombre2
------------------------------
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Pregunta sencilla con listview

Mensaje por Chefito »

Porque te queda un retorno de carro (@cr), un salto de linea (@lf) o las dos cosas juntas (@crlf). Para que te desaparezca esa linea en blanco tienes que sustituir esto por nada igual que has hecho con el texto.
También te comunico que tienes la función _ReplaceStringInFile que te sustituye directamente el texto en el fichero. Mirala en la ayuda si te interesa.
Con lo que tu has hecho te quedaría así:

Código: Seleccionar todo

$contenido = StringReplace($contenido,GUICtrlRead(GUICtrlRead($hListView)) & @crlf,"")
o

Código: Seleccionar todo

$contenido = StringReplace($contenido,GUICtrlRead(GUICtrlRead($hListView)) & @cr,"")
o

Código: Seleccionar todo

$contenido = StringReplace($contenido,GUICtrlRead(GUICtrlRead($hListView)) & @lf,"")
según tengas una cosa u otra.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Lucho
Mensajes: 14
Registrado: 01 Ago 2009, 09:45

Re: Pregunta sencilla con listview

Mensaje por Lucho »

hola, muchas gracias, use la funcion _ReplaceStringInFile sin problema, pero al agregarle el @lf al final no reemplaza el archivo, eso que solo le tengo un salto de linea, igual probe con los otros 2, pero no hace nada, si lo saco, claro reemplza dejando ese salto de linea ¬¬

otra duda

el list view tiene solo 2 columnas, ID y Nombre, pero en el txt tengo mas cosas:

22|nombre1|caracteristica|otro

en el listview solo muestro el id y el nombre bien, con esto:

Código: Seleccionar todo

$file = FileOpen("indice.txt", 0)

While 1
    $line = FileReadLine($file)
	If @error = -1 Then ExitLoop
	$aa = StringSplit($line, "|")
        GUICtrlCreateListViewItem($line, $aa[1]&"|"&$aa[2])
Wend
FileClose($file)
en ese caso, como haria para eliminar una linea entera al comparar solo el id y nombre?, algo asi (para explicar)

si listview(22|nombre1|) = txt[1]&txt[2] entonces borrar toda esa linea

saludos :smt001 :smt001
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Pregunta sencilla con listview

Mensaje por Chefito »

Lucho escribió:hola, muchas gracias, use la funcion _ReplaceStringInFile sin problema, pero al agregarle el @lf al final no reemplaza el archivo, eso que solo le tengo un salto de linea, igual probe con los otros 2, pero no hace nada, si lo saco, claro reemplza dejando ese salto de linea ¬¬
Si le has puesto todo eso no te reemplaza la línea, eso significa que en esa línea del fichero de texto tiene que haber algo más que no pones. Mira a ver si tiene espacios en blanco o algún otro caracter que se te a pasado. Puedes ver la longitud de la línea con Stringlen, o puedes ir comprobando los caracteres sospechosos uno a uno con stringmid tanto por la izquierda como por la derecha hasta llegar a caracteres que tu veas. Si son caracteres que no se ven el resultado de la función anterior, puedes ver su código ascii con la función Asc() y comparar el resultado numérico que te da con la tabla ascii (busca en internet que está en millones de sitios. También está en la ayuda de autoit) para saber de que caracter se trata.

Ahora las recomendaciones:
Si siempre sigue un mismo orden de ordenación el list con las líneas del archivo de texto, puede que te interese utilizar la función _FileWriteToLine que sustituye la línea completa de un archivo.
Si no sigue un idéntico orden tendrás que hacerlo como lo estás haciendo hasta ahora. En este caso se elimina la línea de texto completa utilizando varias funciones. Lo suyo es que hicieses una función que te hiciese eso para poder llamarla cuando quieras. Tendrías que buscar la posición inicial del trozo de línea con StringInStr. Una vez que tengas la posición inicial de esa línea, sabiendo esto, tienes que buscar la posición final también con StringInStr en el parámetro start la posición inicial antes encontrada, y en la cadena a buscar (parámetro substring) lo que tengas al final de la línea (ese salto de linea o retorno de carro). A la posición final tendrás que sumarle 1 para que también te elimine el caracter encontrado (el último de la linea).
Cuando ya sepas la posición inicial y final de la línea en el texto, entonces puedes eliminar esa subcadena de texto de varias maneras.
Una puede ser utilizando stringmid y stringlen para dividir el texto en dos subcadenas, eliminando la subcadena de la línea que quieres quitar, y una vez eliminada volver a juntar estas dos subcadenas sin la línea.

Parece lioso pero no lo es tanto :smt002 .

Te recomiendo que peges el código y así se te podrá ayudar mucho mejor. También puedes subir el fichero de texto para poder hacer comprobaciones.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Lucho
Mensajes: 14
Registrado: 01 Ago 2009, 09:45

Re: Pregunta sencilla con listview

Mensaje por Lucho »

hola gracias, probare, mientras dejo el code entero, aunque llevo poco :smt044

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#Region ### START Koda GUI section ### Form=C:\Users\Matrix\Downloads\Parches L4D\Programas\Nuevas Versiones\ini\form4.kxf
$Form2 = GUICreate("info", 451, 403, 327, 293, BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS))
GUISetBkColor(0x4C5844)
$aceptar = GUICtrlCreateButton("Guardar", 337, 361, 97, 33, $WS_GROUP)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
GUICtrlSetFont(-1, 7, 400, 2, "verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label3 = GUICtrlCreateLabel("", 7, 31, 116, 17)
GUICtrlSetFont(-1, 8, 800, 0, "verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
$lista_view = GUICtrlCreateListView("ID|Nombre", 18, 60, 413, 292)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 60)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 349)
GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
$borrar = GUICtrlCreateButton("Borrar", 227, 362, 97, 33, $WS_GROUP)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3E4637)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


$txt_indice = FileOpen("indice.txt", 0)
While 1
    $line = FileReadLine($txt_indice)
	If @error = -1 Then ExitLoop
	$aa = StringSplit($line, "|")
	$lista = GUICtrlCreateListViewItem($aa[1]&"|"&$aa[2], $lista_view)
Wend
FileClose($txt_indice)


While 1
	$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit

			case $borrar
				_ReplaceStringInFile("indice.txt",GUICtrlRead(GUICtrlRead($lista_view)),"")
				GUICtrlDelete(GUICtrlRead($lista_view))

			case $aceptar
		EndSwitch
WEnd
y el txt mejor lo subo

http://www.pinkfloyd.cl/luchex/indice.txt

saludos, gracias!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Pregunta sencilla con listview

Mensaje por Chefito »

Vale. Según veo parece que siguen el mismo orden el control y el fichero de texto.
Sustituye esto en tu código y tienes solucionado el problema:

Código: Seleccionar todo

         case $borrar
            _FileWriteToLine("indice.txt",ControlListView($form2, "", $lista_view, "GetSelected", 1)+1,"",1)
            GUICtrlDelete(GUICtrlRead($lista_view))
Eso lo que hace es borrar la línea en el fichero de texto. Para averiguar el número de línea que está seleccionada en el listview utilizo ControlListView($form2, "", $lista_view, "GetSelected", 1). Le tengo que sumar 1 porque en la lista empieza a contra las líneas desde 0 (los items), y en el fichero desde 1.
Mira esta función en la ayuda que es muy interesante y hace varias cosas con las lista que te pueden sacar de un aprieto :smt002 .
Igualmente también tienes la udf bastante completita para listview en la ayuda.

Si no entiendes algún argumento de las funciones y quieres saber por que se pone esto o lo otro preguntalo.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Pregunta sencilla con listview

Mensaje por Ximorro »

¿¿¿Comooooor??? ¿Ese ControlListView que maneja los controles ListView32, son los mismos que creas con GUICtrlCreateListView?

¡Y yo mandando mensajes con GUICtrlSendMsg para hacer lo mismo!

Joer, al no estar en la ayuda dentro de "GUI Reference" no lo había visto, la de vueltas que le he dado y ya venia con funciones para hacerlo... :smt017
Hay que decir que queda un poco raro tratar tu propio GUI como si fuera una ventana externa para acceder al control, pero en fin...

En fin, más vale enterarse tarde que nunca :smt002
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder