Visual Basic Consejos y "bugs"

 

Actualizado el 30/Jul/2003



No se va a contar aquí cómo debéis actuar, 8-), sólo lo que pueden ser "buenos" consejos sobre la forma de programar... (a ver si le damos ejemplo a los programadores de Pascal o C++ que todavía se creen que el BASIC es GWBASIC...)
También, voy a incluir aquí los problemillas que podemos encontrarnos por culpa de los "bugs"


Lo que hay hasta ahora:

  1. Sobre los controles de VB4 32bits y VB5cce
  2. Una programación más ordenada (25/Dic/96)
  3. Bug del objeto Printer en VB4 (01/Mar/97)
  4. Convertir el código de los listados para usarlo con VB3 (siete consejos prácticos)
  5. Quitar del VBP los controles no usados (25/Ago/97)
  6. Visual Basic y el año 2000 (o cómo maneja el VB los años de dos cifras) (19/Feb/1998)

  7. Ejemplo de uso del control TabStrip (03/Mar/98)
  8. Ejemplo de uso del control CoolBar (05/Dic/2000)
  9. Ejemplo de uso del control Treeview (05/Oct/2002)
  10. Ejemplo de uso del control ListView (06/Oct/2002)
  11. Link al índice de controles especiales de Visual Basic (06/Oct/2002)

  12. Cuidado al dimensionar varias variables con un solo DIM (11/Ene/2003)


Sobre los controles de VB4 32bits y VB5cce

Ten cuidado con los programas que hagas, si tienes instalados los controles COMDLG32.OCX y COMCTL32.OCX que vienen con VB5cce. Ya que al utilizarlos en máquinas en las que no están instalados, seguramente no te funcionarán.
Además si pretendes usarlos en el propio IDE de Visual Basic, tampoco te funcionarán.
Yo tengo en el equipo de mi casa instalado VB5cce. Cuando hago allí los programas, tengo que modificarlos para poder usarlos en el ordenador de la oficina, en el que no tengo el VB5 instalado.
Y no estoy diciendo que es porque estén compilados con VB5, sino que lo están en VB4.
Es decir, que lo hago en VB4 en mi casa, con los controles de la versión 5 y da error al usarlo en el VB4 de la oficina.


Una programación más ordenada (25/Dic/96)

De: "A. David Garza Marín" <adgarza@spin.com.mx>
Te envío mi truco para hacer una programación más ordenada. Me refiero a que siempre es problema estarse metiendo a ver cual de los botones de opción (Option Buttons o Radio Buttons) es el que está seleccionado, lo común es crear una serie de IF-THEN-ELSEs que pueden resultar un poco difíciles de seguir, pero ¿Qué tal si haces esto?

Select Case True
Case Option1
    ' Tu código va aquí
Case Option2
    ' Tu segundo código va aquí
Case Optionn
    ' Tecleas el código de los options necesarios
Case Else
    ' ¿No hay ninguno? O uno que no haya sido contemplado, pues.
End Select

Es más organizado ¿No? 


Bug del objeto Printer en VB4: (1/Mar/97)

Este bug está en las Knowledge Base de Microsoft, pero lo pongo aquí para los que no quieren "estar dando tumbos"

 

BUG: Printer Object Font Information is Lost After Printing

Article ID: Q153125
Creation Date: 28-JUN-1996
Revision Date: 09-OCT-1996

The information in this article applies to:

Standard, Professional, and Enterprise Editions of Microsoft Visual Basic, 16-bit and 32-bit, version 4.0

SYMPTOMS

The printer object loses all of its font information, including font size, boldness, underlining, etc., after an initial call to Printer.Print has been made.

WORKAROUND

To work around this problem, add the following statements to the beginning of the Command1_Click procedure, as shown in the following example:

   Sub Command1_click()
     Dim PrinterFont As String   '*
     Printer.Print ""            '* Initialize printer object's device
                                 '* context
     PrinterFont = Printer.Font  '* Retrieve current font name
     Printer.Font = ""           '* Clear current font details
     Printer.Font = PrinterFont  '* Reset font information
     Printer.fontsize = 36
     Printer.fontbold = true
     Printer.fontitalic = true
     Printer.fontunderline = true
     Printer.print "This is a test"
     Printer.enddoc
   End Sub

  Each time the Command button is pressed, the output should print correctly.  

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

MORE INFORMATION

Steps to Reproduce Problem

  1. Start Visual Basic with a New Project.
  2. Add a Command button to the form.
  3. Add the following code to the Click event of the Command button:

    Sub Command1_click()

          printer.fontsize = 36
          printer.fontbold = true
          printer.fontitalic = true
          printer.fontunderline = true
          printer.print "This is a test"
          printer.enddoc
    

    End Sub

  4. Run this program and press the Command button. The output should have printed correctly.
  5. Press the Command button again. This time the output will have lost all of its font attributes.

Convertir/adaptar el código de los listados para usarlo con VB3 (2/Abr/97)

Si sigues estos consejos, podrás adaptar los listados presentados en muchas de las utilidades y proyectos, para que funcionen con VB3 (incluso VB2).
Lo primero que no debes hacer es cargar los formularios, ya que te dará error diciéndote que no son válidos. En muchos casos estoy poniendo una imagen de los formularios para que veas la distribución de los controles: crea tus propios formularios con el VB3.

Los consejos que he incluido son:

  1. Las constantes condicionales y el uso de #If... #Then... #Else... #End If.
  2. Las Propiedades de los Forms.
  3. Convertir los Boolean en Integer.
  4. Cambiar los Private y Public por Dim y Global respectivamente.
  5. Las declaraciones de funciones APIs llevarlas a un módulo BAS.
  6. El uso de With ... End With.
  7. Las constantes "implícitas".

1.- Las constantes condicionales y el uso de #If... #Then... #Else... #End If.
Todas las declaraciones que te encuentres con #If Win32 debes obviarlas, usa las que estén después del #Else
O bien usa las que puedan estar después de #If Win16
VB3 no acepta la compilación condicional. Y estas están "reflejadas" con que empiezan los IF...Then...Else...End If con el símbolo # (número o hash, como prefieras)
En caso de que hubiese otras, deberás crearte dos archivos cada uno con el bloque correspondiente.
Me explico: Si tienes esto

#Const Test=0 'También puede estar declarado en las propiedades del proyecto.
'...
#If Test Then
    'Si Test tiene un valor distinto de 0 (cero)
#Else
    'Si no está declarado Test o tiene un valor 0 (cero)
#End If

Deberás saber que VB4 usa el valor de la constante de compilación Test (no la confundas con una constante normal) y actúa sobre el código según sea ese valor. En caso de que la parte del código no esté dentro de la condición, VB lo ignorará por completo, no haciendo ningún tipo de "chequeo" incluso si se pide que se ejecute con Compilación Completa (Ctrl+F5)
Para convertir este código a VB3, bien haces lo que te he sugerido de dos archivos o bien la conviertes en una Constante normal y corriente. Quitándole posteriormente los símbolos #.

IMPORTANTE: Ésto sólo es válido para constantes definidas por el usuario, no para las Win32 o Win16


 

2.- Las Propiedades de los Forms.
VB3 no usa las propiedades de los form, así que si ves algún Public en un form, conviértelo a un Global en un módulo bas.
Por ejemplo para usar la propiedad Cancelado del FormX, estaría así declarado en las declaraciones del Form:
Public Cancelado As Integer
Crea, o usa, un módulo bas y añadele la siguiente declaración:
Global Cancelado As Integer
Después verás que cuando se usa en el código estará el nombre del Form delante de la variable, cámbialo quitándole el nombre del Form.
If Fom1.Cancelado Then sería If Cancelado Then


 

3.- Convertir los Boolean en Integer.
Pues eso, convierte todas las declaraciones del tipo Boolean a Integer
Dim Cancelado As Boolean sería Dim Cancelado As Integer


 

4.- Cambiar los Private y Public por Dim y Global.
Las declaraciones Private significan que son de uso exclusivo del módulo o form en el que están declarados, por tanto todos los Private (excepto para las declaraciones API) debes cambiarlas por Dim
Private Cancelado As Boolean sería Dim Cancelado As Integer
Por otro lado las variables y constantes Public son lo mismo que Global, así que no tiene más misterio...
En el caso de que la declaración Public esté en un formulario, sigue
el consejo del punto 2.


 

5.- Las declaraciones de funciones APIs llevarlas a un módulo BAS.
Las declaraciones de las funciones de llamada al API de Windows que estén en un Formulario, tendrán la palabra Private delante del Declare. Copia esa Declaración y pégala en un módulo Bas. Fíjate que los nombres de las librerías no incluyan el 32 que son referentes al API de 32 bits.
Por ejemplo User32, Kernel32, GDI32 deben ser User, Kernel y GDI respectivamente.
En el directorio FTP hay archivos con las declaraciones para el API de 16 bits (Windows 3.x) y las del API de 32 bits (Windows 95 y NT)
Las declaraciones del API de 16 bits también funcionarán en Windows 95.
Si quieres bajar los archivos TXT con las declaraciones,
pásate por la página del VB-API.


6.- El uso de With... End With.
Esta instrucción es medianamente fácil de convertir. De lo que se trata es de "englobar" todas las asignaciones y cambios de propiedades de un objeto o form para no tener que estar indicando el nombre de ese objeto en cada uso o asignación de una propiedad. ¿Comooor? que no "tas coscao"? Veamos un example:

With MiForm
    .Caption = "Form del Guille"
    .Left = 0
    .Top =0
    .Show vbModal
End With

'Este código quedaría así:
MiForm.Caption = "Form del Guille"
MiForm.Left = 0
MiForm.Top =0
MiForm.Show 1

7.- Las constantes implícitas.
El VB4 usa una serie de constantes que el VB3 ni "se cosca" de que existen. Recuerdas el consejo de que uses el CONST.TXT, pues por ahí van los tiros.
Por ejemplo para convertir algunas de las más habituales:

'Show de los Forms
vbModal			1
vbModalness		0
'MouseIcon
vbDefault		0
vbArrow			11
'WindowSate
vbNormal		0
vbMinimized		1
vbMaximized		2
'Valores devueltos por MsgBox
vbOK			1	Aceptar
vbCancel		2	Cancelar
vbAbort			3	Abortar
vbRetry			4	Reintentar
vbIgnore		5	Ignorar
vbYes			6	Sí
vbNo			7	No
'Agurmentos de MsgBox
vbOKOnly		0	Sólo botón Aceptar (predeterminado).
vbOKCancel		1	Botones Aceptar y Cancelar.
vbAbortRetryIgnore	2	Botones Abortar, Reintentar e Ignorar.
vbYesNoCancel		3	Botones Sí, No y Cancelar.
vbYesNo			4	Botones Sí, No.
vbRetryCancel		5	Botones Reintentar y Cancelar.
'Valores para los iconos
vbCritical		16	Mensaje crítico.
vbQuestion		32	Consulta de advertencia.
vbExclamation		48	Mensaje de advertencia.
vbInformation		64	Mensaje de información.
'Botón por defecto
vbDefaultButton1	0	El primer botón es predeterminado (predeterminado).
vbDefaultButton2	256	El segundo botón es el predeterminado.
vbDefaultButton3	512	El tercer botón es el predeterminado.
vbApplicationModal	0	Cuadro de mensaje modal de la aplicación (predeterminado).
vbSystemModal		4096	Cuadro de mensaje modal del sistema.

vbCrLf			Chr$(13) & Chr$(10)
vbCr			Chr$(13)
vbLf			Chr$(10)

Si se me ocurren más cosas, iré añadiéndolas a esta lista.
Por cierto, ¿aún te estás pensando el cambiarte al VB4?


5.- Quitar del VBP los controles no usados (25/Ago/97)

Desde hace tiempo que vengo recibiendo consultas y la gente me manda código con ejemplos y todo eso, no me quejo por ello, lo que me fastidia un poco es encontrarme los archivos VBP con referencias a controles y librerías que no se usan en el proyecto, no es difícil encontrarse con cosas como estas:

Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.0#0; COMDLG32.OCX
Object={BDC217C8-ED16-11CD-956C-0000C04E4C0A}#1.0#0; TABCTL32.OCX
Object={3B7C8863-D78F-101B-B9B5-04021C009402}#1.0#0; RICHTX32.OCX
Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.0#0; COMCTL32.OCX
Object={FAEEE763-117E-101B-8933-08002B2F4F5A}#1.0#0; DBLIST32.OCX
Object={00028C01-0000-0000-0000-000000000046}#1.0#0; DBGRID32.OCX
Reference=*\G{BEF6E001-A874-101A-8BBA-00AA00300CAB}#2.0#0#C:\WINDOWS\SYSTEM\OLEPRO32.DLL#Standard OLE Types

Reference=*\G{00025E01-0000-0000-C000-000000000046}#3.0#0#C:\ARCHIVOS DE PROGRAMA\ARCHIVOS COMUNES\MICROSOC:\ARCHIVOS DE PROGRAMA\A#Microsoft DAO 3.0 Object Library

Y no digo nada de los que tienen la versión Empresarial, ya que el número de controles aumenta.
Esto realmente no es ninguna complicación, al menos para mi, ya que tengo la costumbre de editar el VBP y quitarle las referencias... cuando realmente las necesite, el propio VB me avisará.

El mayor problema que esto puede representar es que al crear un ejecutable, el Setup Wizard crea que necesita todos esos controles y los añada a los discos de instalación, haciendo que de esta forma crezca, innecesariamente, el número de discos necesarios.

Yo tengo "modificados" mis ficheros VBP, los que usa el VB por defecto, dejándo sólo lo que normalmente uso: es decir nada...
Aquí lo tienes: (Auto32ld.vbp)

Reference=*\G{BEF6E001-A874-101A-8BBA-00AA00300CAB}#2.0#0#C:\WINNT\SYSTEM32\OLEPRO32.DLL#Standard OLE Types

Name="Project1"

Así que si queréis esta recomendación, apuntárosla: Quita del AutoXXld.vbp los controles que no suelas usar y después añades los que necesites...


 11.- Cuidado al dimensionar varias variables con un solo DIM (11/Ene/03)

Me imagino que si eres una persona que habitualmente visitas estas páginas o has leído el Curso Básico de Programación, (aunque sólo hayan sido las primeras entregas), esto que voy a contarte no será aplicable a ti, eso espero... pero es casi lamentable que se vea este error que te voy a comentar y si te preguntas porqué lo digo ahora, cuando se supone que la gente ya debería saberlo, es por la sencilla razón de que hoy he estado viendo un par de ejemplos en VB clásico, no voy a decir ni de quién ni de dónde, ya que eso no viene al caso, pero casualmente en esos dos ejemplos hacían las declaraciones de la misma forma: usaban una sola instrucción Dim para declarar varias variables, pero sólo usaban un tipo de datos, por ejemplo:

Dim a, b, c, d As Integer

Después usaban todas esas variable como si fuesen del tipo Integer, pero sólo la variable "d" sería del tipo Integer, el resto serán del tipo por defecto, en este caso del tipo Variant.

Este caso en Visual Basic .NET no tendría problemas, ya que en VB.NET todas serían del tipo Integer, pero en las versiones clásicas de VB eso no es así.

Así que, por favor, si declaras variables de esta forma, deberías saber que el tipo sólo se aplica a la última variable, el resto será del tipo por defecto, es decir Variant.

Échale un vistazo a la página de VB-Novatos para algunas aclaraciones sobre algunos usos "correctos", por ejemplo, para evitar que las variables por defecto sean Variant.

Tendré que revisar el código que tengo publicado no sea que tenga algo como esto... ¡espero que no!

 


Lo dicho: ¡Animaros! Incluso si pensáis que es una "chorrada" y que "seguro que ya lo saben", algunas veces lo obvio para uno no lo es tanto para otros...

 

ir al índice