Diferencias con Visual Basic

Mientras Gambas no intenta ser un clon de Microsoft Visual Basic, utiliza BASIC y hay varias similitudes entre los dos lenguajes, y algunas relaciones en las características.

Posiblemente hay más similitudes que diferencias, pero no puedes copiar un proyecto de VB e intentar compilarlo bajo Gambas.

El símbolo %vb% aparecerá algunas veces en las páginas de esta documentación, para indicar que hay notas disponibles que enseñan a usar la característica descrita en esa página y que difiere de la forma de ejecutar la misma tarea en VB. La intención es ayudar a aquellos programadores que esten migrando a Gambas desde ese lenguaje.

Diferencias no referentes al lenguaje

  • En VB el código de cada formulario y el objeto formulario están incluidos en el mismo archivo. Gambas usa dos archivos separados para ello: archivo .form y un archivo .clase .

  • Extensiones de los archivos:

Tipo de Archivo Visual Basic Gambas
Archivo de definición del proyecto .vbp .project (uno por directorio)
Módulo .bas .module
Archivo de Class .cls .class
Archivo de definición del Form .frm .form
Archivos de recursos binarios .frx Algún otro archivo almacenado en el directorio del proyecto.

  • Los proyectos de Gambas se definen con un directorio que tiene un archivo .project dentro, y todos los arhivos en ese directorio. VB permite tener múltiples archivos de proyecto en distintos directorios, o usar el mismo archivo fuente de un directorio en distintos proyectos, lo que tiene sus ventajas y sus inconvenientes.

  • Las medidas de la pantalla se hacen en VB en "twips", que son un 1/1440 de pulgada; en Gambas se hacen en píxeles reales.

  • Los controles de los Form son privados por defecto en los programas de Gambas. Se puede cambiar este comportamiento en las Propiedades del Proyecto, marcando el recuadro "Los controles del formulario son públicos".

  • Las funciones de conversión Str$, Val, CStr... se comportan de forma distinta. Por ejemplo, Str$ y Val usan la configuración de idioma puesta en Gambas, mientras que no hacen eso en Visual Basic. Lea la documentación atentamente para más detalle, pero parece que el comportamiento de Gambas es más lógico :-).

Lo que VB tiene y Gambas no

  • No se puede editar el código en modo de depuración en Gambas; es necesario detener la ejecución del programa.

  • En Gambas, los tipos de datos simples (Integer, String, etc.) se pasan por valor a los procedimientos y funciones. No se pueden pasar por referencia como en Visual Basic. Recuerde que VB pasa los parámetros por referencia si no se usa la palabra clave ByVal, así que tenga cuidado cuando intente portar un proyecto VB. También se pasan siempre por referencia el contenido de los tipos de datos objeto (array , collections, objects) en ambos lenguajes.

Pasar argumentos por referencia, ahora es posible en la versión en desarrollo.

  • No existe nada parecido a una global para todo el proyecto en Gambas. Para simularlo se puede hacer una clase llamada Global y declarar las variables globals como variables públicas estáticas de esa clase, entonces se puede referir a ellas como Global.nombre_de_la_variable en todo el proyecto. No es una práctica de programación muy elegante, pero al menos funcionará como una variable global cuando quiera usarla ;)

  • En un módulo de VB, a no ser que incluya la frase Option Explicit, no necesita declarar las variables antes de usarlas. Gambas se comporta como si Option Explicit estuviera siempre activo, lo que mejora mucho el código a expensas de trabajar un poquito más.

  • No hay nada en Gambas equivalente a la propiedad Index de los controles en los formularios de VB. Es muy fácil crear arrays de controles, pero hay que hacerlo mediante código. No hay en la actualidad ninguna forma de hacerlo gráficamente. Por tanto, cuando copie y pegue un control, en lugar de preguntar si desea hacer un array de controles, lo que hace Gambas automáticamente es renombrar el control copiado con un nombre adecuado.

  • No se pueden crear labels transparentes en Gambas; el fondo es siempre opaco.

Ahora es posible hacerlo en la versión en desarrollo.

  • El evento MouseMove solo ocurre en Gambas cuando hay pulsado un botón del ratón. La única excepción es el control DrawingArea, que tiene una propiedad Tracking para poder seguir los eventos del ratón incluso si no se ha pulsado ningún botón.

  • En VB se pueden unir dos strings con el símbolo + . Como en Gambas el signo + sólo se usa para la suma matemática, deberá usar & cuando quiera unir dos string.

  • El simbolo de dos puntos : no sirve para separar el código. Debe ponerlo en una nueva linea para esto.

  • En VB 3.0 el comando Print no añadía un retorno de carro. Si solía usar para imprimir texto la instrucción printer.print, el texto se perdía. La instrucción Print en Gambas pone todo en una línea. No se pierde nada.

  • En VB se puede usar Mid$() como una instrucción para quitar una subcadena y poner otra dentro de una cadena. En Gambas, no puede usarlo para asignarle u na subcadena al resultado. Por ejemplo, en VB: MiString = "El perro salta": Mid$(MiString, 5, 3) = "zorro" devuelve en MiString = "El zorro salta". Eso no funciona en Gambas. Tendrá que hacer cosas como: MiString = Left$(MiString, 4) & "zorro" & Mid$(MiString, 8).

Esta syntax de la función Mid$(), ahora es posible en la versión en desarrollo.

  • Algunos de los caracteres que se pueden usar en el código de VB como identificadores, tales como el subrayado ("_"), no se aceptan en Gambas.

  • Afortunadamente, en Gambas no puede ¡usar GOTO para capturar errores! En su lugar use CATCH, FINALLY o TRY .

  • ENUM no puede ser usado para enumerar constantes de tipo Integer. En su lugar, usted tiene que definir cada elemento ENUM como una constante.

Examples

 CONST SUMA AS Integer = 1
 CONST RESTA AS Integer = 2

Lo que Gambastiene y VB no

  • Al contrario que con VB, no necesita compilar el soporte gráfico si quiere escribir una aplicación de consola en Gambas. Tan solo debe quitar la selección al componente gb.qt4 en las Propiedades del Proyecto y asegurarse de que ha definido un Sub Main().

  • En lugar de la palabra clave WITH EVENTS, Usted debe establecer un "nombre de evento" a los objetos que provocan eventos. Vea la documentación de NEW para más información.

  • Gambas tiene el concepto de grupos de controles, lo que permite manejar eventos de cualquier número de controles distintos dentro de una única subrutina. Esto reduce código redundante y puede usarse para hacer la mayoría de las cosas que los index de los controles de VB hacen, y algunas cosas que VB no puede hacer.

  • Mientras que VB es imposible ejecutar un programa de forma síncrona y recibir su salida sin aprender a hacer llamadas a la API de windows (Shell simplermente lanza el programa, sin esperar nada) Gambas permite hacerlo usando SHELL y EXEC, controlar el proceso que inicia usando la clase Process, e incluso leer y escribir en el proceso, lo que facilita añadir funcionalidades a aplicaciones y asistentes. Esto hace que sea muy fácil escribir interfaces gráficas con Gambas para casi cualquier programa de consola

  • Se puede hacer todo lo anterior con los dispositivos de Unix y archivos especiales también, como puertos serie o paralelo. Use el sistema de archivos /proc para escribir un monitor RAID, por ejemplo, o use una tubería para obtener múltiples canales de información desde el back-end de un programa hecho en cualquier otro lenguaje.

  • Para hacer una ventana con formas extrañas, solo hay que asignar la ME.Picture y la propiedad ME.Mask de la ventana usando una imagen que tenga áreas transparentes. VB necesita para eso llamadas a la API y algo más de trabajo.

  • Se pueden crear controles y menús de forma dinámica, tan sólo necesita instanciarlos con la instrucción NEW.

  • Se puede insertar un formulario de Gambas dentro de otro: cuando instancie el primero, especifique el segundo como parent.

  • Los controles tienen los eventos Enter y Leave, lo que le permite saber cuando el puntero del ratón entra en un control y cuando lo abandona. Se pueden usar para implementar fácilmente efectos mouse-over.

  • Se pueden leer datos de archivos binarios y manejar automáticamente la forma de colocar sus bytes (endianness), usando la propiedad ByteOrder de la clase Stream.

  • Gambas usa internamente el juego de caracteres UTF-8, por lo que se puede internacionalizar fácilmente todo el proyecto.

  • Gambas es Software libre y su entorno de desarrollo está escrito en Gambas, lo que le permite un grado máximo de personalización, sólo dependiendo de su nivel de conocimientos de BASIC.

Y muchas otras cosas... ¡Añádelas aquí siempre que quieras! :-)

Same Functionality, Different Terminology

  • End Sub=/=End Function: see END.

  • Exit Sub=/=Exit Function: see RETURN. Also, rather than setting a with the same name as the function and then exiting the function, you can simply include the desired return value as a parameter to RETURN.

  • End (end program): see QUIT.

  • Arrays use brackets instead braces. So use DIM x[9] AS instead DIM x(9) AS Float

  • Arrays do not have the extra element for indexing as 1..n, index must always be 0..(n-1)

  • On Error Goto: see TRY, CATCH and FINALLY.

  • Msgbox: see Message. Normally you'd want Message.info.

  • VB's default InputBox function (pop up a dialog prompting for a value which is returned to the calling program) has no direct equivalent in Gambas yet, but see the InputBox page for a clase you can download and include in your projects to serve the same purpose (and more.)

  • DoEvents: see WAIT. WAIT also replaces the frequently used Windows API "sleep" function.

  • Inserting Double Quotes in Strings: Rather than two consecutive double quotes as in VB, use the backslash as an escape character as in C or Perl (").

  • VScrollBar, HScrollBar: Gambas' ScrollBar replaces both of these. It automatically figures out whether you want a vertical or horizontal scrollbar based on the control's dimensions: make it wide, and you get a horizontal scrollbar; make it tall, and get a vertical one.

  • Open and Save dialogs: You can use either the qt or enhanced KDE dialogs in place of the Windows common dialog. Some of the properties are named differently and filters are specified with a String array, like this: [ "Filter 1 (*.foo)" , "Filter 2 (*.bar)" ]

  • Validating text entry: In VB, certain events have a Cancel parameter you can set to prevent the evento from being handled normally after your handler is done, so that for instance you can allow only letters or numbers to be typed, perform field validation, or force entry to be all upper or lower case. In Gambas, this is done by using the STOP EVENT instruction.

  • Keyboard and Mouse event handlers does not take parameters. They use instead static public members of the Mouse and Key classes. For example:
    • Mouse.X and Mouse.Y for the mouse coordinates.

    • Mouse.Left to know if the left button is pressed.

    • Key.Code to get the code of a key.

    • Key.Shift to know if the SHIFT key is pressed.

    • ...and so on.

  • In Gambas, the Timer() routine returns the number of elapsed seconds since the program start. In VB, it returns the number of elapsed seconds since midnight.

  • Do not use the Form.Load método. It is a completely different method from the Visual Basic Load instruction. In Gambas, it is just a static method that creates the implicit form instance.