elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  modificar list1
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: modificar list1  (Leído 1,869 veces)
corlo

Desconectado Desconectado

Mensajes: 120


Ver Perfil
modificar list1
« en: 4 Marzo 2020, 23:20 pm »

Hola soy corlo
modificar datos de text1,text2 a list1 del formulario 2 al formulario 1
leer datos de list1 a text1, text2 del formulario 1 al formulario 2

aqui dejo el codigo que tengo hasta ahora

en el formulario1


Código:

Private Sub Form_Load()
List1.AddItem "jorge" & "               " & "Ramirez"
List1.AddItem "luis" & "                " & "Rodriguez"
List1.AddItem "pedro" & "               " & "Gonzalez"

End Sub



Private Sub List1_DblClick()

'Form2.Text1.Text = List1.List(List1.ListIndex)

Dim i As Integer

 Form2.Text1.Text = Mid(List1.Text, 1, InStr(1, List1.Text, " ") - 1)
Form2.Text2.Text = Mid(List1.Text, InStr(List1.Text, " ") + 16)
i = List1.ListIndex
   

Form2.Show
End Sub









y en el formulario 2  esto


Código:


Private Sub Command1_Click()
 Form1.List1.List(Form1.List1.ListIndex) = Form2.Text1.Text
Form1.List1.List(Form1.List1.ListIndex) = Form2.Text2.Text
Unload Me
End Sub







no logro hacer la modificacion del formulario 2 al formulario 1
gracias



En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: modificar list1
« Respuesta #1 en: 8 Marzo 2020, 20:39 pm »

La verdad es que resulta confusa tu explicación...
Podías haber empezado por decir algo como:
en el formulario 1 hay una listbox,  un boton y ... lo que sea más...
y en el formulario 2 hay .... lo que sea,
....preferiblemente con nombres MUY distintos, para no generar confusión inecesariamente (tu luego llámalos como te dé la gana).
A veces incluso mejor un par de capturas, si son demasiados elementos termina por dejar claro el asunto.

...pués aclararía bastante cual es tu intención. Ahora mismo es un galimatías que uno tiene que interpretar y esperar a haberlo hecho correctamente. Lo que la mayor parte de las veces supone perder tiempo y es una de las razones por la que muchos decidimos pasar de contestar (mensajes ininteligibles)...

Tampoco dejas claro cual es el objetivo, solo tras 'recrear' la interfaz y el código, lo que observo es que modificas el contenido del listbox, pero ahora no contiene lo previo. De lo que deduzco que lo que intentas es 'editar un ítem' del listbox, donde cada ítem se compone de dos partes, nombre y apellido...

Si es así, tu problema es que sobrescribes una y luego otra vez, el ítem olvidando que se cada ítem se compone de '2 campos', como se aprecia en la imagen, así queda  una vez editado con el código que tienes:




Hay que decir algunas cosas, vayamos primero por la más simple:

Cada item en la lista es un string, cuando se intenta que 'contenga' varios campos de texto, resulta adecuado darle un formato, lo mínimo un separador.
Así por ejemplo, un simple espacio hubiera sido algo muy sencillo y fácil de manejar:
Código
  1. Private Sub Form_Load()
  2.    With List1
  3.        .AddItem "Jorge Ramirez Díaz"
  4.        .AddItem "Luis Rodriguez Moreno"
  5.        .AddItem "Pedro Gonzalez Granado"
  6.    End With
  7. End Sub

Luego la transferencia sus sendos textbox en el form2, es muy sencilla:
Código
  1. Private Sub List1_DblClick()
  2.    Dim i As Integer
  3.    dim txt() as string
  4.  
  5.    txt = split(list1.list(lits1.listindex), " ")
  6.    ' NOTA: al caso acomoda que los 3 textboxes del form 2 formen un array.
  7.    for i= 0 to 2    
  8.         form1.textbox1(i).text = txt(i)
  9.    next  
  10.  
  11.    call Form2.Show (vbmodal)  ' esto impide que sepueda acceder al form1 hasta que se cierre el 2.  
  12. End Sub

(nota que en el form2 ahora tenemos 3 textbox, llamados con el mismo nombre y con índices 0, 1 y 2).
Así cuando ahora pulsemos, en el botón del form2:
Código
  1. Private Sub Command1_Click()
  2.    dim item as string
  3.  
  4.    item = text1(0).text & " " & text1(1).text & " " & text1(2).text
  5.    Form1.List1.List(Form1.List1.ListIndex) = Item
  6.  
  7.    Unload Me
  8. End Sub

Con eso obtienes lo que parece que quieres.


Ahora bien, podría ser que te interese mantener algo más que un espacio de separación, entre el nombre y los apellidos o algún otro elemento añadido en cada ítem.
Se trataría entonces de prefijar un formato, por ejemplo supongamos que el apellido más grande tuviere 20 caracteres... entonces precisamos crear una función que garantice esos 20 caracteres:

Añadir un módulo y pegar esta función allí. El módulo contendrá funcionalidad que puede ser común a ambos forms y a todo el proyecto.
Código
  1. ' Funcion: Rellena con un (solo 1) carácter hasta completar el tamaño solicitado, si excede puede forzarse a cortar el sobrante.
  2. '  Parámetros:
  3. '    Valor: El dato a ser modelado.
  4. '    Size: Tamaño solicitado para la cadena devuelta.
  5. '    Delante: Señala a que lado se coloca el relleno (o en caso de sobrar, por donde se retiran).
  6. '    Relleno: Carácter que se utiliza para completar el tamaño (por defecto espacio).
  7. '    Force: Determina que si la cadena de entrada es más larga que los digitos pedidos, (por defecto) cortará el sobrante o lo devolverá tal cual llegó.
  8. '  Devuelve: una cadena con la cantidad de caracteres indicado por 'size', salvo que en origen a la entrada sea mayor y explicitamente no se haya forzado a cortar.
  9. Public Function FormatSizeString(ByRef Valor As String, ByVal Size As Byte, Optional Delante As Boolean, Optional ByVal Relleno As Byte = 32, Optional ByVal Force As Boolean = True) As String
  10.    Dim k As Integer
  11.  
  12.    k = (Size - Len(Valor))
  13.    If (k < 0) Then
  14.        If (Force = True) Then
  15.            If (Delante = True) Then
  16.                FormatSizeString = Right$(Valor, Size)
  17.            Else
  18.                FormatSizeString = Left$(Valor, Size)
  19.            End If
  20.        Else
  21.            FormatSizeString = Valor
  22.        End If
  23.    ElseIf (k > 0) Then
  24.        If (Delante = True) Then
  25.            FormatSizeString = (String$(k, Chr$(Relleno)) & Valor)
  26.        Else
  27.            FormatSizeString = (Valor & String$(k, Chr$(Relleno)))
  28.        End If
  29.    Else
  30.        FormatSizeString = Valor
  31.    End If
  32. End Function
  33.  
  34.  

Ahora es más fácil hacer que tu listbox aparezca como si estuviera compuesto por columnas... aunque falta alguna función rutinaria más (la pongo luego):
Código
  1. ' esta línea ponerla arriba del todo en el módulo 'module1', que has añadido al proyecto...
  2. private const SIZE_CAMPO as integer = 20
  3.  
  4. ' la función también va en el módulo.
  5. ' nota el 'byval en los parámetros de string...
  6. Public Function ComponerItem(ByVal Nombre As String, ByVal Apellido1 As String, ByVal Apellido2 As String) As String
  7.    Nombre = FormatSizeString(Nombre, SIZE_CAMPO)
  8.    Apellido1 = FormatSizeString(Apellido1, SIZE_CAMPO)
  9.    Apellido2 = FormatSizeString(Apellido2, SIZE_CAMPO)
  10.  
  11.    ComponerItem = Nombre & Apellido1 & Apellido2
  12. End Function
  13.  

Esta función debe llevar aparejado otra equivalente, que hace la operación contraria... deserializa el ítem en sus componentes simples:
Código
  1. ' Se da por supuesto que cada item contiene exactamente la cantidad de caracteres precisos,
  2. '  lo cual será cierto si se usó la función 'ComponerItem'.
  3. Public Sub DescomponerItem(ByRef Item As String, ByRef Nombre As String, ByRef Apellido1 As String, ByRef Apellido2 As String)
  4.    Nombre = RTrim$(Left$(Item, SIZE_CAMPO))
  5.    Apellido1 = RTrim$(Mid$(Item, SIZE_CAMPO + 1, SIZE_CAMPO))
  6.    Apellido2 = RTrim$(Right$(Item, SIZE_CAMPO))
  7. End Sub

 Veamos como quedaría ahora la carga dle formulario 1:
Código
  1.  
  2. ' ...ahora modificamos la rutina de carga:
  3. Private Sub Form_Load()
  4.    With List1
  5.        call .AddItem( ComponerItem("Jorge", "Ramirez",  "Díaz"))
  6.        call .AddItem(ComponerItem("Luis", "Rodriguez", "Moreno"))
  7.        call .AddItem(ComponerItem("Pedro", "Gonzalez", "Granado"))
  8.        .FontName = "Courier new"   ' si no se pone una fuente monoespaciada, la verticalidad de las columnas, fracasará
  9.       ' y habría que considerar el espacio ocupado por cada carácter, para añadir más o menos espacios,
  10.       ' lo cual es más complejo, lento e inexacto, pués tampoco podemos 'dibujar' en el punto exacto...
  11.       'NOTA: Haz el listbox, lo suficientemente ancho, para que sea vean todos los 'campos'.
  12.    End With
  13. End Sub

Ahora solo falta la reformular la función que toma un ítem para editarlo y la que luego devuelve el ítem editado.
Nota que seguimos delegando funcionalidad en el módulo, simpificando el código dentro de ambos forms, es mas claro y fácil de modificar a futuro, si decides un largo mayor por ejemplo para los nombres basta cambiar el valor de la constante, no hay que tocar nada más en ninguna parte.

Código
  1. Private Sub List1_DblClick()
  2.    Dim n As String, ap1 As String, ap2 As String
  3.  
  4.    Call Module1.DescomponerItem(List1.List(List1.ListIndex), n, ap1, ap2)
  5.  
  6.    With Form2
  7.        .Text1(0).Text = n
  8.        .Text1(1).Text = ap1
  9.        .Text1(2).Text = ap2
  10.        .Show vbModal
  11.    End With
  12. End Sub

Y finalmente el código del botón del form2, que transfiere el ítem editado de vuelta al listbox.
Código
  1. Private Sub Command1_Click()
  2.    Dim item As String
  3.  
  4.    item = Module1.ComponerItem(Text1(0).Text, Text1(1).Text, Text1(2).Text)
  5.    Form1.List1.List(Form1.List1.ListIndex) = item
  6.  
  7.    Unload Me
  8. End Sub

Y así queda y se ve cuando se ejecuta:



Hay una parte fea aún en el código ...la insistencia en list1.listindex...
Sería mejor declarar una variable pública en el module1:
Código
  1. public IndexItem as integer
  2.  
Al entrar al proyecto IndexItem = -1, y luego con cada click en el listbox, actualizas dicho valor, ahora no hay que referenciar cada vez al listindex del list en el form1...

Finalmente este sería el código de cada fichero con los cambios aplicados en cada uno de ellos:

Para el form1:
Código
  1. Private Sub Form_Load()
  2.    IndexItem = -1
  3.     With List1
  4.        Call .AddItem(ComponerItem("Jorge", "Ramirez", "Díaz"))
  5.        Call .AddItem(ComponerItem("Luis", "Rodriguez", "Moreno"))
  6.        Call .AddItem(ComponerItem("Pedro", "Gonzalez", "Granado"))
  7.        .FontName = "Courier new"   ' si no se pone una fuente monoespaciada, la verticalidad de las columnas, fracasará
  8.       ' y habría que considerar el espacio ocupado por cada carácter, para añadir más o menos espacios,
  9.       ' lo cual es más complejo, lento e inexacto, pués tampoco podemos 'dibujar' en el punto exacto...
  10.    End With
  11. End Sub
  12.  
  13. Private Sub List1_Click()
  14.    IndexItem = List1.ListIndex
  15. End Sub
  16.  
  17. Private Sub List1_DblClick()
  18.    Dim n As String, ap1 As String, ap2 As String
  19.  
  20.    If (IndexItem <> -1) Then
  21.        Call Module1.DescomponerItem(List1.List(IndexItem), n, ap1, ap2)
  22.  
  23.        With Form2
  24.            .Text1(0).Text = n
  25.            .Text1(1).Text = ap1
  26.            .Text1(2).Text = ap2
  27.            .Show vbModal
  28.        End With
  29.    Else
  30.        Beep ' no hay ningún ítem seleccionado
  31.    End If
  32. End Sub

Para el form2:
Código
  1. Private Sub Command1_Click()
  2.    Dim item As String
  3.  
  4.    item = Module1.ComponerItem(Text1(0).Text, Text1(1).Text, Text1(2).Text)
  5.    Form1.List1.List(IndexItem) = item
  6.  
  7.    Unload Me
  8. End Sub
  9.  

 y para el módule1:
Código
  1. Public IndexItem                As Integer
  2. Private Const SIZE_CAMPO        As Integer = 20
  3.  
  4.  
  5. ' nota el 'byval en los parámetros de string...
  6. Public Function ComponerItem(ByVal Nombre As String, ByVal Apellido1 As String, ByVal Apellido2 As String) As String
  7.    Nombre = FormatSizeString(Nombre, SIZE_CAMPO)
  8.    Apellido1 = FormatSizeString(Apellido1, SIZE_CAMPO)
  9.    Apellido2 = FormatSizeString(Apellido2, SIZE_CAMPO)
  10.  
  11.    ComponerItem = Nombre & Apellido1 & Apellido2
  12. End Function
  13.  
  14. ' Se da por supuesto que cada item contiene exactamente la cantidad de caracteres precisos,
  15. '  lo cual será cierto si se usó la función 'ComponerItem'.
  16. Public Sub DescomponerItem(ByRef item As String, ByRef Nombre As String, ByRef Apellido1 As String, ByRef Apellido2 As String)
  17.    Nombre = RTrim$(Left$(item, SIZE_CAMPO))
  18.    Apellido1 = RTrim$(Mid$(item, SIZE_CAMPO + 1, SIZE_CAMPO))
  19.    Apellido2 = RTrim$(Right$(item, SIZE_CAMPO))
  20. End Sub
  21.  
  22.  
  23. ' Funcion: Rellena con un (solo 1) carácter hasta completar el tamaño solicitado, si excede puede forzarse a cortar el sobrante.
  24. '  Parámetros:
  25. '    Valor: El dato a ser modelado.
  26. '    Size: Tamaño solicitado para la cadena devuelta.
  27. '    Delante: Señala a que lado se coloca el relleno (o en caso de sobrar, por donde se retiran).
  28. '    Relleno: Carácter que se utiliza para completar el tamaño (por defecto espacio).
  29. '    Force: Determina que si la cadena de entrada es más larga que los digitos pedidos, (por defecto) cortará el sobrante o lo devolverá tal cual llegó.
  30. '  Devuelve: una cadena con la cantidad de caracteres indicado por 'size', salvo que en origen a la entrada sea mayor y explicitamente no se haya forzado a cortar.
  31. Public Function FormatSizeString(ByRef Valor As String, ByVal Size As Byte, Optional Delante As Boolean, Optional ByVal Relleno As Byte = 32, Optional ByVal Force As Boolean = True) As String
  32.    Dim k As Integer
  33.  
  34.    k = (Size - Len(Valor))
  35.    If (k < 0) Then
  36.        If (Force = True) Then
  37.            If (Delante = True) Then
  38.                FormatSizeString = Right$(Valor, Size)
  39.            Else
  40.                FormatSizeString = Left$(Valor, Size)
  41.            End If
  42.        Else
  43.            FormatSizeString = Valor
  44.        End If
  45.    ElseIf (k > 0) Then
  46.        If (Delante = True) Then
  47.            FormatSizeString = (String$(k, Chr$(Relleno)) & Valor)
  48.        Else
  49.            FormatSizeString = (Valor & String$(k, Chr$(Relleno)))
  50.        End If
  51.    Else
  52.        FormatSizeString = Valor
  53.    End If
  54. End Function
  55.  

La siguiente imagen (compuesta) corresponde a este código en ejecución:




Puedes añadir más campos al listbox... pero si el 'ítem' del listbox se vuelve más complejo, conviene al caso mejor usar una estructura para definir cada campo, así como el tamaño de cada campo, que podría ser diferente.
NOTA: que la función que formatea el string, te lo he dejado en previsión de que formatee también textos que son números, indicando el lado donde añadir a la izquierda y el carácter '0' y luego si se quiere añadir espacios a su derecha (una segnda llamada).

Y si además la edición de cada campo es muy diferente, podría entonces usarse una clase en vez de un módulo.
La clase representaría un ítem del listbox, donde al pulsar en el listbox, transfiere dicho ítem a una clase, (no solo sus datos, también el índice que ocupa) y abre el form 2 que recibe una referencia a la clase, y durante su evento 'load', transfiere los datos d ela clase a la interfaz de edició que proporciona el form2, el botón deberían ser 2 botones uno aceptar y otro cancelar, ambos cierran  el form2 cuando se pulsen, la diferencia es que el 'aceptar' coloca de regreso los datos actuales en la clases, y en retorno, el form1 detecta si hubo cambios (una variable llamada así 'Changed = TRUE cuando se pulsa el botón 'Ok' y que se pone a Changed = FALSE cuando se carga el form2, detecta si hubo cambios y e n tal caso actaliza el ítem del listbox.
Más aún, dicha clase podría contener la posibilidad de 'añadir un ítem nuevo inexistente, abriendo el form con valores por defecto (en el caso de nombre y apellidos vacíos, pero si hay números, alguno podría tener cierto valor de entrada prefijado... por ejemplo si hubiere días de la semana, proveer un combobox, donde por defecto el día seleccionado fuere el Lunes (u otro según el caso).


« Última modificación: 8 Marzo 2020, 21:00 pm por NEBIRE » En línea

corlo

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: modificar list1
« Respuesta #2 en: 9 Marzo 2020, 20:30 pm »

Hola soy corlo

Gracias nebire por la informacion

tema resuelto
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] en List1.AddItem « 1 2 »
Programación Visual Basic
NsTeam 14 5,559 Último mensaje 26 Agosto 2009, 02:02 am
por h0oke
vb modificar datos list1 a archivo random txt
Programación Visual Basic
corlo 2 2,416 Último mensaje 8 Septiembre 2015, 21:04 pm
por corlo
sumar datos list1
Programación Visual Basic
corlo 6 2,909 Último mensaje 17 Enero 2016, 16:38 pm
por corlo
pasar informacion de list1 a list2
Programación Visual Basic
corlo 2 3,320 Último mensaje 27 Febrero 2019, 20:27 pm
por corlo
descontar valor en list1 de la columna 3
Programación Visual Basic
corlo 0 1,774 Último mensaje 24 Febrero 2021, 00:42 am
por corlo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines