Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Importar de un .dat o txt a MSFlexGrid

Estas en el tema de Importar de un .dat o txt a MSFlexGrid en el foro de Visual Basic clásico en Foros del Web. hola! Tengo una consulta, tengo un archivo de datos.dat o datos.txt y quisiera rellenar un MSFlexGrid con algunos datos de ese archivo para una vez ...

  #1 (permalink)  
Antiguo 10/04/2010, 12:41
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Importar de un .dat a MSFlexGrid con archivos random

hola!

Tengo una consulta, tengo un archivo de datos.dat o datos.txt y quisiera rellenar un MSFlexGrid con algunos datos de ese archivo para una vez se me habra la ventana se me visualicen en el MSFlexGrid. El problema es que encuentro información de exportar a txt, excel, acces etc. pero de importar y de como se hace para MSFlexGrid no encuentro nada, mi idea es via RANDOM hacerlo pero no se si es posible y como.
Puede alguien echarme una manita y decirme como hacerlo, ante todo quisiera aprender ya que codigo siempre va bien pero si no se que hace, me quedo igual que al principio.
Otro tema dentro del MSFlexGrid veo 1001 funcion, etc. por ejemplo la MSFlexGrid#.TextMatrix(#,#) he leido que rellena la celda especificada pero ¿como se hace con esta función? entre el :
Código vb:
Ver original
  1. Private Sub Form_Load()
  2.  
  3. End Sub

o
Código vb:
Ver original
  1. Private Sub MSFlexGrid#_Click()
  2.  
  3. End Sub

Porque en cada una, con un For/next, etc. ¿Hay algun comando sentencia ligada a eso para funcionar? ya que no encuentro informacion que me lo explique.

Un saludo

Última edición por XYON126; 14/04/2010 a las 01:27
  #2 (permalink)  
Antiguo 10/04/2010, 13:41
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Importar de un .dat o yxy a MSFlexGrid

Hola:

Por lo que veo y por tus últimos mensajes, estás muy decidido con el MsFlexgrid y puedo decirte que lo lo utilizo siempre y le encuentro pocos inconvenientes.

En primer lugar, te aconsejaría que vayas creando algunas rutinas reutilizables para que te simplifiquen el proceso con el mismo.

Supongo que tienes claro que las rutinas Publicas debes incluirlas juntas en un Módulo.

Por ejemplo podrías tener:

1) Poner el título en una Columna, dimensionar su ancho, determinar si se ajustará a la izquierda, derecha o centro.

2) Poner el dato en la celda indicada.

¿ Porque tener estas rutinas ? Pues porque dentro de ellas puedes ir controlando errores que no tendrás que controlar en cada sentencia, mejorarlas poco a poco, mejorando así todo el código con un simple arreglo.

Te indico el principio, TU lo analizas, lo estudias, lo pruebas, lo mejoras y comentas.

Crea por ejemplo un Modulo con el nombre SubGrid y empiezas con la rutina:

Código vb:
Ver original
  1. Public Sub GridCabecera(Grid As MSFlexGrid, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
  2.   ' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
  3.  If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
  4.   Grid.ColWidth(Columna) = AnchoTwips
  5.   Select Case UCase(Ajuste)
  6.     Case "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
  7.    Case "D": Grid.ColAlignment(Columna) = 7 ' Derecha
  8.    Case "C": Grid.ColAlignment(Columna) = 4 ' Centro
  9.  End Select
  10.   Grid.Row = 0
  11.   Grid.Col = Columna
  12.   Grid.CellAlignment = 4                     ' Título siempre Centrado
  13.  Grid.Text = Titulo
  14. End Sub

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2.   ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  3.  If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  4.   Grid.TextMatrix(Fila, Columna) = Dato
  5. End Sub

Ya puedes poner un MsFlexgrid en el proyecto y empezar a probar.

Nos leemos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 10/04/2010, 14:07
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o yxy a MSFlexGrid

Hola erbunson!

Muchas gracias de antemano. Como comentas pues si, lo poco que se de VB hay comandos que me gustan y los veo mas utiles que otros que hacen lo mismo o similar, igual que lo del RANDOM que comentabamos en post anteriores, soy de la opinion que lo que se realice dentro mejor que sacar afuera (a otros programas) si se puede evitar.Lo malo es que la información que corre tanto por internet como la propia de Microsoft es muy extensa pero en ocasiones muy difusa o poco clara y didactica y si no es por vosotros los novatos vamos perdidos.

Voy a pelearme y como bien dices a prepararme Modulos que los voy a necesitar y mucho.

Un saludote

Última edición por XYON126; 10/04/2010 a las 14:20
  #4 (permalink)  
Antiguo 10/04/2010, 14:33
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o yxy a MSFlexGrid

Cita:
Iniciado por erbuson Ver Mensaje
Hola:

Supongo que tienes claro que las rutinas Publicas debes incluirlas juntas en un Módulo.

Por ejemplo podrías tener:

1) Poner el título en una Columna, dimensionar su ancho, determinar si se ajustará a la izquierda, derecha o centro.

2) Poner el dato en la celda indicada.

Crea por ejemplo un Modulo con el nombre SubGrid y empiezas con la rutina:

Código vb:
Ver original
  1. Public Sub GridCabecera(Grid As MSFlexGrid, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
  2.   ' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
  3.  If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
  4.   Grid.ColWidth(Columna) = AnchoTwips
  5.   Select Case UCase(Ajuste)
  6.     Case "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
  7.    Case "D": Grid.ColAlignment(Columna) = 7 ' Derecha
  8.    Case "C": Grid.ColAlignment(Columna) = 4 ' Centro
  9.  End Select
  10.   Grid.Row = 0
  11.   Grid.Col = Columna
  12.   Grid.CellAlignment = 4                     ' Título siempre Centrado
  13.  Grid.Text = Titulo
  14. End Sub

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2.   ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  3.  If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  4.   Grid.TextMatrix(Fila, Columna) = Dato
  5. End Sub
Hola erbunson!

Despues de analizarlo por lo que veo y creo (corrigeme si me equivoco) ambas rutinas las he de incluir en un solo "Modulo" y adaptarmelas o mejorarlas como dices y si puedo; pero en la primera veo que es para el tema visual y diseño del MSFlexGrid, en cambio la otra es para entrar datos en la celda y aqui es donde me viene la duda, esa es solo para una celda, entiendo que si la pongo en un modulo en el proyecto he de crear un bucle de lectura del archivo .dat o .txt con RANDOM (Get y Put) e introducirlo en la variable "Dato" y asi celda por celda, ¿Es asi? como en mi caso no hay commandButton sino que lee los datos directamente de un archivo y los mete en la grilla todo lo debo de tener en el "Private Sub Form_Load()", ¿es esto asi?

Muchas gracias
  #5 (permalink)  
Antiguo 10/04/2010, 15:10
Avatar de 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

Efectivamente, veo que captas la idea, debes introducir los datos a traves de un bucle, tanto para crear la cabecera como para pasar los datos, por ejemplo:

Código vb:
Ver original
  1. ' Crear Cabeceras
  2. GridCabecera Grid, 0, 800, "Codigo", "D"
  3. GridCabecera Grid, 0, 2800, "Descripción", "I"
  4. GridCabecera Grid, 0, 800, "Unidades", "D"
  5. GridCabecera Grid, 0, 800, "Precio", "D"
  6.  
  7. ' En un Bucle de lectura del Fichero
  8.  
  9. ' Leer Registro
  10. Fila = Fila + 1
  11. GridPonerDato Grid, Fila, 0, DatoLeido
  12. GridPonerDato Grid, Fila, 1, DatoLeido
  13. GridPonerDato Grid, Fila, 2, DatoLeido
  14. GridPonerDato Grid, Fila, 3, DatoLeido
  15. ' Volver al Bucle

Es la idea
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #6 (permalink)  
Antiguo 11/04/2010, 03:55
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Cita:
Iniciado por erbuson Ver Mensaje
Efectivamente, veo que captas la idea, debes introducir los datos a traves de un bucle, tanto para crear la cabecera como para pasar los datos, por ejemplo:

Código vb:
Ver original
  1. ' Crear Cabeceras
  2. GridCabecera Grid, 0, 800, "Codigo", "D"
  3. GridCabecera Grid, 0, 2800, "Descripción", "I"
  4. GridCabecera Grid, 0, 800, "Unidades", "D"
  5. GridCabecera Grid, 0, 800, "Precio", "D"
  6.  
  7. ' En un Bucle de lectura del Fichero
  8.  
  9. ' Leer Registro
  10. Fila = Fila + 1
  11. GridPonerDato Grid, Fila, 0, DatoLeido
  12. GridPonerDato Grid, Fila, 1, DatoLeido
  13. GridPonerDato Grid, Fila, 2, DatoLeido
  14. GridPonerDato Grid, Fila, 3, DatoLeido
  15. ' Volver al Bucle

Es la idea
hola erbunson!

Aqui hay dos puntos que me despistan, uno en "Crear Cabeceras o Leer Registro " en una de las lineas cualquiera pones esto :

GridCabecera Grid, 0, 800, "Codigo", "D"
GridPonerDato Grid, Fila, 0, DatoLeido


si mi MSFlexGrid se llama MSFlexGrid1 y la orden de insertar un dato en la 1º linea, 1º columna del grid es.:

MSFlexGrid1.TextMatrix(0,0)

lo que no entiendo es tu linea por completo, pues "Fila" supongo es una variable llamada Fila, "0" seria la columna 0 y "DatoLeido" seria otra variable con el dato leido, pero ¿Donde esta el .TextMatrix() y en cabecera¿ que es el "800"?

Si no es mucho pedir, por que no me pones una liea de codigo teniendo en cuenta que en el archivo Datos.dat hay tres datos a leer que son : Horainicio, Horafin y Totalhoras esas serian las tres variables y datos a leer y escribir en una columna de tres filas y la columna es la 2ª por la izquierda y no tiene cabecera púes la cabecera es un Label.

Yo haria el codigo para visualizar asi, corrigemelo si esta mal, gracias.(He tenido en cuenta el modulo tal como lo escribistes por si es aqui donde se crean mis dusdas).

Código vb:
Ver original
  1. Private Sub Form_Load()
  2.  
  3. Dim Horainicio As Integer
  4. Dim Horafin As Integer
  5. Dim Totalhoras As Integer
  6.  
  7. 'Aqui llamamos al modulo SubGrid
  8.  
  9. Dim lcdTest As New SubGrid
  10.  
  11. 'Lee del fichero en el registro posicionado y almacena los datos _
  12. en la la variable UDT
  13. Get #FileFree, RegActual, cliente
  14.  
  15. ' Asignamos los datos a las variables de visualización.
  16.        With cliente
  17.  
  18.         .Horainicio = Trim(cliente.Horainicio)
  19.         .Horafin = Trim(cliente.Horafin)
  20.         .Totalhoras = Trim(cliente.Totalhoras)
  21.  
  22.         End With
  23.  
  24. VisualizarDatos
  25.  
  26. End Sub
  27.  
  28. Private Sub VisualizarDatos()
  29.  
  30. 'Lee del fichero en el registro posicionado y almacena los datos _
  31. en la la variable UDT
  32. Get #FileFree, RegActual, cliente
  33.  
  34. ' Mostramos los datos
  35.  
  36.  
  37. MSFlexGrid1.TextMatrix(0,0) = .Horainicio
  38. MSFlexGrid1.TextMatrix(1,0) = .Horaifin
  39. MSFlexGrid1.TextMatrix(2,0) = .Totalhoras
  40.  
  41. End Sub

erbunson si me comentas como se puede insertar una imagen en un post te podre poner una imagen del proyecto para mas comprension de lo que estoy intentando.

Saludo2
  #7 (permalink)  
Antiguo 11/04/2010, 04:54
Avatar de 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

Hola, veo que andas un poco perdido, intentaré aclararte en primer lugar el tema de los módulos para que comprendas mas fácilmente las llamadas posteriores a las rutinas reutilizables.

El hecho de crear dos rutinas GridCabecera y GridPonerDato en un módulo es para que resulte mas fácil efectuar las operaciones sobre el grid, ya que de lo contrario puedes necesitar con cada celda efectuar varios procesos repetitivos.

Cuando repites mucho un código lo mejor es crear un Sub o una Function reutilizable para no tener que reescribir siempre el mismo código.

Pero vamos con el tema módulos, un módulo no se tiene que llamar de ninguna manera como tu haces en el load. El módulo contiene Funciones y Subs que pueden ser llamados desde cualquier punto del programa, incluso puede tener variables compartidas por todos los Formularios del programa.

Si vas a la opción de menú Proyecto, veras que puedes añadir muchas cosas diferentes, vayamos por partes ya que estas empezando, por Formulario y Módulo.

Formulario ya sabes lo que es, cada Proyecto puede tener muchos formularios diferentes y además muchos módulos diferentes.

Selecciona Proyecto - Agregar Módulo - Nuevo (Abrir)

Pegas en el las dos Subs que hemos estado tratando y de este modo podrás comprobar cuando vayas a escribir código dentro del Formulario que por ejemplo cuando escribas dentro del Load:
GridCabecera vas a ir visualizando las distintas opciones. Ten en cuenta que se puede hacer de dos maneras, una es tal como yo lo he puesto y otra es con el Call delante y los parámetros entre paréntesis, o sea:

CALL GridCabecera (Grid, 0, 800, "Codigo", "D")

Evidentemente cuando tu llames a GridCabecera por lo que me indicas, deberas hacer:

GridCabecera MsFlexgrid1, LaColumna, ElAncho, ElTitulo, ElAjuste

Como ves, si lo comprendes la ventaja es que si tienes 2 o 3 grids o Grids en distintos formularios, puedes utilizar facilmente el código sin tener que volver a escribirlo.

Intenta comprender esto y después continuamos.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #8 (permalink)  
Antiguo 11/04/2010, 11:25
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Si, tienes razon estoy perdido llevo 2 semanas con el VBasic y me esperaba me seria mas facil comprenderlo de lo que realmente me lo he encontrado, he realizado muchas pruebas con rutinas faciles, ves que te salen y cometes el gran error que crees que ya lo sabes todo y te lanzas a un proyecto aunque propio y como hobby, pero mas grande de lo que creia, aunque no me desespero pues cuando lo finalice, creo me defendere bastante bien con el VB.
Bueno vallamos al grano, tema Modulos por lo que comentas los modulos no son necesarios declararlos; en un programilla de un reloj, el que realizo el codigo genero un Modulo de clase que lo que realizaba era traducir los números a vision LCD y este modulo lo declaraba al principio en el "Option Explicit" como si fuese una variable y para traducir el número a LCD solo ejecutaba la sentencia "variable.Caption = variablenúmero, en nuestro caso ¿No es lo mismo? por otro lado el codigo de las dos rutinas tal como las veo ¿No hay que declararlas de alguna manera? es que no veo ningun Dim o Private sub, soy muy cazurro por eso no lo entiendo muy bien, es que como no veo ningun .TextMatrix, etc tampoco y tanto esta sentencia :

Código vb:
Ver original
  1. GridCabecera MsFlexgrid1, LaColumna, ElAncho, ElTitulo, ElAjuste

como esta

Código vb:
Ver original
  1. GridCabecera Grid, 0, 800, "Precio", "D"

o esta

Código vb:
Ver original
  1. GridPonerDato Grid, Fila, 0, DatoLeido

solo veo variables y datos separados por comas (es la primera vez que lo veo) me despista y desconcetra, por aquello de no me reclame o diga el VB variable no definida.

Como comentaba al principio del post, al no encontrar referencia alguna de como realizarlo y solo programillas ya finalizados y sin decirte el porque me emperro en buscar similitudes con lo poco que conozco y no se si es aqui donde estoy metiendo la pata, espero me comprendas.

Muchas gracias por tu ayuda es inmensa a ver si consigo entenderlo.

Saludos,
  #9 (permalink)  
Antiguo 11/04/2010, 11:48
Avatar de 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

Efectivamente las rutinas y funciones declaradas en los módulos no necesitas declararlas en el formulario que las vas a utilizar, sólo debes tener en cuenta que deben estar definidas Public para que sean compartidas.

Por otra parte, es diferente un módulo de clase como dices que utilizaste que un módulo .bas que contiene rutinas y funciones.

Por otra parte al crear el módulo deberás incluir dentro de este las dos rutinas que te puse como ejemplo y que son las que contienen las sentencias TextMatrix que estas buscando.

Si el tema del módulo te lo está complicando, podemos empezarlo de otra manera ya que el código que te dejé lo puedes incluir dentro del código de formulario normal y cuando lo entiendas ya lo pasarás a un módulo para poder compartirlo con otros proyectos si es necesario.

Como puedes comprobar las dos están declaradas como Public por lo que después será muy fácil pasarlas a módulo.

Cuando quieras estoy a la espera de tus comentarios.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #10 (permalink)  
Antiguo 11/04/2010, 11:56
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Comentas que las sentencias tuyas tienen incluido el TextMatrix ¿Donde?, por lo de lo de los Modulos para declarar un Modulo publico he de ponerle en la cabecera el "Opton explicit" ¿Es asi? aunque desearia dejarlos para mas tarde.

Por otro lado y como bien dices,es ir pasito a pasito, por eso desearia ir creando el codigo para poderme dar de ostias y aprender con los errores. La aplicación que estoy intentando hacer tiene un archivo de datos externo "Datos.dat" en el que inicialmente puede solo tener un registro pero dia a dia va aumentando o no, el tema es, este formulario de este MSFlexGrid solo tiene 49 celdas 7x7 que corresponden las columnas a los siete dias de la semana y las siete filas, son tres de entradas, tres de salidas y la ultima el total de horas activas, pero existen tres problemas uno no siempre se empieza en Lunes o finaliza en domingo, no siempre se realizan los dias consecutivos y ultimo problema no siempre en un mismo dia se hacen las tres entradas pueden ser 1, 2 o 3, es decir que al leer el registro debo identificar los datos para no introducirlos en la celda de la grilla erronea y finalmente en un label aparte he de introducir la suma total de todas las horas de las 7 celdas de la ultima fila.Todo esto como ya sabes lo introduje en el Datos.dat mediante el sistema que en otro post comentamos con RANDOM bien aconsejado por ti para no usar BBDD externa.
Como ves el berengenal que me he montado es grande pero cuando lo consiga creo que tendre un campo muy amplio aprendido.¿Podrias ayudarme y guiarme en el codigo paso a paso?

Un saludo

Última edición por XYON126; 11/04/2010 a las 13:41
  #11 (permalink)  
Antiguo 11/04/2010, 15:22
Avatar de 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

Primer punto:

El Option Explicit es optativo pero aconsejable ¿ Que significa ? pues que para utilizar una variable debes haberle definido antes y esto ayuda a evitar muchos errores.

Imagínate el siguiente Codigo:

Public Function Calcular(Dato as Integer) As Single
Prueba = Prueba + Dato
Prueba = Prueba * 25
Calcular = Prubea ' Fijate que me he equivocado y he puesto Prubea
End Function

Visual Basic no me avisará de que he cometido este error y me puede costar detectarlo, en cambio si tienes el Option Explicit, debería poner

Public Function Calcular(Dato as Integer) As Single
Dim Prueba As Single
Prueba = Prueba + Dato
Prueba = Prueba * 25
Calcular = Prubea ' Fijate que me he equivocado y he puesto Prubea
End Function

De este modo Visual Basic me diría que Prubea no está definido y detectas el error en la primera ejecución.

Respecto a donde esta el TextMatrix en mi código, pues simplemente donde lo puse al principio.

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2. * ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  3. * If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  4. * Grid.TextMatrix(Fila, Columna) = Dato
  5. End Sub

Por otra parte, en la primera rutina de Título no lo utilizo porque si estás posicionado en un Row / Col del Grid puedes utilizar la propiedad Text o sea que estos dos códigos hacen lo mismo.

Grid.Row = 1
Grid.Col = 3
Grid.Text = "JUAN"

Grid.TextMatrix(1,3)="JUAN"

Te preguntarás porque se utiliza el primero si el segundo es más rápido, pues porque no todas las propiedades de la celda se pueden modificar con la opción TextMatrix y debes encontrarte posicionado en ella para cambiar o averiguar por ejemplo el BackColor el CellAlignment, etc

Después me hablas del 7 x 7 = 49 celdas, las columnas generalmente son siempre las mismas ya que lo mismo necesitas 4, 5, 6 columnas para 1 fila que para mil, pero sin embargo las filas se van añadiendo a medida que las necesitas.

Si quieres deberías pegar el Codigo de la UDT que utilizas para leer los datos y la sentencia Open del Fichero para saber la longitud del mismo.

Después seguimos.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #12 (permalink)  
Antiguo 12/04/2010, 01:21
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Si algun dia nos conocemos personalmente, dame ostias hasta el DNI, estoy ciego y no habia visto el .TextMatrix cuando lo tenia delante de mis narices en la linea 4 de la segunda sentencia.
Y ahora ya voy captando,lo comentado, es lo que he comentado varias veces que en los manuales y tutoriales que corren por ahi en ningun sitio ponian lo que acabas de postear que si te posicionas en un Row/Col haces u obtienes lo mismo que en un .TextMatrix; entonces la linea :

Código vb:
Ver original
  1. GridCabecera MsFlexgrid1, LaColumna, ElAncho, ElTitulo, ElAjuste

que es exactamente lo del Row/Col,¿el orden de propiedades es ese? ¿Cuantas mas y en que orden puede llevar?

¿La primera fila la "0" y la primera columna "0" que se podrian tomar como indice o cabecera respectivamente ¿Tienen algun caracter(tratamiento) especial o es indiferente, pues veo que por defecto el MsFlexgrid la diferencia en color, ¿hay que tratarlas siempre por separado o simplemente como fila y columna (0,0) y punto?.

Cita:
Iniciado por erbunson Ver Mensaje
Si quieres deberías pegar el Codigo de la UDT que utilizas para leer los datos y la sentencia Open del Fichero para saber la longitud del mismo.
Aqui en este punto estoy tambien anclado pues en el formulario reloj que es donde entro los datos en el archivo Horas.dat los guardo de esta manera .:

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. 'Variables
  4. '##################################################
  5.  
  6. ' Estructura para dar de alta los datos de las Horas.
  7.  
  8. Private Type Horas_T
  9.  
  10. 'Variables
  11. horainicio1 As Date
  12. horafin1 As Date
  13. horainicio2 As Date
  14. horafin2 As Date
  15. horainicio3 As Date
  16. horafin3 As Date
  17. Totalhoras As Date
  18. dia As String * 8
  19. semana As String * 4
  20. mes As String * 12
  21. año As Integer
  22.  
  23. End Type
  24.  
  25. 'Variables para utilizar la estructura anterior
  26.  
  27. Dim Horas As Horas_T
  28. Dim HorasTemp As Horas_T
  29.  
  30. 'Variables para el archivo de los datos de Horas_T y temporal
  31. Dim FileFree As Integer
  32. Dim FileTemp As Integer
  33.  
  34. 'Variables para la posición del primer y último registro
  35. Dim RegActual As Long
  36. Dim RegUltimo As Long
  37.  
  38. ' Variable para la posición Temporal del registro
  39. Dim RegActualTemp As Long
  40.  
  41. Dim Pos As Integer, p As Integer
  42.  
  43. ' Variable para el cronometro
  44. Dim marco As Integer
  45. Dim horainicio As Date
  46. Dim horafin As Date
  47. Dim horainicio1 As Date
  48. Dim horafin1 As Date
  49. Dim horainicio2 As Date
  50. Dim horafin2 As Date
  51. Dim horainicio3 As Date
  52. Dim horafin3 As Date
  53. Dim tiempo_C As Date
  54. Dim conthoras As Integer
  55. Dim dia_C As String
  56. Dim mes_C As String
  57. Dim semana_C As String
  58. Dim año_C As Integer
  59.  
  60. ' Variable para identificar dia y mes.
  61. Dim diatemp As Integer
  62. Dim mestemp As Integer
  63. Dim x As Integer
  64. Dim i As Integer
  65.  
  66. Dim lcdTest As New mcLCD
  67.  
  68.  
  69. Private Sub cmd_fin_Click()
  70.  
  71. diatemp = Weekday(Format(Date, "ww"))
  72. mestemp = Month(Now)
  73. semana_C = Format(Date, "WW")
  74. año_C = Format(Date, "YYYY")
  75.  
  76.  
  77. horafin = Time
  78. marco = 0
  79.  
  80. dia_C = diatemp
  81. mes_C = mestemp
  82.  
  83.  
  84. 'Sentencia para Nombrar los dias de la semana.
  85. Select Case diatemp
  86.     Case 1
  87.     dia_C = "Lunes"
  88.    
  89.     Case 2
  90.     dia_C = "Martes"
  91.    
  92.     Case 3
  93.     dia_C = "Miercoles"
  94.    
  95.     Case 4
  96.     dia_C = "Jueves"
  97.    
  98.     Case 5
  99.     dia_C = "Viernes"
  100.    
  101.     Case 6
  102.     dia_C = "Sabado"
  103.    
  104.     Case 7
  105.     dia_C = "Domingo"
  106.  
  107. End Select
  108.  
  109. 'Sentencia para Nombrar los meses.
  110. Select Case mestemp
  111.     Case 1
  112.     mes_C = "Enero"
  113.    
  114.     Case 2
  115.     mes_C = "Febrero"
  116.    
  117.     Case 3
  118.     mes_C = "Marzo"
  119.    
  120.     Case 4
  121.     mes_C = "Abril"
  122.    
  123.     Case 5
  124.     mes_C = "Mayo"
  125.    
  126.     Case 6
  127.     mes_C = "Junio"
  128.    
  129.     Case 7
  130.     mes_C = "Julio"
  131.    
  132.     Case 8
  133.     mes_C = "Agosto"
  134.    
  135.     Case 9
  136.     mes_C = "Septiembre"
  137.    
  138.     Case 10
  139.     mes_C = "Octubre"
  140.    
  141.     Case 11
  142.     mes_C = "Noviembre"
  143.    
  144.     Case 12
  145.     mes_C = "Diciembre"
  146.    
  147. End Select
  148.    
  149. tiempo_C = horafin - horainicio
  150.  
  151. 'Datos salida por MsgBox
  152.  
  153. MsgBox tiempo_C & "   minutos realizados." & vbCrLf & vbCrLf _
  154.         & Date & vbCrLf & vbCrLf & "KW-" & semana_C
  155.        
  156. MsgBox horafin & vbCrLf & horainicio & vbCrLf & "________" & vbCrLf & " " & vbCrLf _
  157.         & tiempo_C & vbCrLf & año_C & vbCrLf & dia_C & "  , " & mes_C & vbCrLf & "KW-" & semana_C
  158.        
  159. 'Guardamos en el archivo Horas.dat los datos del contenido de las variables.
  160. GuardarDatos
  161.  
  162. 'Escribimos los datos en el archivo y en la posición
  163. Put #FileFree, RegActual, Horas
  164.        
  165.        
  166. 'Cerramos archivo de datos.
  167.      
  168. Close FileFree
  169.        
  170. End
  171. End Sub
  172.  
  173. Private Sub cmd_Inicio_Click()
  174. x = x + 1
  175. marco = 2
  176. horainicio = Time
  177.  
  178. 'Asignamos los datos de la hora de inicio
  179. Select Case x
  180.  Case 1: horainicio1 = horainicio
  181.  Case 2: horainicio2 = horainicio
  182.  Case 3: horainicio3 = horainicio
  183.          
  184. End Select
  185.  
  186. 'Escribimos los datos en el archivo y en la posición
  187. Put #FileFree, RegActual, Horas
  188. End Sub
  189.  
  190. Private Sub cmd_pausa_Click()
  191.  
  192. i = i + 1
  193. marco = 1
  194. horafin = Time
  195.  
  196. 'Asignamos los datos de la hora de pausa
  197.  
  198.  
  199. 'Asignamos los datos de la hora de inicio
  200. Select Case i
  201.  Case 1: horafin1 = horafin
  202.  Case 2: horafin2 = horafin
  203.  Case 3: MsgBox "     Ejecucion no valida." & vbCrLf & "Esta es la ultima salida presione Detener", _
  204.  vbExclamation, "Guardar datos."
  205.          
  206. End Select
  207.  
  208. 'Escribimos los datos en el archivo y en la posición
  209. Put #FileFree, RegActual, Horas
  210.  
  211.  
  212.  
  213. End Sub
  214.  
  215. Private Sub Form_Load()
  216.  
  217.    x = 0
  218.    i = 0
  219.    conthoras = conthoras
  220.    conthoras = conthoras + 1
  221.    lcdTest.NewLCD Picture1
  222.    
  223.    'Carga el primer registro del archivo
  224. Cargar
  225.  
  226. End Sub
  227.  
  228. Private Sub Cargar()
  229.  
  230. FileFree = FreeFile
  231. Open "Horas.dat" For Random As FileFree Len = Len(Horas)
  232.  
  233. RegActual = 1
  234. ' Almacenamos la posición del último registro
  235. RegUltimo = LOF(FileFree) / Len(Horas)
  236.  
  237. If RegUltimo = 0 Then
  238. RegUltimo = 1
  239. End If
  240.  
  241. End Sub
  242.  
  243. Private Sub GuardarDatos()
  244.  
  245. 'Asignamos los datos de la estructura con el contenido de las variables.
  246. With Horas
  247.  
  248.  ' Variable para del archivo Horas.dat
  249.  
  250. .horainicio1 = horainicio1
  251. .horafin1 = horafin1
  252. .horainicio2 = horainicio2
  253. .horafin2 = horafin2
  254. .horainicio3 = horainicio3
  255. .horafin3 = horafin3
  256. .Totalhoras = conthoras
  257. .dia = dia_C
  258. .semana = semana_C
  259. .mes = mes_C
  260. .año = año_C
  261.  
  262. End With
  263.  
  264. End Sub
  265.  
  266. Private Sub Picture1_Click()
  267.  
  268.    Unload frmLCD
  269.  
  270. End Sub
  271.  
  272. Private Sub Timer1_Timer()
  273.  
  274. If marco = 0 Then
  275.    lcdTest.Caption = "00:00:00"
  276.    ElseIf marco = 1 Then
  277.    lcdTest.Caption = horafin
  278.    Else
  279.    lcdTest.Caption = Time
  280.    
  281.    End If
  282. End Sub

El problema es que no se si en el formulario del MsFlexgrid he de llamar a los datos igual y como tratar o filtrarlos para evitar los tres problemas que comento; de momento lo que estoy haciendo es una rutina llamada "Visualizardatos ()" y otra "Datos ()". :
La "Visualizardatos ()" estoy asignando cada dia de la semana con un número y cada registro de entrada o salida tambien para poder tener una especie de coordenada y poder identificar la celda de MsFlexgrid y con un Select case le inserto su dato obtenido.(1er. problema, como poder indentificarlo dentro de mi Horas.dat).

Y en la segunda rutina "Datos ()", aqui es donde Habro el archivo leo los datos y pretendo una vez identificado cada dato guardarlo en una variable para posteriormente cerrar el archivo. Mi problema es que con la sentencia :

Código vb:
Ver original
  1. Get #FileFree, RegActual, horas

No se si la he de declarar igual que en la del reloj o no (creo que por logica si) pero como trato los registros vacios(dias no trabajados, dias con solo una entrada, etc) este es un punto que me estoy rompiendo los cascos y habriendo el archivo para ver como los guarda, púes eso veo un monton de caracteres irreconocibles y me quedo peor que al principio.

Un saludo

Última edición por XYON126; 12/04/2010 a las 07:29
  #13 (permalink)  
Antiguo 12/04/2010, 15:49
Avatar de 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

Hola, me estas preguntando demasiadas cosas a la vez, y el problema es que al no poder ser un cara a cara lo que sería fácil de explicar, resulta difícil de expresar

El .Row es la fila donde se ha hecho click con el ratón y el .Col es la columna, aunque tu puedes definir por código en que Fila y Columna quieres posicionarte, en cuanto al orden depende del ciclo que quieras usar en tu proceso o sea, si quieres procesar por filas o por columnas.

La Primera Fila es 0 y La Primera columna es 0, y esto no puedes cambiarlo, en cuanto a lo del color especial es porque tu puedes definir un número determinado de Filas o Columnas fijas o sea, que permanecerán fijas arriba y a la izquierda del Grid, generalmente se usan para títulos o encabezados.

Puedes definir las que quieras .FixedRows = 2 o .FixedCols = 5 depende de tus propósitos y necesidades.

Aquí en este punto estoy tambien anclado pues en el formulario reloj que es donde entro los datos en el archivo Horas.dat los guardo de esta manera .:

En cuanto al UDT creo que es correcto pero el problema es que me resulta francamente difícil introducirme en tu código tal vez porque muchas de las cosas que hay en el mismo se podrían simplificar enormemente con algunos trucos y resultaría mas fácil su lectura.

Por ejemplo, si necesitas tener en letras el día de la semana, puedes utilizar para ello la sentencia Format con sus múltiples posibilidades que aunque están a la vista permanecen ocultas si no es con imaginación, por ejemplo, si tu tienes una fecha por ejemplo 15/07/2009 y deseas obtener el nombre del día de la semana o el nombre del mes, puedes simplemente hacer esto:

Msgbox Format("15/07/2009", "dddd")
MsgBox Format("15/07/2009", "mmmm")

Pruébalo y ya me cuentas, las posibilidades son muchísimas.

En cuanto al tema de los caracteres irreconocibles en el archivo es porque al tener definida en la UDT campos de varios tipos, el programa los guarda en código binario por ejemplo un Campo Tipo Single se guarda en disco con una longitud de 4 bytes mientras que uno tipo Date se guarda como 8 bytes, independientemente de que tenga un valor mácimo o un valor 0, por esto estás viendo 'caracteres raros'

Si los guardaras en formato Ascii probablemente te resultaría mas facil de entender ya que incluso podrías editarlos y modificarlos con el bloc de notas.

Creo que primero deberías simplificar el proceso de guardado de los datos para posteriormente tener mas facil su proceso, al fin y al cabo lees el fichero de modo secuencial desde principio a fin ¿ no es asi ?

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #14 (permalink)  
Antiguo 13/04/2010, 00:28
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

hola erbunson!

Cita:
Iniciado por erbuson Ver Mensaje
El .Row es la fila donde se ha hecho click con el ratón y el .Col es la columna, aunque tu puedes definir por código en que Fila y Columna quieres posicionarte, en cuanto al orden depende del ciclo que quieras usar en tu proceso o sea, si quieres procesar por filas o por columnas.
Lo del .Row y .Col lo tengo claro que con raton o por codigo puedes hacerlo celda por celda, la pregunta era que otros paramentros y en que orden se podian añadir, pues al menos que no hubiese una manera de identificar que es, si el valor era solo entre "," es donde me daria error o datos equivocados.

Cita:
Iniciado por erbuson Ver Mensaje
En cuanto al UDT creo que es correcto pero el problema es que me resulta francamente difícil introducirme en tu código tal vez porque muchas de las cosas que hay en el mismo se podrían simplificar enormemente con algunos trucos y resultaría mas fácil su lectura.

Msgbox Format("15/07/2009", "dddd")
MsgBox Format("15/07/2009", "mmmm")
Aqui me comentas que se podrian hacer varios trucos, yo tenia pensado por un lado en el tema de identificador de dias y meses hacer un modulo.cls (de clase) y simplemente con una llamada a una sentencia me diese el dia o mes, he probado meter toda la parte de codigo que hace eso en un modulo.cls y no see si es que se debe introducir diferente pero me daba error pero lo dejo para mas adelante para no complicar las cosas.Sobre lo del comando Format si le introduzco los "dddd" siempre me da el dia del mes pero no si es Jueves o Lunes de echo el Date lo que me responde es "13-abril-2010 y si le separo los parametros te da "13" "4" y "2010" si te fijas en las lineas 151 hasta la 158 lo unico que hacen es con el MsgBox visualizarme lo que se ha guardado en la variable que introducira el dato en el archivo.dat, lo realizo temporalmente para saber que es lo que me guarda por lo de la incomprension del archivo binario con intencion de eliminarlo posteriormente (el MsgBox), aqui si es solo un comado te diria cual es la forma de guardar en ASCII pero si son muchas lineas de codigo lo dejamos para mas adelante tambien.

Cita:
Iniciado por erbuson Ver Mensaje
Creo que primero deberías simplificar el proceso de guardado de los datos para posteriormente tener mas facil su proceso, al fin y al cabo lees el fichero de modo secuencial desde principio a fin ¿ no es asi ?
Exactamente de momento, aunque cuando haya mas de 20 registros supongo que lo logico es poner un contador de registros y hacer un bucle para seleccionar los que necesite para visualizar en el MSFlexGrid del otro formulario.Sobre este tema una pregunta: ¿VBasic identifica, guarda internamente en el archivo.dat el número de registro o dato de cuando fue guardado?¿Debe guardar siempre aunque sea con valor "0" (cero) o nulo todos los campos o si por ejemplo un registro tiene el campo dia "jueves" y otro dia "viernes" yo los puedo identificar posteriormente al leerlos? lo pregunto porque las variantes relacionadas con la Fecha las introduzco solo para identificar el registro sin error.Comentas que deberia simplificarlo ¿Como? yo para guardar en el archivo solo utilizo esto :

Código vb:
Ver original
  1. Private Sub GuardarDatos()
  2.  
  3. 'Asignamos los datos de la estructura con el contenido de las variables.
  4. With Horas
  5.  
  6.  ' Variable para del archivo Horas.dat
  7.  
  8. .horainicio1 = horainicio1
  9. .horafin1 = horafin1
  10. .horainicio2 = horainicio2
  11. .horafin2 = horafin2
  12. .horainicio3 = horainicio3
  13. .horafin3 = horafin3
  14. .Totalhoras = conthoras
  15. .dia = dia_C
  16. .semana = semana_C
  17. .mes = mes_C
  18. .año = año_C
  19.  
  20. End With
  21.  
  22. End Sub

eso para guardar en el archivo y esto para obtener los datos .:

Código vb:
Ver original
  1. Private Sub cmd_fin_Click()
  2.  
  3. diatemp = Weekday(Format(Date, "ww"))
  4. mestemp = Month(Now)
  5. semana_C = Format(Date, "WW")
  6. año_C = Format(Date, "YYYY")
  7.  
  8.  
  9. horafin = Time
  10. marco = 0
  11.  
  12. dia_C = diatemp
  13. mes_C = mestemp
  14.  
  15.  
  16. 'Sentencia para Nombrar los dias de la semana.
  17. Select Case diatemp
  18.     Case 1
  19.     dia_C = "Lunes"
  20.    
  21.     Case 2
  22.     dia_C = "Martes"
  23.    
  24.     Case 3
  25.     dia_C = "Miercoles"
  26.    
  27.     Case 4
  28.     dia_C = "Jueves"
  29.    
  30.     Case 5
  31.     dia_C = "Viernes"
  32.    
  33.     Case 6
  34.     dia_C = "Sabado"
  35.    
  36.     Case 7
  37.     dia_C = "Domingo"
  38.  
  39. End Select
  40.  
  41. 'Sentencia para Nombrar los meses.
  42. Select Case mestemp
  43.     Case 1
  44.     mes_C = "Enero"
  45.    
  46.     Case 2
  47.     mes_C = "Febrero"
  48.    
  49.     Case 3
  50.     mes_C = "Marzo"
  51.    
  52.     Case 4
  53.     mes_C = "Abril"
  54.    
  55.     Case 5
  56.     mes_C = "Mayo"
  57.    
  58.     Case 6
  59.     mes_C = "Junio"
  60.    
  61.     Case 7
  62.     mes_C = "Julio"
  63.    
  64.     Case 8
  65.     mes_C = "Agosto"
  66.    
  67.     Case 9
  68.     mes_C = "Septiembre"
  69.    
  70.     Case 10
  71.     mes_C = "Octubre"
  72.    
  73.     Case 11
  74.     mes_C = "Noviembre"
  75.    
  76.     Case 12
  77.     mes_C = "Diciembre"
  78.    
  79. End Select
  80.    
  81. tiempo_C = horafin - horainicio
  82.  
  83. 'Datos salida por MsgBox
  84.  
  85. MsgBox tiempo_C & "   minutos realizados." & vbCrLf & vbCrLf _
  86.         & Date & vbCrLf & vbCrLf & "KW-" & semana_C
  87.        
  88. MsgBox horafin & vbCrLf & horainicio & vbCrLf & "________" & vbCrLf & " " & vbCrLf _
  89.         & tiempo_C & vbCrLf & año_C & vbCrLf & dia_C & "  , " & mes_C & vbCrLf & "KW-" & semana_C
  90.        
  91. 'Guardamos en el archivo Horas.dat los datos del contenido de las variables.
  92. GuardarDatos
  93.  
  94. 'Escribimos los datos en el archivo y en la posición
  95. Put #FileFree, RegActual, Horas
  96.        
  97.        
  98. 'Cerramos archivo de datos.
  99.      
  100. Close FileFree
  101.        
  102. End
  103. End Sub

Se ve largo por el case pero en realidad son 8 lineas ya que el resto de codigo son el correspondiente a los botones de paro y encendido del cronometro y que cada uno solo tiene 8 lineas. ¿Que truco aplicarias?

Por cierto la parte del guardado final esta en el boton "Private Sub cmd_fin_Click()" que lo pongo para que no me duplique los datos al mismo tiempo de salir de la función.


Un saludo
  #15 (permalink)  
Antiguo 13/04/2010, 06:46
Avatar de 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

Creo que a cada momento nos estamos complicando mas ¿ que hace realmente tu programa a fin de ver si consigo captar la idea ?

Por otra parte, no entiendo lo del truco del format, mi VB me devuelve por ejemplo lo siguiente

Msgbox Format(Date, "dddd") ' El día de la semana, Lunes, Martes, Miercoles, etc

¿ a ti no ?
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #16 (permalink)  
Antiguo 13/04/2010, 07:52
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Cita:
Iniciado por erbuson Ver Mensaje
Creo que a cada momento nos estamos complicando mas ¿ que hace realmente tu programa a fin de ver si consigo captar la idea ?

Por otra parte, no entiendo lo del truco del format, mi VB me devuelve por ejemplo lo siguiente

Msgbox Format(Date, "dddd") ' El día de la semana, Lunes, Martes, Miercoles, etc

¿ a ti no ?
hola erbunson!

Bueno, mi programa, el principal pues lo he dividido en varios pequeños programillas para ir poco a poco, su función es simplemente un cronometro o reloj de marcar, el cual tiene una BBDD de clientes, otra BBDD de pedidos activos y ya esta, para activar el tiempo de uso de un Soft de CAD llamado CATIA V5 que normalmente cuando me entran pedidos (soy autonomo) me toca facturarles las horas de CATIA V5 y las mias desglosadas y por separado. Ahora como no tengo curro me lo estoy haciendo para no tenerlo que hacer a manini como hasta ahora.

Tengo casi todos los formularios hechos, aunque no definitivos, el formulario de altas de clientes, ya esta y funciona, el cronometro es el posteado, tambien funciona pero el 80%, me falta poder guardar las entradas, salidas y calculo de horas, y el del status semanal, mensual y proyecto es el que esta el MSFlexgrid.

Referente al Format, a mi si lo escribo como tú !si! pero no se porque razon si en vez de visualizarlo directamente se lo añado a una variable y despues como verificación visualizo esta variable con el MsgBox me sale "13 abr de 1900" ¿Porque ni idea? y es legal mi VB, que no es pirata pues lo uso tambien para macros de CATIA.

¿Puedes comentarme en detalle el funcionamiento de la sentencias que posteastes para meterlas en un modulo del MSFlexgrid?.

Una consulta tonta ¿VB considera declaradas las variables que estan entre un "Private Type/ End Type" para usarlas fuera del entorno de lectura Random o hay que declararlas tambien fuera de aqui con el Dim para usarlas en otras sentencias?

Un saludo

Última edición por XYON126; 13/04/2010 a las 08:13
  #17 (permalink)  
Antiguo 13/04/2010, 12:53
Avatar de 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 ...
  #18 (permalink)  
Antiguo 14/04/2010, 01:09
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Muchas gracias por esto me ayuda un monton, aunque como esperabas me provoca varias cnsultas.

1. Este codigo lo tienes en un modulo.bas o en el programa.

2. Si he entendido bien con la función "Select Case LCase(Opcion)" lo que estas haciendo son cuatro sentencias que llamas a tu antojo o necesidad como si fuesen variables ¿Es asi?¿Es lo mismo a crear varias subrutinas como (leer(), grabar(), etc.?si es asi, ¿esto seria valido para cuando tienes que crear un número elevado de subrutinas y asi poderlas agrupar para hacer mas comprensible el codigo?.

3. En esta parte de codigo :
Código vb:
Ver original
  1. Sub FicheroClientes(Opcion As String, Registro As Single)
  2.  ' Variable de número de Fichero. Estática para guardarla en la Rutina.
  3.  Static Numero As Integer
  4.  ' Si Número = Cero el archivo no está abierto. Lo asignamos y Abrimos.
  5. If Numero = 0 Then
  6.  Numero = FreeFile
  7. Open "CLIENTES.DAT" For Random As #Numero Len = 256
  8. End If

Veo que por un lado asignas un canal a la variable "Numero" o que use el FreeFile y despues en el Open siempre habres un canal en vez de usar el FreeFile ¿Porque, no es mejor usar siempre el FreeFile? y despues en la sentencia Open le das siempre el tamaño de 256 que es lo mismo que "CamposClientes", ¿lo haces por no llamar a "CamposClientes" en cada LEN?

4.Veo que utilizas la funcion "Sub" sola, referente a ella ypor mucho que he buscado siempre me la asocian o con un "Private Sub" o con un "Sub Main" y no sola, en tu caso como se comporta ¿Porque de Sub a solas.?

5. Y para rematar en varias sentencias If por ejemplo :

If Registro = 0 Or Registro > LOF(Numero) / 256 Then
Registro = -1

coges el valor del tamaño del registro y lo divides por 256 ¿Porque?
Se que son trucos de perro viejo por eso te lo pregunto.

Un saludo

PDTA.:

Una consulta mas .:

En este codigo :

Código C:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2.   ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  3.  If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  4.  Grid.TextMatrix(Fila, Columna) = Dato
  5. End Sub

Si tengo tres grillas que se llaman MsFlexgrid1, MsFlexgrid2 y MsFlexgrid3

y para llamarlas con :

Código vb:
Ver original
  1. CALL GridPonerDato (Grid, 0, 0, "Dato")

He probado esto, con MsgBox el nomdre es bueno, pero en el CALL me da el error "el tipo de argumento de ByRef no coincide" ¿Porque?

Código vb:
Ver original
  1. Dim i As Integer, Grid As String
  2.  
  3. i = 1
  4.  
  5. For i = i To 3
  6.  
  7. Grid = "MsFlexgrid" & i
  8.  
  9. Call GridPonerDato(Grid, 0, 0, "25")

en cambio si al codigo no le declaro el "Grid As String"

el error que me da es "Variable no definida"

¿Como renombro la Grilla?

Saludo2

Última edición por XYON126; 14/04/2010 a las 11:47
  #19 (permalink)  
Antiguo 14/04/2010, 15:35
Avatar de 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

Hola:

Disculpa pero estos días estoy muy liado y antes es el trabajo que la devoción, intentaré aclarar tus dudas:

1 - El código yo lo tengo en un módulo.bas ya que de este modo lo comparto desde todos los form sin ningún problema.

2 - Efectivamente, el tener las rutinas unificadas en una sóla hace mas fácil la posterior corrección de errores o ampliación de la misma ya que de este modo tienes todo concentrado en un mismo sitio, además de tratarse como ves de una rutina bastante simple.

3 - El FreeFile asigna un nuevo número cada vez, te asigna el próximo Canal disponible, por lo que no solicito un nuevo FreeFile si tengo el fichero abierto porque evidentemente no sería el mismo acceso.

4 - El tamaño de 256 en este ejemplo es poque la UDT tiene una longitud de 256, por lo tanto este número varía en funcion de la longitud de tu UDT, por costumbre procuro siempre reservar espacio disponible para posibles ampliaciones en el la UDT aunque sin pasarse.

5 - Public se utiliza para definir procedimientos o Funciones que están accesibles desde otros Módulos y Private para los que están solo disponibles en módulo que los contiene, su uso depende de tus necesidades.

7 - El motivo de dividir el tamaño del fichero es simplemente porque dividiendo el LOF del Fichero por la longitud del Registro obtienes el número de registros que tiene el Fichero.

Si pretendo leer el registro 0 o un registro que no existe devuelvo -1 para controlar el error fuera de la rutina.

8 - CALL GridPonerDato (Grid, 0, 0, "Dato") En esta sentencia lógicamente tienes que sustituir el primer parámetro Grid por MsFlexGrid1, MsFlexGrid2, o como te convenga según tu proyecto.

CALL GridPonerDato (MsFlexGrid2, 0, 0, "Dato")

Cita:
Dim i As Integer, Grid As String
i = 1
For i = i To 3
Grid = "MsFlexgrid" & i
Call GridPonerDato(Grid, 0, 0, "25")
Esto no se puede hacer ya que la rutina GridPonerDato espera como primer parámetro un MsFlexGrid identificado por su nombre de objeto y tu le estas pasando una String, por esta razón te da el error.

Bueno, poco a poco lo conseguiremos.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #20 (permalink)  
Antiguo 15/04/2010, 00:46
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Primeramente, muchas gracias y esta antes tu trabajo que cualquier cosa que el horno no esta para bollos y si puedes ayudar siempre es bueno y si no puedes tambien, que lo primero es lo primero y sin ninguna duda.
Entonces como aclaración final, no hay manera posible que con una sola sentencia se puedan llamar a varios MSFlexgrid es decir que por ejemplo deberia hacer un "Selet case" y tantos case con CALL como grillas tenga para conseguir un bucle, si es lo que necesito, ¿He comprendido bien?.Y si es asi para que me sirve declarar esto :

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)

si despues no puedo llamar al "Grid" incluso entonces, el CALL me da error ya que el tiene declarado el Grid y no MsFlexgrid#, que al mismo tiempo esto me conlleva a otra consulta :

¿Debo entonces en el Modulo.bas declarar todos los MsFlexgrid que tenga?
¿Seria esta linea de codigo del Modulo.bas correcta?

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid1 As MSFlexGrid1, Grid2 As MSFlexGrid2, Grid3 As MSFlexGrid3, Grid4 As MSFlexGrid4, Fila As Single, Columna As Single, Dato As Variant)

Voy a probarlo asi y ya te comentare como me ha hido.

Muchas gracias, un saludo

Última edición por XYON126; 15/04/2010 a las 04:06
  #21 (permalink)  
Antiguo 15/04/2010, 01:45
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson"

He probado lo antes comentado y me da el error "No se ha definido el tipo definido por el usuario" :

Código vb:
Ver original
  1. Public Sub GridCabecera(Grid1 As MSFlexGrid1, Grid2 As MSFlexGrid2, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
  2.  
  3. ' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
  4. If Grid1.Cols - 1 < Columna Then Grid1.Cols = Columna + 1
  5.     Grid1.ColWidth(Columna) = AnchoTwips
  6.     Select Case UCase(Ajuste)
  7.       Case "I": Grid1.ColAlignment(Columna) = 1 ' Izquierda
  8.      Case "D": Grid1.ColAlignment(Columna) = 7 ' Derecha
  9.      Case "C": Grid1.ColAlignment(Columna) = 4 ' Centro
  10.    End Select
  11. If Grid2.Cols - 1 < Columna Then Grid2.Cols = Columna + 1
  12.     Grid2.ColWidth(Columna) = AnchoTwips
  13.     Select Case UCase(Ajuste)
  14.       Case "I": Grid2.ColAlignment(Columna) = 1 ' Izquierda
  15.      Case "D": Grid2.ColAlignment(Columna) = 7 ' Derecha
  16.      Case "C": Grid2.ColAlignment(Columna) = 4 ' Centro
  17. End Select
  18.  
  19.    Grid1.Row = 0
  20.    Grid1.Col = Columna
  21.    Grid1.CellAlignment = 4                     ' Título siempre Centrado
  22.   Grid1.Text = Titulo
  23.  
  24.    Grid2.Row = 0
  25.    Grid2.Col = Columna
  26.    Grid2.CellAlignment = 4                     ' Título siempre Centrado
  27.   Grid2.Text = Titulo
  28. End Sub
  29.  
  30. Private Sub GridPonerDato(Grid1 As MSFlexGrid1, Grid2 As MSFlexGrid2, Fila As Single, Columna As Single, Dato As Variant)
  31. ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  32. If Grid1.Rows - 1 < Fila Then Grid1.Rows = Fila + 1
  33.     Grid1.TextMatrix(Fila, Columna) = Dato
  34. If Grid2.Rows - 1 < Fila Then Grid2.Rows = Fila + 1
  35.     Grid2.TextMatrix(Fila, Columna) = Dato
  36.    
  37. End Sub

Por lo que creo que no se declara asi que se comporta como una subrutina

¿Como identifico los MsFlexgrid en el modulo o hay que hacerlos todos?.

Por otro lado y volviendo al apartado de este codigo tuyo (solo un trozo como ref.)
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. e

Consigues la longitud deseada, en este caso 256; en mi caso donde tengo variables String, Date, Integer y ademas no siempre se llenan todos los campos, aunque conozcamos el tamaño en bytes que asigna VB a cada tipo de variable, no es siempre de longitud igual por el String con lo que tu rutina la he de adaptar para registros de tamaño aleatorio, ¿Es asi, no?

Y como ultima consulta, en el codigo :

Código vb:
Ver original
  1. FicheroClientes "registros", Registros
  2. For Registro = 1 to Registros
  3. FicheroClientes "leer", Registro
  4. ' Procesar el registro leido
  5. Next

Segun la subrutina FicheroClientes le deberiamos especificar la Opcion y un número de registro, entonces Registros entiendo que te refieres a ese número de registro(1, 22, 33, etc) o en su defecto a la variable Registro es decir le sobra la "s" de Registros, ¿Es asi?

Un saludo

Última edición por XYON126; 15/04/2010 a las 04:04
  #22 (permalink)  
Antiguo 15/04/2010, 10:26
Avatar de 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

O vamos por partes o no nos aclaramos, lo que quiero es que lo entiendas, y no que modifiques directamente tu programa, una vez que lo entiendas verás que es mil veces mas fácil de lo que por ahora lo complicas.

Vamos primero con el Grid

Crea un Formulario y pega en el tres controles Grid por omisión que los veas separados MsFlexGrid1, MsFlexGrid2 y MsFlexGrid3

Después copia y pega este código y ejecuta el programa.


Código:
Option Explicit

Private Sub Form_Load()
  GridCabecera MSFlexGrid1, 0, 1000, "Col 0 Grid 1", "C"
  GridCabecera MSFlexGrid1, 1, 1000, "Col 1 Grid 1", "C"
  
  GridCabecera MSFlexGrid2, 0, 1000, "Col 0 Grid 2", "C"
  GridCabecera MSFlexGrid2, 1, 1000, "Col 1 Grid 2", "C"
  
  GridCabecera MSFlexGrid3, 0, 1000, "Col 0 Grid 3", "C"
  GridCabecera MSFlexGrid3, 1, 1000, "Col 1 Grid 3", "C"
End Sub

Public Sub GridCabecera(Grid As MSFlexGrid, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
Grid.ColWidth(Columna) = AnchoTwips
Select Case UCase(Ajuste)
  Case Is = "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
  Case Is = "D": Grid.ColAlignment(Columna) = 7 ' Derecha
  Case "C": Grid.ColAlignment(Columna) = 4 ' Centro
End Select
  Grid.Row = 0
  Grid.Col = Columna
  Grid.CellAlignment = 4 ' Título siempre Centrado
  Grid.Text = Titulo
End Sub
Seguramente que así lo veas mas claro.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #23 (permalink)  
Antiguo 16/04/2010, 01:57
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Cita:
Iniciado por erbuson Ver Mensaje
O vamos por partes o no nos aclaramos, lo que quiero es que lo entiendas, y no que modifiques directamente tu programa, una vez que lo entiendas verás que es mil veces mas fácil de lo que por ahora lo complicas.

Vamos primero con el Grid
Hola erbunson!

Estoy totalmente de acuerdo contigo que un copy/paste no me aporta nada y es justo lo que no realizo, de ahi el porque he realizado pruebas, como te indicaba en los dos ultimos post y los problemas que me surgian. Por parte del Grid veo que con el codigo que has posteado (aunque he realizado lo que comentas) nada mas ver el tramo este :

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.   GridCabecera MSFlexGrid1, 0, 1000, "Col 0 Grid 1", "C"
  5.   GridCabecera MSFlexGrid1, 1, 1000, "Col 1 Grid 1", "C"
  6.  
  7.   GridCabecera MSFlexGrid2, 0, 1000, "Col 0 Grid 2", "C"
  8.   GridCabecera MSFlexGrid2, 1, 1000, "Col 1 Grid 2", "C"
  9.  
  10.   GridCabecera MSFlexGrid3, 0, 1000, "Col 0 Grid 3", "C"
  11.   GridCabecera MSFlexGrid3, 1, 1000, "Col 1 Grid 3", "C"
  12. End Sub

Lo he comprendido y me has respondido a como llamar a varios MSFlexgrid, pues si, aqui son solo 6 lineas para crear 3 Grid de 2x2, pero en cambio, si en vez de ser de 2x2 son de 10x10, en vez de ser 6 lineas serian 30 lineas minimo, a menos de que se pudiera hacer un bucle por MSFlexGrid o general y aqui es cuando surgio mi consulta de como hacerlo si es que se puede, pues las variables internas del " GridCabecera"(Rutina) no las puedo tomar como variables puras y duras ya que si las tomo automaticamente VB me responde "Variable no definida" que despues he comprendido que VB las toma no como variables sino como parametros internos obligados; resumiendo ¿Hay alguna manera de poder controlar estos parametros o variables internas? ¿Me comprendes ahora?.

PDta: Ya se que en el caso de "Titulo y Ajuste" creo una variable y en vez de poner un dato pongo esa variable y me toma el valor de la misma, pero en el caso de "Grid As MSFlexGrid" hay alguna manera o no es posible.

Me refiero a esto :

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Dim pepito As String
  4. Dim pepito2 As String
  5.  
  6.  
  7. Private Sub Form_Load()
  8.  
  9. pepito = "Manel"
  10. pepito2 = "Jose"
  11.  
  12.   GridCabecera MSFlexGrid1, 0, 1000, pepito, "C"
  13.   GridCabecera MSFlexGrid1, 1, 1000, pepito2, "C"
  14.  
  15.   GridCabecera MSFlexGrid2, 0, 1000, "Col 0 Grid 2", "C"
  16.   GridCabecera MSFlexGrid2, 1, 1000, "Col 1 Grid 2", "C"
  17.  
  18.   GridCabecera MSFlexGrid3, 0, 1000, "Col 0 Grid 3", "C"
  19.   GridCabecera MSFlexGrid3, 1, 1000, "Col 1 Grid 3", "C"
  20.  
  21.  
  22. End Sub

si pudiese controlar tambien el Grid con un bucle podria rellenar las tres Grillas con solo 2 lineas de codigo:

GridCabecera MSFlexGrid1, 1, 1000, pepito2, pepito.

, es a lo que me refiero, no se si me he explicado bien.

Un saludo

Última edición por XYON126; 16/04/2010 a las 02:58
  #24 (permalink)  
Antiguo 18/04/2010, 16:14
Avatar de 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

Hola:


Si comprendiste la idea, mira a ver si entiendes este ejemplo mejorado en el que le indicas en una sóla linea TODAS las columnas del Grid con sus formatos y títulos.

Necesitas insertar un sólo grid para probarlo.


Código:
Option Explicit

Private Sub Form_Load()
  GridCabeceras MSFlexGrid1, "Código;1000;D", "Nombre;4000;I", "NIF;1000;D", "Fecha;1000;C"
End Sub


Public Sub GridCabeceras(Grid As MSFlexGrid, ParamArray Columnas() As Variant)
' Cada columna debe enviarse con el formato Titulo;Ancho;Ajuste
' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
Dim Valores() As String
Dim Columna As Single, ValoresColumna As Variant
For Each ValoresColumna In Columnas
  Valores = Split(ValoresColumna, ";")
  If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
  Grid.ColWidth(Columna) = Val(Valores(1))        ' Ancho
  Select Case UCase(Valores(2))                   ' Ajuste
    Case Is = "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
    Case Is = "D": Grid.ColAlignment(Columna) = 7 ' Derecha
    Case "C": Grid.ColAlignment(Columna) = 4      ' Centro
  End Select
  Grid.Row = 0
  Grid.Col = Columna
  Grid.CellAlignment = 4 ' Siempre Centrado
  Grid.Text = Valores(0) ' Título
  ' Incrementamos el valor de Columna aquí porque la primera es la 0
  Columna = Columna + 1
Next
End Sub
Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #25 (permalink)  
Antiguo 19/04/2010, 03:21
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Buf!!!!!!!!! Me estas haciendo que me coma el tarro de Güikis, esta vez me lo has puesto complicadillo con algunos comandos que desconocia(For Each Next y ParamArray) pero bueno, rascando y leyendo no hay nada que se resista casi siempre.
Por lo que he entendido y he visto como funciona (corrigeme), lo que haces con esta funcion es un bucle dentro de otro bucle controlado por nosotros, desde el inicio del programa o donde toque(esto ultimo muy improbable); podemos con parametros o variables selecionados a nuestro antojo, para rellenar una MsFlexgrid cualquiera y si lo guardamos como Modulo.bas, llamando al modulo ya no nos tenemos que preocupar en este caso de configurar la Grilla, a su vez con unos pocos retoques quizas se pueda rellenar incluso, mas o menos lo que te preguntaba en el anterior post.¿Es asi?.
Pero esto me lo tengo que estudiar muy a fondo pues aunque aparentemente parece facil, no lo es. y aunque quisiera hacer un copy/paste para mi programilla, si no lo entiendes bien y a fondo lo que provocaria es que me volveria loco y me perdiese ahora que voy pillando el hilo.
Ya te contare como me va con esto, posiblemente antes de que leas este post o no.

Por cierto, ¿siempre que se genera un archivo al abrir uno inexistente se te genera un registro vacio, es decir el que tu guardas mas uno al inicio sin nada todo ceros y si eliminas este primer registro te lo vuelve a generar al volver abrir este archivo? Me refiero con aperturas de archivos aleatorios RANDOM.

Un saludote

Última edición por XYON126; 19/04/2010 a las 07:34
  #26 (permalink)  
Antiguo 19/04/2010, 10:44
Avatar de 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

Respecto al tema de loa archivos, te comento que la apertura de un archivo en modo RANDOM hace que se mantengan todos los datos del fichero por lo tanto suponte que tienes los siguiente registros:

1_AAAAAAAAAAAAAAAAA
2_BBBBBBBBBBBBBBBBB
3_CCCCCCCCCCCCCCC
4_DDDDDDDDDDDDDDD

tu puedes obviamente añadir registros al final tal como hacía en el post original como machacar sobre uno de los existentes para sustituir sus datos. Si un registro tiene una longitud de 256 bytes independientemente de que su campos esten llenos o vacios por lo tanto un campo STRING de 15 posiciones ocupa los mismo si contiene PEPE que si contiene HERMENEGILDO

Mientras no leas un Registro la UDT que tengas definida estará vacia, el hecho de abrir el fichero simplemente significa que está abierto.

La funciones FREEFILE te devuelve el siguiente canal disponible para ser abierto por lo tanto no puedes asignarla cada vez aunque evidentemente podrías tener un fichero abierto con distintos canales siempre que definas la cláusula SHARED para compartir archivos, por ejemplo

OPEN "CLIENTES" .... As #1 Len = 256

OPEN "CLIENTES" .... As #2 Len = 256

Si tu lees el registro 10 del archivo #1 te devolverá lo mismo que si lees el 10 del Archivo #2 puesto que ambos son el mismo fichero.

Pero atención si tienes que borrar el archivo, y sólo cierras el #1 no te permitirá hacerlo porque el #2 sigue abierto y es el mismo.

No tiene mucho sentido el ejemplo de abrir 2 archivos pero es para que te hagas una idea.

Respecto al tema de BORRAR registros de un archivo RANDOM lo que suele hacer es grabar un registro con un determinado valor que tu sepas no puede formar parte del archivo o incluso es suficiente con una única posición y entonces tu en el proceso decides como actúas con el registro.

Imagínate que decides poner un campo String o Bolean (tu decides) en mitad de una UDT que significa SUPRIMIDO por ejemplo Eliminado As Boolean

Cuando tu grabes este registro lo grabas como Eliminado = True y entonces significará para ti que lo consideras suprimido, independientemente de que puedas seguir accediendo a su información.

En este caso cuando leas un registro debes comprobar si Eliminado = True porque de ser así debes omitirlo en tus procesos por ejemplo, siguiendo lo que vimos anteriormente

Do
Registro = Registro + 1
LeerRegistro Registro
' Si es fin de Registros, salimos del bucle
IF Registro = -1 Then Exit Do

If Not(Registro.Eliminado) Then
RegistrosValidos = RegistrosValidos + 1
' Efectuar tu proceso sobre el registro
Else
RegistrosSuprimidos = RegistrosSuprimidos + 1
' Recuerda que aunque lo consideras suprimido el resto sigue ahí, podrías
' reactivarlo simplemente haciendo Suprimido = False y regrabando sobre el
End If
Loop

MsgBox "Válidos " & RegistrosValidos
MsgBox "Eliminados " & RegistrosSuprimidos


Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #27 (permalink)  
Antiguo 19/04/2010, 13:28
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

En este codigo que solo tiene un Grid ya que es para ir probando al ejecutarlo no me rellena ninguna celda ¿Donde tengo el error? ¿Porque no me rellena nada?, si pongo MsgBox de control despues de cada paso o sentencia estos si responden bien, en cambio las celdas se quedan en blanco.
Podrias ayudarme.

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. 'Variables
  4. '##################################################
  5.  
  6. ' Estructura para dar de alta los datos de las Horas.
  7.  
  8. Private Type Horas_T
  9.  
  10. 'Variables
  11.  
  12. inicio1 As Date
  13. fin1 As Date
  14. inicio2 As Date
  15. fin2 As Date
  16. inicio3 As Date
  17. fin3 As Date
  18. tiempo As Date
  19. dia As String * 8
  20. fecha As Integer
  21. semana As Integer
  22. mes As String * 10
  23. año As Integer
  24. npedido As Long
  25. Totalhoras As Integer
  26.  
  27.  
  28. End Type
  29.  
  30. 'Variables para utilizar la estructura anterior
  31.  
  32. Dim Horas As Horas_T
  33. Dim HorasTemp As Horas_T
  34.  
  35. 'Variables para el archivo de los datos de Horas_T y temporal
  36. Dim Numero As Integer
  37. Dim FileTemp As Integer
  38.  
  39. 'Variables para la posición del primer y último registro
  40. Dim RegActual As Long
  41. Dim RegUltimo As Long
  42.  
  43. ' Variable para la posición Temporal del registro
  44. Dim RegActualTemp As Long
  45. Dim semanatemp As Integer
  46. Dim Pos As Integer, p As Integer
  47.  
  48. 'Variables para datos temporales de la Grilla
  49.  
  50. Dim inicio1_C As Date
  51. Dim fin1_C As Date
  52. Dim inicio2_C As Date
  53. Dim fin2_C As Date
  54. Dim inicio3_C As Date
  55. Dim fin3_C As Date
  56. Dim tiempo_C As Date
  57. Dim dia_C As String
  58. Dim fecha_C As Integer
  59. Dim semana_C As Integer
  60. Dim mes_C As String
  61. Dim año_C As Integer
  62. Dim npedido_C As Long
  63. Dim Totalhoras_C As Integer
  64.  
  65. 'Variables para las celdas de la Grilla
  66.  
  67. Dim lunes As String
  68. Dim martes As String
  69. Dim miercoles As String
  70. Dim jueves As String
  71. Dim viernes As String
  72. Dim sabado As String
  73. Dim domingo As String
  74. Dim Entrada As Integer
  75. Dim FilaG As Single
  76. Dim ColumnaG As Single
  77. Dim DatoG As Variant
  78. Dim SemanaActual As Integer
  79.  
  80. 'Variables contador
  81.  
  82. Dim x As Integer, s As Integer
  83.  
  84. ' ---------------------------------------------------------------------------
  85. ' \\ -- Descripción : Alternar color por Filas en Flexgrid
  86. ' ---------------------------------------------------------------------------
  87.  
  88.   Private Declare Function SetErrorMode Lib "kernel32" (ByVal wMode As Long) As Long
  89.   Private Declare Sub InitCommonControls Lib "Comctl32" ()
  90.  
  91.  
  92. ' ---------------------------------------------------------------------------
  93. ' \\ -- Función para Colorear por Filas
  94. ' ---------------------------------------------------------------------------
  95.  Private Sub pvSetColors(objFlexgrid As Object, ByVal lColor1 As Long, ByVal lColor2 As Long)
  96.       Dim iRow            As Long
  97.       Dim iCol            As Integer
  98.       Dim lCurrentColor   As Long
  99.  
  100.       With objFlexgrid
  101.       ' -- Desahbilitar el repintado del control para agilizar el trabajo
  102.          .Redraw = False
  103.           .BackColor = lColor1
  104.           ' -- Recorrer las filas
  105.          For iRow = 0 To .Rows - 1 Step 2
  106.               ' -- Establecer la Fila actual del flex
  107.              .Row = iRow
  108.               ' -- Recorre por columna y le aplica el color a la celda indicada de la fila actual
  109.              For iCol = 0 To .Cols - 1
  110.                   .Col = iCol
  111.                   .CellBackColor = lColor2
  112.               Next
  113.           Next
  114.           ' -- Reestablecer la propiedad Redraw para poder refrescar el control
  115.          .Redraw = True
  116.       End With
  117. End Sub
  118.  
  119.   Private Sub pvSetColors2(objFlexgrid As Object, ByVal lColor1 As Long, ByVal lColor2 As Long)
  120.       Dim iRow            As Long
  121.       Dim iCol            As Integer
  122.       Dim lCurrentColor   As Long
  123.  
  124.       With objFlexgrid
  125.       ' -- Desahbilitar el repintado del control para agilizar el trabajo
  126.          .Redraw = False
  127.           .BackColor = lColor1
  128.                   .Row = 6
  129.               ' -- Recorre por columna y le aplica el color a la celda indicada de la fila actual
  130.              For iCol = 0 To .Cols - 1
  131.                   .Col = iCol
  132.                   .CellBackColor = lColor2
  133.            Next
  134.           ' -- Reestablecer la propiedad Redraw para poder refrescar el control
  135.          .Redraw = True
  136.       End With
  137.   End Sub
  138.  
  139.  
  140. ' ---------------------------------------------------------------------------
  141. ' \\ -- Subrutina que Visualiza los datos en el MSFlexGrid1
  142. ' ---------------------------------------------------------------------------
  143. Private Sub VisualizarDatos()
  144.  
  145. Dim ContRegDias As Integer
  146. Dim ContDias As Integer
  147. Dim NrDia As Integer
  148.                  
  149. 'Calculamos el Nr. del dia de la semana.
  150.  
  151. Select Case dia_C
  152.  
  153.     Case Is = "lunes"
  154.          NrDia = 1
  155.     Case Is = "martes"
  156.          NrDia = 2
  157.     Case Is = "miercoles"
  158.          NrDia = 3
  159.     Case Is = "jueves"
  160.          NrDia = 4
  161.     Case Is = "viernes"
  162.          NrDia = 5
  163.     Case Is = "sabado"
  164.          NrDia = 6
  165.     Case Is = "domingo"
  166.          NrDia = 7
  167. End Select
  168.                  
  169. ContDias = 7
  170. ContRegDias = ContDias - NrDia
  171.  
  172. For ContRegDias = 7 To ContRegDias
  173.  
  174. ActualizarDatoG
  175.  
  176. ' Mostramos los datos en las celdas
  177. Select Case dia_C
  178.  
  179.     Case Is = "lunes"
  180.          MSFlexGrid1.TextMatrix(FilaG, 0) = DatoG
  181.     Case Is = "martes"
  182.          MSFlexGrid1.TextMatrix(FilaG, 1) = DatoG
  183.     Case Is = "miercoles"
  184.          MSFlexGrid1.TextMatrix(FilaG, 2) = DatoG
  185.     Case Is = "jueves"
  186.          MSFlexGrid1.TextMatrix(FilaG, 3) = DatoG
  187.     Case Is = "viernes"
  188.          MSFlexGrid1.TextMatrix(FilaG, 4) = DatoG
  189.     Case Is = "sabado"
  190.          MSFlexGrid1.TextMatrix(FilaG, 5) = DatoG
  191.     Case Is = "domingo"
  192.          MSFlexGrid1.TextMatrix(FilaG, 6) = DatoG
  193. End Select
  194. FilaG = FilaG + 1
  195. Next
  196.  
  197. End Sub
  198.  
  199.   ' --------------------------------------------------------------------------
  200. ' \\ -- Subrutina para actualizar los datos  leidos de Horas.dat.
  201. ' --------------------------------------------------------------------------
  202. Private Sub ActualizarDatoG()
  203. FilaG = 0
  204.  
  205. For FilaG = 0 To 6
  206.  
  207.      Select Case FilaG
  208.             Case 0
  209.             DatoG = inicio1_C
  210.             Case 1
  211.             DatoG = fin1_C
  212.             Case 2
  213.             DatoG = inicio2_C
  214.             Case 3
  215.             DatoG = fin2_C
  216.             Case 4
  217.             DatoG = inicio3_C
  218.             Case 5
  219.             DatoG = fin3_C
  220.             Case 6
  221.             DatoG = tiempo_C
  222. End Select
  223. Next
  224. End Sub
  225.  
  226.   ' --------------------------------------------------------------------------
  227. ' \\ -- Subrutina para abrir el archivo Horas.dat.
  228. ' --------------------------------------------------------------------------
  229. Private Sub AbrirArchivo()
  230.  
  231. Numero = FreeFile
  232. Open "Horas.dat" For Random As Numero Len = Len(Horas)
  233.  
  234. RegActual = 1
  235. ' Almacenamos la posición del último registro
  236. RegUltimo = LOF(Numero) / Len(Horas)
  237.  
  238. If RegUltimo = 0 Then
  239. RegUltimo = 1
  240. End If
  241.  
  242. End Sub
  243.  
  244. ' ---------------------------------------------------------------------------
  245. ' \\ -- Función para asignar los Datos de un registro del archivo Horas.dat a
  246. ' -----  las variables internas.
  247. ' ---------------------------------------------------------------------------
  248. Private Sub CargarDatos()
  249.  
  250. Get #Numero, RegUltimo, Horas
  251.  
  252. 'Asignamos contenidos de las variables con datos de Horas.dat.
  253. With Horas
  254.  
  255. inicio1_C = .inicio1
  256. fin1_C = .fin1
  257. inicio2_C = .inicio2
  258. fin2_C = .fin2
  259. inicio3_C = .inicio3
  260. fin3_C = .fin3
  261. tiempo_C = .tiempo
  262. dia_C = .dia
  263. fecha_C = .fecha
  264. semana_C = .semana
  265. mes_C = .mes
  266. año_C = .año
  267. npedido_C = .npedido
  268. Totalhoras_C = .Totalhoras
  269.  
  270. End With
  271.  
  272. End Sub
  273.  
  274. Private Sub Form_Load()
  275. Call pvSetColors(MSFlexGrid1, RGB(255, 255, 203), RGB(255, 255, 255))
  276. Call pvSetColors2(MSFlexGrid1, RGB(255, 255, 203), RGB(255, 234, 255))
  277.  
  278. Dim nrcol As Integer
  279. nrcol = 0
  280. npedido_C = 0
  281.  
  282. For nrcol = 0 To MSFlexGrid1.Cols - 1
  283.       ' Asignamos la Columa
  284.      MSFlexGrid1.Col = nrcol
  285.        ' Ahora podemos asignarle el tamaño que queramos
  286.      MSFlexGrid1.ColWidth(nrcol) = 960
  287. Next
  288.  
  289. AbrirArchivo
  290. CargarDatos
  291. VisualizarDatos
  292.  
  293. End Sub

aqui en este otro codigo esta el contenido del archivo Horas.dat de prueba ..

Código .dat:
Ver original
  1. þA†ÊSæ?7ŨáoSæ?                                 @Î*ÈE?viernes   abril     Ú#z   ªËí2Tæ?±ïØl«Tæ?¹ÄÉ$Uæ?Øwl¶Uæ?e+HVæ?lÁlÁVæ? @Î*ÈE(?viernes   abril     Ú#z   '“TkWæ?K~±äWæ?µŒ=Xæ?î2TvXæ?                  è´N?viernes   abril     Ú#z   ÌâN§â?ðÍ«‰§â?ᐖñ¡§â?ðØl«”¨â?¾y5ñ¬¨â?ÿ Ce‡©â? ¸šxV42?domingo   abril     Ú#z   cÔð·)Fì?ζJ‰rFì?œWÏŠFì?:m*ÓFì?                 ÀšxV4?lunes     abril     Ú#z   y@²Î•Gì?Ház®Gì?                                  Ï*ÈEè>lunes     abril     Ú#z

abierto desde el Bloc de notas.

Un saludo
  #28 (permalink)  
Antiguo 19/04/2010, 14:14
Avatar de 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

Hola:

Asi analizando un poco por encima veo que estas utilizando la misma variable FilaG en dos sitios diferentes:

Si miras esta parte de tu código

For ContRegDias = 7 To ContRegDias
ActualizarDatoG
' Mostramos los datos en las celdas
Select Case dia_C
Case Is = "lunes": MSFlexGrid1.TextMatrix(FilaG, 0) = DatoG
Case Is = "martes": MSFlexGrid1.TextMatrix(FilaG, 1) = DatoG
Case Is = "miercoles": MSFlexGrid1.TextMatrix(FilaG, 2) = DatoG
Case Is = "jueves": MSFlexGrid1.TextMatrix(FilaG, 3) = DatoG
Case Is = "viernes": MSFlexGrid1.TextMatrix(FilaG, 4) = DatoG
Case Is = "sabado": MSFlexGrid1.TextMatrix(FilaG, 5) = DatoG
Case Is = "domingo": MSFlexGrid1.TextMatrix(FilaG, 6) = DatoG
End Select
' Aunque aquí sumas 1 a Fila G no sirve de nada porque en la anterior
' ActualizarDatos varías siempre su contenido

FilaG = FilaG + 1
Next

Creo que por ahí van los tiros ya que como comenté en alguna ocasión cada uno tiene sus porpias técnicas y es dificil introducirse en la idea de otro.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #29 (permalink)  
Antiguo 20/04/2010, 00:11
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

Hola erbunson!

Es cierto que utilizo otra tecnica, tengo intención de usar he ir por donde tu me estas enseñado pero aunque he comprendido el concepto estoy probando a un nivel mas basico para hacerme con el VB. En mi codigo mi intencion es con la función "AbrirArchivo" realizo lo que dice, simplemente abrir el archivo "Horas.dat" posteriormente en la función "CargarDatos" leo los datos de este y se los asigno a las variables que corresponden a un solo registro y columna, pasamos a la función "VisualizarDatos" que es donde pretendo introducir los datos de las variables a las celdas del MsFlexgrid donde en el 1er case pretendo saber del registro leido detectar que dia de la semana es, una vez identificado (lunes =1, martes = 2, etc.) y dentro del bucle inicial con "ActualizarDatos" en este bucle identificar la fila y asignarle el valor que le corresponde o DatoG hasta finalizar todos los datos de una columna que es un dia, creo que me falta un For aqui, pero lo que me preocupa es que no me visualiza nada de nada, como minimo una sola celda aunque este mal y asi por lo menos saber por donde he de ir. ¿Porque en teoria deberia como minimo grabar una celda?

Erbunson en este pos http://www.forosdelweb.com/f69/funci...a-todo-798738/ pretendo borrar el 1er registro que comentaba yo antes, mi idea o es lo que pretendo para poderlo realizar es mediante un bucle y con dos archivos abiertos uno el original y a variar "Horas.dat" y otro el "Temporal.dat" es copiar del Horas.dat empezando por el 2º registro y grabarlo al Temporal.dat asi registro a registro hasta el ultimo del Horas.dat, una vez copiados todos menos el primero al Temporal.dat, cierro ambos registros y renombro el Temporal por Horas.dat con lo que en teoria el Horas.dat ahora tiene un registro menos (el 1º) . ¿Podrias indicarme donde cometo el error para que no me funciones?

Un saludo

Última edición por XYON126; 20/04/2010 a las 00:28
  #30 (permalink)  
Antiguo 20/04/2010, 06:08
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Importar de un .dat o txt a MSFlexGrid

hola erbunson!


Aqui he encontrado parte del error, he cogido todo el codigo y lo he simplificado sin sentencias intermedias o rutinas para ver donde se me colapsaba y parte era debido a que al entrar los datos a la variable dia_C de .dia no he tenido en cuenta que en Horas.dat el tamaño de .dia es siempre el mismo, ya sea lunes o martes con lo que si no Trimaba el resultado lo de dia_C no era igual a lo del case es decir .:

dia_C = " lunes" y

case "lunes" ya que el primero tenia tres espacios y en el otro no, he variado esto .:

dia_C = Trim(.dia)

en vez de

dia_C = .dia

ahora se me rellena la grilla pero me falta ordenarla y que no me coja datos de una semana por otra.

Por otro lado, ahora he empezado a aplicar lo por ti comentado con funciones iniciales o modulos, he creado un modulo.bas con por ejemplo el GridponerDatos y al ejecutar el programa en la linea donde lo llamo me da el error "Procedimiento Sub o funcion no definida" ¿A que es debido eso? Lo he probado con Modulo.bas y de clase e idem de idem incluso como funcion dentro del formulario.

Aqui te pongo la parte del codigo donde lo llamo :

Código vb:
Ver original
  1. ' ---------------------------------------------------------------------------
  2. ' \\ -- Subrutina que Visualiza los datos en el MSFlexGrid
  3. ' ---------------------------------------------------------------------------
  4. Private Sub VisualizarDatos()
  5.                
  6. 'Mostramos los datos en las celdas
  7. Select Case dia_C
  8.  
  9.     Case "lunes"
  10.          GridPonerDato MSFlexGrid, 0, 0, inicio1_C
  11.          GridPonerDato MSFlexGrid, 1, 0, fin1_C
  12.          GridPonerDato MSFlexGrid, 2, 0, inicio2_C
  13.          GridPonerDato MSFlexGrid, 3, 0, fin2_C
  14.          GridPonerDato MSFlexGrid, 4, 0, inicio3_C
  15.          GridPonerDato MSFlexGrid, 5, 0, fin3_C
  16.          GridPonerDato MSFlexGrid, 6, 0, tiempo_C
  17.          
  18.          'MSFlexGrid.TextMatrix(0, 0) = inicio1_C
  19.         'MSFlexGrid.TextMatrix(1, 0) = fin1_C
  20.         'MSFlexGrid.TextMatrix(2, 0) = inicio2_C
  21.         'MSFlexGrid.TextMatrix(3, 0) = fin2_C
  22.         'MSFlexGrid.TextMatrix(4, 0) = inicio3_C
  23.         'MSFlexGrid.TextMatrix(5, 0) = fin3_C
  24.         'MSFlexGrid.TextMatrix(6, 0) = tiempo_C
  25.  
  26. 'Aqui faltan el resto de dias que son igual pero con columna diferente.
  27.      
  28. End Select
  29. End Sub

Y la parte del codigo en el Modulo es esta:

La de cabecera es identica y esta igual aunque la he de modificar pues no tengo cabecera y tampoco la llamo en ninguna parte.

Código vb:
Ver original
  1. Private Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2.  
  3. ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  4. If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  5.     Grid.CellAlignment = 4
  6.     Grid.TextMatrix(Fila, Columna) = Dato
  7. End Sub

Es practicamente igual a la tuya solo le he añadido una linea para centrar los datos en la celda.

Un saludo

Última edición por XYON126; 21/04/2010 a las 02:17

Etiquetas: txt
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:06.