Curso Básico de Programación
en Visual Basic
Soluciones de la
entrega Quince.
Fecha: 23/Mar/98
1.- Comprobar que no tenga más de 32000 caracteres y en caso de que el fichero los tenga, no abrirlo.
'Esta es la parte que se encarga de abrirlo, el código anterior lo he omitido 'Asignamos el nombre del fichero sFichero = Text1.Text If Existe(sFichero) Then Text2.Text = "" i = FreeFile Open sFichero For Input As i tamFic = LOF(i) If tamFic <= 32000 Then Text2.Text = Input$(tamFic, i) End If Close i 'Una vez abierto, no está modificado Modificado = False End IfEn este caso, lo único que hay que hacer es comprobar si el tamaño es menor o igual al máximo indicado, si es así, abrir el fichero, por tanto, sólo tendremos que poner la parte que asigna al Text2 el contenido del fichero, dentro de la comparación.
2.- En caso de que sea mayor de 32000 caracteres, leer sólo los 32000 primeros.
La solución es casi como la anterior, bueno, casi, es decir tendremos que hacer una comparación y en caso del que sea cierta, asignar a la variable que indica el número de caracteres a leer el valor máximo que queremos.
'Asignamos el nombre del fichero sFichero = Text1.Text If Existe(sFichero) Then Text2.Text = "" i = FreeFile Open sFichero For Input As i tamFic = LOF(i) ' If tamFic > 32000 Then tamFic = 32000 End If Text2.Text = Input$(tamFic, i) Close i 'Una vez abierto, no está modificado Modificado = False End IfPor tanto comprobamos si el contenido de tamFic es mayor de 32000, en caso de ser cierto, se cumple la condición, asignamos este valor a esa variable, de esta forma sólo se leerán esos caracteres.
3.- Si el tamaño es mayor de 32000 no poder guardarlo (y como extra: no poder editarlo)
Para conseguir esto, debemos aprovechar el código usado en la segunda solución, de forma que si es mayor de 32000, podamos asignar un flag, para saber que no se debe guardar.
También podríamos evitar que se modificase el contenido del TextBox, esto se consigue asignando la propiedad Locked a True. De esta forma no se podrá escribir en el TextBox. Por supuesto que en caso contrario se debería permitir la escritura, ahora veremos cómo hacer estas cosas.Veamos las cosas por partes:
'Asignamos el nombre del fichero sFichero = Text1.Text If Existe(sFichero) Then Text2.Text = "" i = FreeFile Open sFichero For Input As i tamFic = LOF(i) 'Nos aseguramos que se pueda editar Text2.Locked = False Text2.ForeColor = vbWindowText If tamFic > 32000 Then tamFic = 32000 'Si el tamaño no es el leido, 'no permitir escribir Text2.Locked = True 'si además cambiamos el color... mejor Text2.ForeColor = vbGrayText End If Text2.Text = Input$(tamFic, i) Close i 'Una vez abierto, no está modificado Modificado = FalseEn esta primera solución, aún no evitamos que se pueda guardar, pero al menos cambiamos el color del texto y evitamos que se pueda modificar el contenido, para ello he cambiado el valor de la propiedad ForeColor, usando dos constantes predefinidas, la primera es para asignar el color normal del texto y la segunda es para asignar el color Gris cuando no podamos escribir en el TextBox, la ventaja de usar estas constantes, al menos con el VB5, es que si cambias los colores, usando el panel de control de Windows, estos se usan de forma automática al asignarlos con estas constantes.
Ahora pasemos a ver cómo evitar que se guarde, cuando se abra parcialmente un fichero.
Para ello necesitaremos otra variable a nivel de módulo:
Dim PoderGuardar As BooleanCon esta indicaremos que podemos o no guardar el contenido del TextBox.
Se asignará al abrir el fichero y se comprobará al guardarlo.
Veamos al completo los procedimientos de Abrir y Guardar:Private Sub cmdAbrir_Click() 'Abrir Dim i As Long, tamFic As Long Dim sTmp As String If Modificado Then If MsgBox("El texto se ha modificado..." & vbCrLf & _ "¿Quieres guardarlo?", vbQuestion + vbYesNo) = vbYes Then 'Conservar el nombre actual sTmp = Text1.Text 'y asignar el anterior Text1.Text = sFichero 'guardarlo... cmdGuardar_Click 'Volvemos a dejar el Text1 como estaba Text1.Text = sTmp End If End If 'Asignamos el nombre del fichero sFichero = Text1.Text If Existe(sFichero) Then Text2.Text = "" i = FreeFile Open sFichero For Input As i tamFic = LOF(i) 'Nos aseguramos que se pueda editar Text2.Locked = False Text2.ForeColor = vbWindowText 'y que se pueda guardar PoderGuardar = True If tamFic > 32000 Then tamFic = 32000 'Si el tamaño no es el leido, 'no permitir escribir Text2.Locked = True 'si además cambiamos el color... mejor Text2.ForeColor = vbGrayText 'No permitir que se guarde PoderGuardar = False End If Text2.Text = Input$(tamFic, i) Close i 'Una vez abierto, no está modificado Modificado = False End If End Sub Private Sub cmdGuardar_Click() 'Guardar Dim i As Long Dim SobreEscribir As Boolean 'Sólo se ejecuta el código si se puede guardar If PoderGuardar Then 'Se asigna el valor Verdadero, por si no existe SobreEscribir = True 'Si ya existe, preguntar If Existe(Text1.Text) Then If MsgBox("ATENCIÓN, el fichero ya existe." & vbCrLf & _ "¿Quieres sobrescribirlo?", vbQuestion + vbYesNo) = vbNo Then 'Hemos contestado que no, así que... SobreEscribir = False End If End If 'Si no existe o se quiere sobrescribir... If SobreEscribir Then i = FreeFile Open Text1.Text For Output As i Print #i, Text2.Text Close i 'Ya hemos guardado las modificaciones Modificado = False sFichero = Text1.Text End If End If End Sub
Pues creo que esto es todo...
Una cosa que me gustaría que hicieras, al menos así aprenderías más, es que intentaras entender las soluciones, no te limites a copiarlas, sin saber el porqué de su uso... por supuesto que no sólo hay una solución y si la que tu has encontrado, sirve para lo mismo, pues mejor aún.Aquí tienes el código para usar dos controles Text2, échale un vistazo a las comparaciones realizadas para poder saber si se ha modificado y esas cosas, ya que ahora vas a trabajar con dos controles, como si sólo fuese uno...
Que lo disfrutes y prueba a experimentar otras posibilidades...
Nos vemos.
Guillermo