Ver Mensaje Individual
  #17 (permalink)  
Antiguo 13/04/2010, 12:53
Avatar de erbuson
erbuson
 
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Importar de un .dat o txt a MSFlexGrid

Bueno, intentaré comentarte las dudas, ya que inicialmente te comenté de crear las funciones multiuso y parece que te confundió un poco.

En primer lugar los valores intermedios en un Type están ya declarados y no es necesario volver a hacerlo, es mas, no se puede.

Yo utilizó en todos mis programas archivos random y acostumbro a crear una Rutina de control del Archivo como la Siguiente, supongamos que tengo un archivo llamado Clientes, entonces haría mas o menos:

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Type CamposClientes
  4.   Codigo As String * 10
  5.   Nombre As String * 40
  6.   Domicilio As String * 40
  7.   Poblacion As String * 40
  8.   ' Posiciones disponibles en el Registro. Con esto consigo la longitud deseada, por ejemplo 256
  9.  Libres As String * 126
  10. End Type
  11.  
  12. Dim RegistroClientes As CamposClientes
  13.  
  14. Sub FicheroClientes(Opcion As String, Registro As Single)
  15.   ' Variable de número de Fichero. Estática para guardarla en la Rutina.
  16.  Static Numero As Integer
  17.   ' Si Número = Cero el archivo no está abierto. Lo asignamos y Abrimos.
  18.  If Numero = 0 Then
  19.     Numero = FreeFile
  20.     Open "CLIENTES.DAT" For Random As #Numero Len = 256
  21.   End If
  22.  
  23.   Select Case LCase(Opcion)
  24.     Case Is = "leer"
  25.       ' Si pido un registro que no está en el fichero o Registro = 0 devolvemos Registro = -1
  26.      If Registro = 0 Or Registro > LOF(Numero) / 256 Then
  27.         Registro = -1
  28.         Exit Sub
  29.       End If
  30.       Get #Numero, Registro, RegistroClientes
  31.      
  32.     Case Is = "grabar"
  33.       ' Si no indico número de registro, añadirá al final. Si se le indica lo actualizará
  34.      If Registro = 0 Then Registro = LOF(Numero) / 256 + 1
  35.       Put #Numero, Registro, RegistroClientes
  36.    
  37.     Case Is = "cerrar"
  38.       Close #Numero
  39.       Numero = 0
  40.      
  41.     Case Is = "registros"
  42.       ' Devuelve en Registro el número de Registros que contiene el fichero
  43.      Registro = LOF(Numero) / 256
  44.      
  45.   End Select
  46.  
  47. End Sub

Analiza este código y veras que resulta muy simple y personalmente lo considero práctico.

Por ejemplo, necesito hacer un bucle que me lea todos los registros, puedo hacer dos cosas.

FicheroClientes "registros", Registros
For Registro = 1 to Registros
FicheroClientes "leer", Registro
' Procesar el registro leido
Next

o tambien puedo hacer
Do
Registro=Registro + 1
FicheroClientes "leer", Registro
If Registro = -1 Then Exit do
' Procesar el registro leido ya que tienes acceso a sus valores
Loop

Depende de ti, en el primer caso puedes poner una barra de progreso tal que así

FicheroClientes "registros", Registros
Barra.Min = 1
Barra.Max = Registros
For Registro = 1 to Registros
FicheroClientes "leer", Registro
Barra.Value = Registro
' Procesar el registro leido
Next


Lógicamente cuando quieras puedes hacer RegistroClientes "cerrar", 0 ' El cero es necesario porque el parámetro no se ha definido como opcional

Si se hubiera definido

Sub FicheroClientes(Opcion As String, Optional Registro As Single)

podrías cerrarlo así RegistroClientes "cerrar"




Nos vemos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...