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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


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

Desconectado Desconectado

Mensajes: 65


Ver Perfil
pasar informacion de list1 a list2
« en: 26 Febrero 2019, 19:27 pm »

hola soy corlo
tengo un pequeño problema a la hora de pasar informacion de un archivo de texto de list1, y que vaya leyendo cada dia en list2.
en list1 hay lo siguiente:
list1
11/12/2018
12/12/2018
13/12/2018
en el list2 hay losiguiente:

en el dia 11/12/2018

1       11/12/2018                a
1       11/12/2018                b
1       11/12/2018                c
4       11/12/2018                d
5       11/12/2018                e

en dia 12/12/2018

5       12/12/2018                f
7       12/12/2018                g
8       12/12/2018                h
9       12/12/2018                i

en dia 13/12/2018

10      13/12/2018               o
11      13/12/2018               p
12      13/12/2018               s

Código:

Option Explicit
Dim n As Integer
Dim c As Integer


Private Sub Command1_Click()
Unload Me
Form1.Show
End Sub


Private Sub Form_Load()
List1.Clear
Open App.Path & "\database.txt" For Random As 1 Len = Len(file)
n = LOF(1) / Len(file)
c = 1
For c = 1 To n


Get #1, , file

List1.AddItem file.date
QuitaDup
Next
Close #1
End Sub
Private Sub QuitaDup()
  Dim i As Long, X As Long
  X = List1.ListCount - 1
  For i = 0 To List1.ListCount - 2
    If List1.List(i) = List1.List(X) Then
     
      List1.RemoveItem X
     
      Exit For
    End If
  Next i
End Sub

Private Sub List1_Click()
Dim i As Integer
Dim ind As Integer
List2.Clear
Form1.Text1.Text = file.id
Form1.Text2.Text = file.date
Form1.Text3.Text = file.name
ind = List1.ListIndex
Open App.Path & "\database.txt" For Random As 1 Len = Len(file)
n = LOF(1) / Len(file)
For i = 0 To List1.ListCount + 1
If ind <= 0 Then
Get #1, i + 1, file

List2.AddItem file.id & "         " & file.date & "          " & file.name
End If
Next
Close #1
End Sub





y en list2 solamente me lee el primer dia
que la rutina es en list1_click
y quisiera que me lea el primer dia el segundo dia y el tercer dia.
gracias.



En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil
Re: pasar informacion de list1 a list2
« Respuesta #1 en: 27 Febrero 2019, 16:25 pm »

Con una descripción tan vaga como esta:
Citar
...problema a la hora de pasar informacion de un archivo de texto de list1, y que vaya leyendo cada dia en list2. en list1...
Es dífícil entender que rayos quieres. Los nombres de los controles, expresan con claridad su cometido: command1, List1, list2, perfecto... El código tampoco ayuda es enrevesado y faltan descripciones... como... dónde está declarado 'file', que tipo de objeto es... tal vez una imagen de la interfaz, como apoyo al código dejara más claro las cosas.

Intentaré jugar al maldito juego de adivinar que intenta uno decir, con el omnipresente riesgo de equivocarse al interpretar y simplemente estar perdiendo el tiempo.

Se supone que tienes un fichero de texto que guarda no se qué cosas (parecen registros de fechas)... que al iniciarse el programa se cargan en un listado (list1), y hasta aquí puedo entender... ahora me toca copiar el código y pegarlo en el editor de vb6, a ver si con el coloreado y resaltado de la sintaxis, se ve más claro y que controles utiliza y deducir el resto de objetos que no aparecen declarados en parte alguna en el código...

(por cierto siempre que peques código de un lenguaje específico en un foro de programación usa las etiquetas BBcode de código Geshi (es un combobox arriba a la derecha en la ventana de edición), para resaltar la sintaxis imperfecta pero más asequible que texto plano y sin indentar procedente de un copy-paste. Creas la eqiqueta y pegas el código, o si ya pegaste el código, lo seleccionas y luego eliges la etiqueta, (el volverá a todo lo seleccionado).

Mal vamos... file parece ser una estructura, pero nada se sabe acerca de sus campos donde se crea la instancia, ni qué datos se le asigna...
En fin, todo lo que puedo hacer sin tener claro el objetivo es refactorizar lo que se supone que hace el código:

Primero lo que puede deducirse del código, sobre lo que es 'file'
Código
  1. Private Type FileData
  2.    Id              As Integer          ' o quizás un string
  3.    Date            As Date
  4.    Name            As String * 20      '  longitud desconocida suponemos 20 como ejemplo.
  5.    '... otros campos que pudiere haber.
  6. End Type
  7.  
  8. Private file        As FileData
  9. Private Ruta        As String
  10. Private f_Canal     As Integer      ' canal del fichero.
  11.  


Añade un módulo, se coloca la siguiente función Main, y en el menú Proyecto --> "propiedades de proyecto" ---> Objeto inicial: SE DEBE SEÑALAR que el proyecto comienza en "sub Main", no en "form1"
Código
  1. public Cerrar as boolean
  2.  
  3. private sub Main
  4.   dim f as form
  5.  
  6.    do
  7.        set f= new Form1
  8.        f.show 1  ' se abre un modo diálogo... (el código no continúa en la siguiente línea mientras no acabe (se cierre), el proceso iniciado.
  9.    loop while Cerrar = false
  10. end sub

Ahora el botón reset (llamado como la función que realiza)
Código
  1. Private Sub ComReset_click    'Command1_Click()
  2.    Unload Me
  3. End Sub

Y un botón para cerrar definitivamente la aplicación (también con un nombre descriptivo):
Código
  1. Private Sub ComTerminar_click  
  2.    Cerrar = true
  3.    Unload Me
  4. End Sub

Lo que seguía en la carga de la aplicación era tremendo, al margen de lo farragoso del código. Y la eliminación de duplicados exige un tiempo O n²...
Esto queda mucho mejor así:
Código
  1. Private Sub Form_Load()
  2.    ' no cambia durante la ejecución del programa, luego procede asignarla una sola vez.
  3.    ' el fichero también se abrirá una sola vez y se cerrará cuando lo haga la ventana (una sola vez durante la vida de la ventana).
  4.    Ruta = App.Path & "\database.txt"  
  5.    Call CargarYFiltrarRegistros(Ruta)
  6. End Sub
  7.  
  8. ' Carga el campo fecha de los registros en el listado de fechas (sin repticiones).
  9. Private Sub CargarYFiltrarRegistros(ByRef Ruta As String)
  10.    Dim k As Long, d As String
  11.  
  12.    ' Abrir fichero y cargar datos
  13.    f_Canal = FreeFile
  14.    Open Ruta For Binary As #f_Canal
  15.    Do
  16.        Get #f_Canal, , file                 ' file es una estructura de tamaño fijo, no es preciso complicalro más...
  17.        lisFechas.AddItem cstr(file.Date)
  18.    Loop While Not EOF(f_Canal)
  19.    'Close #f_Canal   ' no lo cerramos si luego se va a brir contínuamente desde list1_click
  20.  
  21.    '   OJO: La lista debe estar ordenada en tiempo de diseño, pués la propiedad 'SORTED'
  22.    '    es de solo lectura en tiempo de ejecución...
  23.    '    ES DECIR: en tiempo de diseño hay que poner: Sorted = True, para dicho listado.
  24.    ' filtrar repes (empezamos desde el último hacia abajo)
  25.    k = lisFechas.ListCount - 1
  26.    Do While (k > 0)
  27.        d = lisFechas.List(k)
  28.        k = (k - 1)
  29.         ' mientras sean iguales indistintamente de su capitalización.
  30.        Do While (StrComp(d, lisFechas.List(k), vbTextCompare) = 0)
  31.            lisFechas.RemoveItem (k)
  32.            If (k = 0) Then Exit Do
  33.            k = (k - 1)
  34.        Loop
  35.    Loop
  36. End Sub

Ahora la gran duda de todo, que es lo que no has explicado ni siquiera meridianamente bien: qué C0Ñ0 se supone que debe hacer cuando se pulsa un ítem en list1?????  (al list1, yo lo llamo lisFechas)
Yo he pretendido entender que el dato que aloja sirve para buscar otros con el mismo dato (para el mismo campo, a la sazón 'fecha') y carga todos los ítems así coincidentes en el listado2, procedentes del fichero...

Y eso es lo que hace el siguiente código, si debe hacerse otra cosa, lo siento pero jugando a divinar, es lo que pasa... perder el tiempo, porque no sirve lo que uno hizo...
Código
  1. Private Sub List1_Click()
  2.    Call BuscarItems(lisFechas.List(lisFechas.ListIndex))
  3. End Sub
  4.  
  5. ' Qué buscamos?: El dato (fecha), que se ha pulsado en list1...
  6. '  y lo buscamos en todos los registros del fichero.
  7. Private Sub BuscarItems(ByVal strFecha As String)
  8.    Dim item As String
  9.  
  10.    List2.Clear
  11.    ' a falta de código no expuesto, 'FILE' tendrá el contenido del último regsitro leído...
  12.    '  Seguro que es eso lo que se pretende???.
  13. '    With file
  14. '        Text1.Text = CStr(.Id)
  15. '        Text2.Text = CStr(.Date)
  16. '        Text3.Text = CStr(.Name)
  17. '    End With
  18.  
  19.    Seek (f_Canal), 1     ' posicionar el puntero de lectura al comienzo del fichero (en vb6 es la dirección 1).
  20.    Do While Not EOF(f_Canal)
  21.        Get f_Canal, , file
  22.        With file
  23.            If (StrComp(strFecha, CStr(.Date), vbTextCompare) = 0) Then
  24.                item = FormatStr(CStr(.Id), 6, True)
  25.                item = FormatStr(item, 12) & _
  26.                       FormatStr(CStr(.Date), 16) & _
  27.                       FormatStr(.Name, 24)
  28.                Call List2.AddItem(item)  ' list2, probablemente no precise estar ordenado...
  29.            End If
  30.        End With
  31.    Loop
  32. End Sub
  33.  

Finalmente faltan algunas funciones que mejoren la presentación y simplifique la llamada:
Estas 3 funciones se pueden simplificar en la primera... yo te lo dejo fácil de entender, luego readaptarlo por eficiencia es cosa tuya.
Código
  1. ' Asegura que el texto tenga por tamaño exactamente el valor de límite
  2. Private Function FormatStr(ByRef Txt As String, ByVal Limite As Integer, Optional ByVal EsNumero As Boolean = False)
  3.    If EsNumero Then
  4.        FormatStr = FormatNumber(Txt, Limite)
  5.    Else
  6.        FormatStr = FormatString(Txt, Limite)
  7.    End If
  8. End Function
  9.  
  10. ' Asegura que el texto tenga por tamaño exactamente el valor de límite
  11. ' Si es más corto añade espacios a la derecha.
  12. Private Function FormatString(ByRef Txt As String, ByVal Limite As Integer) As String
  13.    Dim k As Integer
  14.  
  15.    k = Len(Txt)
  16.    k = (Limite - k)
  17.    If (k > 0) Then
  18.        FormatString = Txt & Space$(k)
  19.    ElseIf (k < 0) Then
  20.        FormatString = Left$(Txt, Maximo)
  21.    Else
  22.        FormatString = Txt
  23.    End If
  24. End Function
  25.  
  26. ' Asegura que el texto tenga por tamaño exactamente el valor de límite
  27. ' OJO: Si es más corto añade 'ceros' a la izquierda.
  28. Private Function FormatNumber(ByRef Txt As String, ByVal Limite As Integer) As String
  29.    Dim k As Integer
  30.  
  31.    k = Len(Txt)
  32.    k = (Limite - k)
  33.    If (k > 0) Then
  34.        FormatNumber = String$(k, "0") & Txt
  35.    ElseIf (k < 0) Then
  36.        FormatNumber = Left$(Txt, Limite)
  37.    Else
  38.        FormatNumber = Txt
  39.    End If
  40. End Function
  41.  

Por supuesto, no he probado nada, ya que no quiero perder más tiempo en ello, estoy casi seguro que está todo bien o si hay algún gazapo que se me haya escapado, considero que debes ser capaz de resolverlo, ya que será allgo nimio.

Si no terminas de entenderlo y tampoco terminas de explicarte bien, quizás mejor si comprimes el proyecto y lo compartes para verlo y corregirlo in situ con el fichero de ejemplo que adjuntes.

p.d.: Se me olvidaba esta sección:
Código
  1. Private Sub Form_Unload(Cancel As Integer)
  2.    Close ' cierra todos los ficheros abertos.
  3. End Sub


« Última modificación: 27 Febrero 2019, 16:38 pm por NEBIRE » En línea

corlo

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Re: pasar informacion de list1 a list2
« Respuesta #2 en: 27 Febrero 2019, 20:27 pm »

hola soy corlo

gracias por la  informacion
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pasar siempre informacion por GET
PHP
XafiloX 6 2,198 Último mensaje 7 Agosto 2009, 17:32 pm
por SnakeDrak
[DUDA] en List1.AddItem « 1 2 »
Programación Visual Basic
NsTeam 14 3,734 Último mensaje 26 Agosto 2009, 02:02 am
por h0oke
sumar datos list1
Programación Visual Basic
corlo 6 1,403 Último mensaje 17 Enero 2016, 16:38 pm
por corlo
descontar valor en list1 de la columna 3
Programación Visual Basic
corlo 0 382 Último mensaje 24 Febrero 2021, 00:42 am
por corlo
Guardar list2 y leer list1 « 1 2 3 »
Programación Visual Basic
corlo 20 1,806 Último mensaje 28 Diciembre 2021, 01:45 am
por BlackZeroX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines