Documente Academic
Documente Profesional
Documente Cultură
Contenidos Introduccin Clases Exportadas Clases Exportadas Ocultas Controles La constante _Properties Syntaxis Tipos de Propiedades Listas de Constantes Ejemplos Las otras Constantes Especiales La constante _DefaultEvent La constante _DefaultSize La constante _DrawWith La constante _Arrangement Iconos de control Requerimientos del componente Depuracin, instalacin y empaquetado del componente Depuracin Instalacin Empaquetado Conclusin
Introduccin
Toda la informacin a continuacin es para Gambas 3. Los componentes en Gambas son libreras compartidas escritas en C, C++ o directamente en Gambas que aaden nuevas clases al intrprete de gambas. Un componente escrito en Gambas es un proyecto normal con las siguientes particularidades: En la pestaa "Opciones" del dilogo de Propiedades del Proyecto, el combobox "El proyecto es un componente" est seleccionado en "S". Algunas de las clases del proyecto son exportadas. Las clases exportadas que son controles deben declarar algunas constantes pblicas que indicarn al IDE toda la informacin necesaria para gestionar el control. La pestaa "Requiere" del dilogo de Propiedades del Proyecto se completa con las dependencias del nuevo componente. Muchos de los componentes oficiales estn escritos en gambas y los puedes usar como ejemplos. El cdigo fuente de esos componentes est localizado en el directorio /comp/src
del archivo de cdigo fuente de gambas. Esta es la lista de dichos componentes: gb.db.form gb.form gb.form.dialog gb.form.mdi gb.info gb.report gb.settings gb.web
Algunos componentes escritos en C/C++ tienen tambin partes escritas en gambas: gb.qt4 gb.gtk gb.desktop El cdigo fuente de la parte de gambas est dentro del directorio fuente de ese componente. Por ejemplo, la parte de gambas de gb.qt4 est en /gb.qt4/src.
Clases Exportadas
El propsito de un componente es proporcionar nuevas clases al intrprete de Gambas. Las clases que queremos proveer deben ser exportadas desde nuestro proyecto, de otro modo el usuario de tu proyecto no podr verlas o usarlas. Para marcar una clase como exportada, slo hay que aadir la palabra clave EXPORT al principio del cdigo de la clase. Si un mtodo o una propiedad de una clase exportada devuelve un objeto de otra clase declarada en tu componente, entonces esa otra clase debera de ser exportada igualmente. De otro modo, el usuario no podr guardar una referencia a ella, a menos que use el tipo de dato Object. Si una clase exportada hereda de otra clase declarada en tu componente, esta otra clase debera de ser exportada tambin. De otro modo, se producir un error cuando el intrprete intente cargar el componente. Un buen ejemplo de un componente sencillo con clases exportadas es gb.settings y su clase Settings.
C/C++.
Controles
Los controles son clases exportadas especiales que aparecen en la caja de herramientas de controles del IDE. Los controles son generalmente elementos grficos que muestran algo y que sirven para interactuar con el usuario. Pero tambin pueden ser clases normales y no tener una parte grfica, como el control Timer. En estos casos los llamamos controles virtuales. Los componentes grficos (gb.qt o gb.gtk) proveen dos clases que deberas usar como "clases padre" para crear tus propio controles: UserControl, para controles sencillos. UserContainer, para crear contenedores. UserControl y UserContainer son realmente clases hijas de la clase Container. De esta forma, puedes crear nuevos controles o nuevos contenedores mezclando controles o contenedores ya existentes. Para un buen ejemplo de uso de UserControl, mira el cdigo fuente del control FileView. Este control contiene un TreeView y un IconView dentro de un UserControl, mostrando uno de los dos, segn el tipo de vista requerido por el usuario. Para otro ejemplo de uso de UserContainer, mira el cdigo fuente del control ListContainer. Este control es un contenedor que permite crear un ListBox cuyos tems son otros controles. Los controles tienen que declarar algunos tipos de constantes ocultas que permiten al IDE gestionar el control: Constante _IsControl _IsContainer Tipo Por defecto Descripcin Esta propiedad debe establecerse a TRUE, para que una clase exportada se convierta en un control. Si un control es un contenedor, es decir, si puedes poner otros controles dentro usando el editor de formularios del IDE. si un control es un contenedor mltiple, como el TabStrip. Si un control es virtual, es decir, una clase normal que puedes poner en el editor de formularios, como el control Timer o la clase Printer. Si un control es realmente un formulario, por ejemplo el contenedor de nivel superior de todos los controles de la misma familia. La familia del control, esto es, el tipo de objeto de nivel superior donde se ha de colocar el control. Por ejemplo: "Form" para un control Form, "Report" para un control Report, and "*" para
_IsForm
Boolean FALSE
_Family
String
"*"
un control que se puede colocar en cualquier lugar. _Group String _Family El nombre de la pestaa de la caja de herramientas del IDE donde se mostrar el icono del control. Por defecto se usar el nombre de la familia, pero si no se ha establecido se usar el grupo "Special". "" Una lista separada por comas de grupos similares. El editor de formularios del IDE permite reemplazar un control por cualquier otro que comparta los mismos grupos de similaridad. Normalmente un grupo de similaridad es el nombre de un control. La lista de propiedades del control. Ver ms abajo. El evento por defecto. Ver ms abajo. El tamao por defecto del control. Ver ms abajo. El control grfico real empleado para dibujar el control dentro del editor de formularios. Ver ms abajo.
_Similar
String
La disposicin automtica del control cuando ste es un contenedor y si ste dispone la posicin de sus elementos hijos automticamente. Ver ms abajo. Slo las constantes _IsControl y _Properties son obligatorias. Estas constantes ocultas se heredan como cualquier otra constante. As que no necesitas declararlas en cada control, ya que hay una relacin hereditaria entre ellas.
_Arrangement
Integer
La constante _Properties
Esta constante es la ms importante y adems es obligatoria. Describe todas las propiedades que aparecern en la hoja de propiedades del IDE para ese control, su tipo, sus valores por defecto y otra informacin dependiente del tipo de propiedad.
Syntaxis
Esta constante especial es una cadena con la siguiente sintaxis:
PUBLIC CONST _Properties AS String = " [ * , ] Propiedad1 , Propiedad2 , ... "
Nombre es el nombre de la propiedad. Por supuesto, la propiedad debe ser declarada e implementada en el cdigo del control. Tipo es el tipo de propiedad (N. del T.: Tipo como sinnimo de "especie", no como tipo de dato o datatype). Puede ser ms exacto que el tipo de dato de la propiedad. Por ejemplo, "Color" significar que la propiedad es un entero, pero la hoja de propiedades del control en el IDE abrir un selector de colores para definir su valor. Si no se define, el tipo de propiedad es su tipo de dato (datatype).
Argumentos son argumentos opcionales que dependen del valor de Tipo. Default es el valor por defecto de la propiedad. La sintaxis aqu depende del tipo de propiedad. La primera propiedad puede ser un asterisco, de forma que el control adquiere automticamente todas las propiedades declaradas en la constante _Properties de su clase ascendiente. En ese caso, un nombre de propiedad puede comenzar con un guin medio (-) para que no aparezca en la lista de propiedades heredada de la clase padre.
Tipos de Propiedades
Aqu estn los diferentes valores de Tipo soportados hasta el momento: Tipo Propiedad Color Descripcin Un entero que representa un color. El IDE mostrar un selector de color emergente para editar el valor de esta propiedad. Font Una fuente de caracteres.
Font [ :Fixed ]
Argumentos
El IDE mostrar un selector de fuentes emergente Usar Font:Fixed para permitir fuentes fijas solamente. para editar el valor de esta propiedad. Path Una ruta a un fichero. El IDE mostrar un selector de ficheror emergente para editar el valor de esta propiedad. Picture Una imagen localizada en el el directorio del proyecto o un icono de stock. El IDE mostrar un selector de imgenes para editar el valor de esta propiedad. Un rango de nmeros enteros con un mnimo y un mximo. El IDE usar un control SpinBox para editar el valor de esta propiedad. El valor Default value debe coincidir con el tipo de dato de la propiedad. Para propiedades booleanas, se puede especificar "True" o "False" como valor por defecto. Hay que ser muy prudente cuando definamos (o no) el valor Default de una propiedad. Si no se especifica, el valor por defecto que toma es el valor por defecto asociado con el tipo de dato de la propiedad, (FALSE para una propiedad Boolean, 0 para una numrica, etc.).
Range:Mnimo;Mximo
Range
El valor por defecto debe coincidir con la implementacin de la propiedad, porque cuando una propiedad se establece a su valor por defecto en el editor de formularios del IDE, no se genera ningn cdigo para inicializar la propiedad en tiempo de ejecucin.
Listas de Constantes
Para propiedades que toman su valor de una lista de constantes predefinidas de la misma clase, puedes especificar una clase en lugar de un tipo de propiedad, con una lista opcional de constantes. Esta es la sintaxis: Tipo de Propieda d Nombre de clase Descripcin Una lista de constantes. Argumentos
Class . ( * | Constante1 ; Constante2 ; ... ) [ = Default ]
Si usamos un asterisco en vez de una lista de propiedades, El IDE usar un control ComboBox se usarn todas las constantes de la clase especificada. para editar el valor de la propiedad, y lo llenar con las constantes especificadas. Si se especifica, el valor de Default debe ser el nombre de una de las constantes, no su valor real.If specified, the value of _Default must be the name of one of the constants. Not its real value!
Ejemplos
Por ejemplo, el valor de Control._Properties es:
X{Position},Y{Position},Width{Dimension},Height{Dimension},Visible=True,Enabled=Tr ue,Font{Font}, Background{Color}=-1,Foreground{Color}=-1,Tag, Mouse{Mouse.Default;Blank;Arrow;Cross;Wait;Text;SizeAll;SizeH;SizeV;SizeN;SizeS;Si zeW;SizeE;SizeNWSE;SizeNESW;SplitH;SplitV;Pointing}=Default, ToolTip,Drop,Expand,Ignore
Es heredado por todos los otros controles y contenedores. Este es el valor de ListBox._Properties:
*,List,Mode{Select.*}=Single,Sorted
es el que se usa cuando de hace doble clic en un control en el editor de formularios del IDE. Por ejemplo:
PUBLIC CONST _DefaultEvent AS String = "Click"
La constante _DefaultSize
Esta constante es una cadena que representa el tamao por defecto del control cuando se suelta encima del editor de formularios al arrastrarlo desde la caja de herramientas de controles. Es su anchura y su altura como un mltiplo de Desktop.Scale, separado por comas. Un ejemplo:
PUBLIC CONST _DefaultSize AS String = "36,36"
La constante _DrawWith
Esta constante es una cadena que indica al IDE el control que se va a usar para dibujarlo en el editor de formularios. Por defecto, los controles que son miembros de gb.qt, gb.qt.ext, gb.form y gb.form.mdi se dibujan siendo instanciados con el juego de propiedades Design. Si un control no es miembro de dichos componentes, entonces el IDE dibujar un marco con el icono del control y su nombre dentro. Al definir esta constante, el IDE no usar un DrawingArea, sino el control que se especifique. Por ejemplo:
PUBLIC CONST _DrawWith AS String = "TextBox"
La constante _Arrangement
Esta constante es un valor de tipo cadena que representa el estilo de disposicin que usa el IDE para ordenar los controles hijos dentro de un contenedor, antes de salvarlos en el disco duro. El valor puede ser una de las siguientes cadenas: Constante "H" "V" "R" "C" Disposicin Arrange.Horizontal Arrange.Vertical Arrange.Row Arrange.Column
Esa constante se usa solamente si el control es un contenedor y es opcional. Si no se define, no se fuerza su disposicin.
Iconos de control
Cada control debe tener un icono para mostrarse en la caja de herramientas del IDE. Para proporcionar los iconos de los controles de tu componente, debes crear un directorio /control en la raz de tu proyecto, y colocar un fichero PNG para cada control. En Gambas 3, el directorio del control se debe crear dentro del directorio .hidden. Esa es la seccin "Proyecto" en la vista de rbol del IDE. El nombre del icono de un control debe ser el nombre de clase del control en minsculas con la extensin .png. Por ejemplo:
$ cd gb.db.form $ cd control $ ls databrowser.png dataview.png
datacombo.png
datacontrol.png
datasource.png
datatree.png
dilogo de propiedades de proyecto no interfiere en absoluto con el comportamiento del componente una vez instalado y en uso por otros proyectos.
Instalacin
Puedes instalar el componente en el directorio de usuario chequeando la correspondiente opcin en el dilogo "Crear ejecutable" Una vez instalado, el componente ser visible en la pestaa de "Componentes" del dilogo de propiedades del proyecto, como cualquier componente instalado globalmente. Para desinstalar el componente del tu directorio de usuario, basta con desmarcar la opcin en el dilogo "Crear ejecutable" y crear el ejecutable de nuevo.
Empaquetado
El IDE puede crear paquetes binarios de tu componente, igual que hara para cualquier otro proyecto normal. Slo hay que definir menos opciones: un componente no tiene entrada de men, por ejemplo. El paquete binario instalar el componente a nivel global y se podr usar igual que cualquier otro componente proporcionado por Gambas. Si quieres distribuir tu componente, es muy importante nombrarlo siguiendo un esquema muy preciso, para que no haya conflictos entre paquetes. El nombre de tu componente tiene que ser: gambas3-vendedor-nombre gambas3 es el prefijo para todos los componentes. vendedor es el nombre de vendedor. Para componentes oficiales de gambas, el nombre de vendedor es simplemente gb. nombre es el nombre del componente. En caso de que el asistente de empaquetado permita insertar la cadena de vendedor en el nombre del paquete, por favor evita hacerlo. Coloca el nombre de vendedor dentro del nombre de proyecto del componente, de forma que aparezca en el nombre del componente final y sea visible para el usuario. Por el momento, hay un fallo en el empaquetador que no tiene en cuenta la versin del proyecto del componente al generar las dependencias del paquete. En consecuencia, hay que establecer la versin de tu componente a la versin de Gambas actual!
Conclusin
He intentado encontrar la forma ms fcil de crear componentes usando el IDE. An no es perfecta, pero si tienes alguna pregunta o comentario, por favor usa la lista de correo. Ten en cuenta que algunas cosas cambiarn seguramente antes de la versin final de Gambas 3. Y por supuesto, si quieres corregir o mejorar este artculo, bienvenido seas!
Qu es un componente?
Los componentes de Gambas son libreras compartidas escritas en C o C++ que aaden funciones nuevas al intrprete de Gambas. Estos componentes actan de forma similar a como lo hacen los drivers Linux con el kernel del sistema: Los componentes y el intrprete se comunican a travs de la Interfaz de Programacin de Gambas. Deben de estar compilados dentro del paquete fuente de Gambas. Son ejecutados en el entorno del intrprete y por tanto no pueden hacer cualquier cosa. Un componente puede contener: Nuevas clases que son aadidas a otras clases de Gambas. Estas clases son declaradas al intrprete usando una estructura en C que contiene la descripcin de cada smbolo, mtodo, constante y evento. Ganchos (hooks) del intrprete: funciones especiales que implementan importantes operaciones del intrprete, como el manejo del bucle de eventos, lectura de los parmetros del programa... Una interfaz de programacin que mejore la Interface de Programacin de Gambas, y que otros componentes pueden usar.
Un componente debe tener un nombre. Este nombre es la palabra gb seguida por una lista de palabras, separadas por un punto, que describen el papel del componente y la relacin entre ste y otros componente, si la hubiera. Por ejemplo, gb.qt.kde es un componente que transforma una aplicacin Gambas en una aplicacin KDE. Este componentes est relacionado con el componente gb.qt y cargar el primero implica cargar el segundo.
El uso de este interfaz de programacin est altamente recomendado, porque previene que un componente pueda hacer cosas dainas. El Interfaz de Programacin de Gambas es una estructura de C que contiene un puntero de funcin por cada funcin del interfaz. Esta estructura se declara en el archivo main del componente y la inicializa automticamente el intrprete al cargar el componente.
Quick Start
I think the better way is starting from the sdl componente, which is very small.
So, let's suppose you want to write the gb.xyz component. This component: * Depends on no other component. * Needs the libxyz.so library and the xyz.h include file. * Needs multi-threading. The $ROOT variable is the directory where you uncompressed the GAMBAS source package. 1. Make a copy of the $ROOT/src/lib/sdl directory (with its contents) and name it gb.xyz . 2. Remove the sources files, but keep main.c and main.h. You will write your own main.c and main.h by modifying them. 3. Edit the $ROOT/src/lib/xyz/Makefile.am file, and fills it as needed, as explained there. You will get something like that: INCLUDES = -I$(top_srcdir)/src/share @XYZ_INC@ EXTRA_DIST = *.component pkglib_LTLIBRARIES = lib.gb.xyz.la lib_gb_xyz_la_LIBADD = @XYZ_LIB@ lib_gb_xyz_la_LDFLAGS = @LD_FLAGS@ lib_gb_xyz_la_SOURCES = main.h main.c myFirstClass.h myFirstClass.c mySecondClass.h mySecondClass.c ... install-exec-local: @cp -f *.component $(DESTDIR)$(pkglibdir) 4. Rename the $ROOT/src/lib/xyz/lib.gb.sdl.component file as lib.gb.xyz.component and edit it. Be careful, this file must be UTF8 encoded. [Component] Key=gb.xyz Name=The xyz component Author=You Alpha=1 5. Edit the $ROOT/src/lib/Makefile.am file (located one directory up) and change the first line to add a reference to the newly created sub-directory. SUBDIRS = debug eval db compress @QT_DIR@ @NET_DIR@ @SDL_DIR@ @VB_DIR@ @XYZ_DIR@ 6. Edit the $ROOT/configure.in file and add the following stuff: ... GB_COMPONENT( xyz, XYZ, [XYZ component], [GB_FIND(xyz.h, /usr/local /usr, include xyz*/include include/xyz*)], [GB_FIND(libxyz.$SHLIBEXT, /usr/local /usr, lib xyz*/lib lib/xyz*)], [$C_LIB $THREAD_LIB -lxyz], [$THREAD_INC])
... 7. At the end of the $ROOT/configure.in file, change the AC_OUTPUT macro: ... dnl ---- Create makefiles AC_OUTPUT( Makefile src/Makefile src/share/Makefile src/comp/Makefile src/exec/Makefile src/lib/Makefile ... src/lib/compress/Makefile src/lib/compress/zlib/Makefile src/lib/compress/bzlib2/Makefile src/lib/xyz/Makefile ) 8. Open a terminal, go to the package root directory, and type: $ ./reconf $ ./configure ... $ make ... Everything should compile... if you didn't make a mistake of course :-) 9. To test the component, you must make three symbolic links from the ./src/lib/xyz directory to the Gambas installation directory. As root, of course: $ su ... # ln -s /usr/lib/gambas/lib.gb.xyz.component $ROOT/src/lib/xyz/lib.gb.xyz.component # ln -s /usr/lib/gambas/lib.gb.xyz.so $ROOT/src/lib/xyz/.libs/lib.gb.xyz.so # ln -s /usr/lib/gambas/lib.gb.xyz.la $ROOT/src/lib/xyz/lib.gb.xyz.la 10. Now you must create the component description files by using the gbi command. You must do that each time you modify the interface of your component. $ gbi -a ... That's all. You should have a new component now :-)
The main file The interpreter hooks Writing classes Special methods The components description file
notas disponibles que ensean a usar la caracterstica descrita en esa pgina y que difiere de la forma de ejecutar la misma tarea en VB. La intencin es ayudar a aquellos programadores que esten migrando a Gambas desde ese lenguaje.
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 mltiples 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 pxeles 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 pblicos". Las funciones de conversin Str$, Val, CStr... se comportan de forma distinta. Por ejemplo, Str$ y Val usan la configuracin de idioma puesta en Gambas, mientras que no hacen eso en Visual Basic. Lea la documentacin atentamente para ms detalle, pero parece que el comportamiento de Gambas es ms lgico :-).
excepcin es el control DrawingArea, que tiene una propiedad Tracking para poder seguir los eventos del ratn incluso si no se ha pulsado ningn botn. En VB se pueden unir dos strings con el smbolo + . Como en Gambas el signo + slo se usa para la suma matemtica, deber usar & cuando quiera unir dos string. El simbolo de dos puntos : no sirve para separar el cdigo. Debe ponerlo en una nueva linea para esto. En VB 3.0 el comando Print no aada un retorno de carro. Si sola usar para imprimir texto la instruccin printer.print, el texto se perda. La instruccin Print en Gambas pone todo en una lnea. No se pierde nada. En VB se puede usar Mid$() como una instruccin 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 funcin Mid$(), ahora es posible en la versin en desarrollo. Algunos de los caracteres que se pueden usar en el cdigo 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.
Example
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 grfico si quiere escribir una aplicacin de consola en Gambas. Tan solo debe quitar la seleccin al componente gb.qt 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 documentacin de NEW para ms informacin. Gambas tiene el concepto de grupos de controles, lo que permite manejar eventos de cualquier nmero de controles distintos dentro de una nica subrutina. Esto reduce cdigo redundante y puede usarse para hacer la mayora 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 sncrona 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 aadir funcionalidades a aplicaciones y asistentes. Esto hace que sea muy fcil escribir interfaces grficas con Gambas para casi cualquier programa de consola Se puede hacer todo lo anterior con los dispositivos de Unix y archivos especiales tambin, como puertos serie o paralelo. Use el sistema de archivos /proc para escribir un monitor RAID, por ejemplo, o use una tubera para obtener mltiples canales de informacin desde el back-end de un programa hecho en cualquier otro lenguaje. Para hacer una ventana con formas extraas, 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 ms de trabajo. Se pueden crear controles y mens de forma dinmica, tan slo necesita instanciarlos con la instruccin 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 ratn entra en un control y cuando lo abandona. Se pueden usar para implementar fcilmente efectos mouse-over. Se pueden leer datos de archivos binarios y manejar automticamente 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 fcilmente todo el proyecto. Gambas es Software libre y su entorno de desarrollo est escrito en Gambas, lo que le permite un grado mximo de personalizacin, slo dependiendo de su nivel de conocimientos de BASIC. Y muchas otras cosas... Adelas aqu siempre que quieras! :-)
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 mtodo. 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.
Gambas es Multiplataforma?
En un futuro, yo espero que la respuesta sera un simple: "Si!". :) Pero ahora, hay reportes de personas compilando Gambas bajo BSD y Win32/Cygwin.
Si el prefijo de la instalacin es /usr o /usr/local (Que es la configuracin por defecto) entonces tu tienes que borrar cada directorio uno por uno.
$ rm -f /usr/local/bin/gbx2 /usr/local/bin/gbc2 /usr/local/bin/gba2 /usr/local/bin/gbi2 $ rm -rf /usr/local/lib/gambas2 $ rm -rf /usr/local/share/gambas2
Puedo acceder a las bases de datos como PostgreSQL, MySQL, etc. en Gambas
Actualmente puedes acceder a las bases de datos de PostgreSQL, MySQL y SQLite en la versin estable, y algunas otras en la versin en desarrollo. Si tu quieres desarrollar un driver para otro sistema de base de datos, dmelo. Sers bienvenido!
Como Traducir un Proyecto de Gambas Para traducir un proyecto en tu lengua nativa, abre el IDE, y haz click en traducir... en el menu Proyecto Si el IDE muestra algun mensaje emergente, asegrate de que tienes las herramientas GNU gettext instalado en su ordenador.
Si la traduccin no est presente en la lista de la izquierda, haga clic en el * botn * Nuevo y elegir una nueva traduccin. Si necesita traducir a un lenguaje que no existe en el directorio nueva traduccin ../../comp/gb.form/dialog, escribe y lo aadiremos Seleccione una cadena de texto sin traducir en la tabla
Puede indicar que una cadena no debe ser traducido mediante la introduccin del signo menos como cadena a traducir Repita este proceso hasta que cada cadena se traduce. Cuando haya terminado, haga clic en el Cerrar/botn. Puedes traducir el proyecto en varias oportunidades Puede ayuadrse con los iconos de la barra de herramientas.
De izquierda a derecha, los iconos te permiten: Borrar la cadena actual. Marca una cadena como no traducibles. Copia la cadena sin traducir al traductor. Verificar la traduccion actual, duarnte la verificacin de cada caractr sae conserva. Buscar la siguiente cadena sin traducir. Encuentre la cadena anterior sin traducir. Bsqueda de un texto dentro de las cadenas a traducir, o las cadenas traducidas.
De izquierda a derecha, los botones te permiten: Insertar una nueva traduccin a la lista de lenguas de la izquierda. Recargar la actual traduccin. Todos los cambios se pierden. Eliminar la actual traduccin. Importacin y fusionar un fichero de traduccin en la actual. Exportar la traduccin actual en un archivo.
La traduccin se guarda automticamente al cambiar el lenguaje comn o cuando cierra el cuadro de dilogo de traduccin. El resultado de su traduccin se almacena en un *.po archivo almacenado en el directorio .lang del proyecto. El nombre de este archivo depende del idioma. Por ejemplo, la traduccin al francs se llama fr.po. Cada vez que haga una nueva versin de su proyecto, las cadenas no traducidas puede cambiar. Pero no se preocupe, sus cadenas traducidas se conservan. Si una cadena sin traducir desaparece, desaparece la traduccin de la misma. Si una nueva cadena sin traducir, se aade, se vuelve un vaco de traduccin. Todas las dems cadenas traducidas mantienen su traduccin.}
AND
Resultado = Expression AND Expression
Dependiendo de la expresion, el operador AND puede ser un "Y logico" o un "Y numerico". En el caso de dos expresiones booleanas, un Y logico es llevado a cabo. En el caso de dos nmeros enteros, es un Y numerico el que se realiza. El operador lgico Y tiene dos expresiones booleanas y devuelve un valor verdadero o falso. Los resultados devueltos por este operador se muestra en el cuadro siguiente: A FALSE FALSO TRUE B FALSO A AND B FALSO FALSO FALSO
VERDADERO FALSO
VERDADERO VERDADERO VERDADERO El operador Y numerico toma dos valores enteros y devuelve un valor entero. El cual corresponde a cada bit especificado en la siguiente tabla: A B A AND B 0 0 0
0 1
1 0
0 0
1 1 1 El operador Y numrico se puede utilizar para probar el patrn de bits de un nmero. Tambin puede utilizarse para enmascarar, un nmero de bits. La siguiente tabla ofrece algunos ejemplos de cmo funciona el operador AND en dos nmeros. Expression 10 AND 20 = 0 Explanation 10 = binary 01010 20 = binary 10100 Hence 10 AND 20 = 0 10 = binary 00000000000000000000000000001010 -20 = binary 11111111111111111111111111101100 Hence 10 AND -20 = 8 (binary 1000) 20 = binary 00000000000000000000000000010100 -20 = binary 11111111111111111111111111101100 Hence 20 AND -20 = 4 (binary 100)
10 AND -20 = 8
20 AND -20 = 4
Example
PRINT TRUE AND FALSE False PRINT TRUE AND TRUE True PRINT 7, Bin(7, 16) PRINT 11, Bin(11, 16) PRINT 7 AND 11, Bin(7 AND 11, 16) 7 11 3 0000000000000111 0000000000001011 0000000000000011
DIM A,B AS BOOLEAN A = 10 < 20 B = 20 > 30 IF A AND B THEN PRINT "Both A and B are TRUE" ELSE PRINT "Either A or B or both are FALSE"
Vase tambin
Operadores Aritmticos, Operadores Lgicos
Ang
ngulo = Ang ( X AS Float , Y AS Float )
Esta funcin calcula el arcotangente de dos variables X e Y. Es similar a calcular el arcotangente de X / Y, salvo que el signo de ambos argumentos se emplea para determinar el cuadrante del resultado. Esta funcin devuelve el resultado en radianes, con valores entre - y (inclusive). Es la misma funcin que ATan2. Para convertir coordenadas cartesianas en coordenadas polares, use Mag para obtener la distancia y esta funcin para obtener el ngulo.
Example
PRINT Deg(Ang(-1, 1)) 135 Funciones Trigonomtricas ACos Calcula el arcocoseno de un nmero. ACosh Calcula el arcocoseno hiperblico de un nmero. Ang ASin ATan Calcula la coordenada "ngulo polar" para dos coordenadas cartesianas. Calcula el el arcoseno de un nmero. Calcula la arcotangente de un nmero.
ASinh Calcula el arcoseno hiperblico de un nmero. ATan2 Calcula la arcotangente de dos nmeros. ATanh Calcula la arcotangente hiperblica de un nmero. Cos Cosh Deg Hyp Mag Calcula el coseno de un ngulo. Calcula el coseno hiperblico de un ngulo. Convierte radianes a grados. Calcula la hipotenusa de un tringulo. Calcula la coordenada "distancia polar" para dos coordenadas cartesianas.
Devuelve o un mltiplo de . Calcula el seno de un ngulo. Calcula el seno hiperblico de un ngulo. Calcula la tangente de un ngulo. Calcula la tangente hiperblica de un ngulo. Convierte grados en radianes.
ACos
Valor = ACos ( Nmero AS Float ) Valor = Acs ( Nmero AS Float )
Example
PRINT ACos(0.5) 1.047197551197 PRINT ACos(-1) 3.14159265359
Access
Accessible = Access ( Ruta [ , Modo ] )
Devuelve TRUE si el archivo especificado por Ruta es accesible. El valor de Modo puede ser: gb.Read, devuelve TRUE si hay permiso de lectura. Es el valor por defecto. gb.Write devuelve TRUE si hay permiso de escritura. gb.Exec, devuelve TRUE si hay permiso de ejecucin. Los flags anteriores pueden combinarse con el operador OR. En el caso de un directorio, el permiso de ejecucin significa que hay permiso para leer el contenido de la carpeta.
Example
PRINT Access("/home/benoit", gb.Write OR gb.Exec) True PRINT Access("/root", gb.Write) False
COPY
COPY Ruta Origen TO Ruta Destino
Copia un archivo desde Ruta Origen a Ruta Destino. La ruta de destino ha de ser diferente de la ruta de origen. Tenga en cuenta que esta funcin no copia carpetas de forma recursiva.
Example
' Guarda el archivo de configuracin de Gambas COPY User.Home &/ ".config/gambas/gambas.conf" TO "/mnt/save/gambas.conf.save"
Errores
Mensaje El archivo ya existe ( Descripcin El archivo de destino ya existe.
Esta funcin emplea internamente las funciones OPEN, READ[../../def/stream] _\Stream_, WRITE y CLOSE. Por tanto, puede disparar cualquiera de sus errores.
OPEN
Flujo = OPEN Archivo por abrir FOR [ READ | INPUT ] [ WRITE | OUTPUT ] [ CREATE | APPEND ] [ WATCH ]
Abre archivos como flujos para leer, Escribir, crear o aadir datos. Debe especificarse aunque sea una un comando despues del FOR por ejemplo: Si se especifica CREATE, Entonces crea un archivo o lo reemplaza por uno nuevo si existe. Si se especifica APPEND, entonces el puntero es movido al final del archivo despus de que este se abra. Si se especifica READ o WRITE keyword are specified, entonces la entrada-salida se escribe
directamente al archivo, no se mete en buffer. Si se especifica INPUT or OUTPUT, entonces la entrada-salida son almacenadas en un buffer. Si se especifica WATCH, el archivo se ve sin el interprete : Si al menos un bite se puede leer del archivo, entonces se llama a event handler File_Read(). Si al menos un bite se puede leer del archivo, Entonces se llama a evento handler File_Write() . Si al abrir termina correctamente, el Flujo objeto retorna variable Stream. Predeterminadamente, los streams son almacenados en buffer. Si usted quiere que no sea almacenado el Flujo, debe usar los comandos READ o WRITE. A diferencia de otros lenguajes Basic, Gambas nunca borra el archivo, cuando es abierto por WRITE . Por eso si el archivo es ms pequeo que al anterior, quedar basura en el final del archivo, para evitar esto puede usar el comando CREATE despus del WRITE
Errores
Mensaje Acceso denegado ( Descripcin -Cuando el acceso a la carpeta no esta permitido, o se le niega los permisos en carpetas anteriores. -Si no existe y es abierto por el comando WRITE. FileName se refiere a un directorio. Para ello use la funcin Dir. FileName No existe, o el directorio no existe o es un enlace simblico. Si el sistema se qued sin memoria. Si donde iba a ser creado el FileName no hay espacio. Si un componente es usado para un archivo y se encuentra en un directorio.
El archivo es una carpeta ( El archivo o carpeta no existe ( Memoria insuficiente (1) error/ful l No se trata de una carpeta... (
Error del sistema... ( Otros posibles errores: Si se encuantran muchos enlaces simbolicos en la solucion de FileName. Si el proceso est al maximo de archivos abiertos. Si se llega al mximo de archivos abiertos soportados por el sistema. FileName se refiere a un dispositivo especifico que no esta montado en ese momento. Si el FileName es una tubera pipe Y el proceso no puede abrirlo para leerlo. FileName Si el archivo es solo lectura y el archivo ocupe escribirse.
FileName Si se refiere a una imagen ejecutable que se encuentra actualmente en ejecucin y se pidi el acceso de escritura.
Example
' Escribir el contenido de un archivo de texto en la pantalla DIM hFile AS File DIM sLine AS String hFile = OPEN "/etc/passwd" FOR INPUT WHILE NOT Eof(hFile) LINE INPUT #hFile, sLine PRINT sLine WEND ' Ver un puerto serial DIM hFile AS File hFile = OPEN "/dev/ttyS0" FOR READ WRITE WATCH ... PUBLIC SUB File_Read() DIM iByte AS Byte READ #hFile, iByte PRINT "Got one byte: "; iByte END ' Leer de un archivo BMP, sabiendo que usa el formato little-endian: DIM hFile AS File DIM iData AS Integer hFile = OPEN "image.bmp" FOR INPUT hFile.ByteOrder = gb.LittleEndian ... READ #hFile, iData
Vase tambin
Flujos y funciones de Entrada/Salida, Funciones para Archivos y Carpetas, Stream
DFree
Size = DFree ( Ruta )
Devuelve el espacio libre (en bytes) del dispositivo cuya Ruta se indica.
Example
PRINT DFree("/") 5112569856 PRINT DFree("/home") 454918144
Vase tambin
Funciones para Archivos y Carpetas Dir
No_mbre del array = Dir ( _Directorio AS String [ , Patrn AS String , Filtro AS Integer ] ) AS String[]
Returns a string array that contains the names of files located in Directory that matches the Pattern and the Filter. regresa una array string con los nombres de los archivos que contenga el Directorio que cumplan con el patrn y con el filtro. El patrn puede contener los mismos caracteres genricos que el LIKEoperador. Si no se especifica el patrn, todas las archivos son devueltos. The filter specifies what kind of files will be returned, by specifying one or a combination of the file type constants. If Filter is not specified, all files and directories are returned. El filtro especifica qu tipo de archivos le sern devueltos, especificando uno o una combinacin de los file type constants. Si el Filtro no es especificado, todos los archivos y directorios son devueltos. Los archivos devueltos son relativos, los directorios pueden no contener los archivos buscados
Example
' Imprime las imagenes png de un directorio, en orden alfabetico
SUB PrintDirectory(Directory AS String) DIM File AS String FOR EACH File IN Dir(Directory, "*.png").Sort() PRINT File NEXT END
Vase tambin
Funciones para Archivos y Carpetas
IsDir
Booleano = IsDir ( Ruta ) Booleano = Dir? ( Ruta )
Devuelve si una ruta apunta a una carpeta. Si la ruta no existe, esta funcin devuelve FALSE.
Example
PRINT IsDir("/etc/password") False PRINT IsDir(User.Home &/ ".kde") True PRINT IsDir("/windows") False KILL
KILL Ruta
Example
TRY KILL "/tmp/testfile"
LINK
LINK Ruta origen TO Ruta destino
Crea un enlace simblico llamado Ruta destino que apunta a la carpeta o fichero Ruta origen.
Vase tambin
Funciones para Archivos y Carpetas MKDIR
MKDIR Ruta
Crea una carpeta. Si alguna de las carpetas padre de la que se desea crear no existe, el comando fallar.
Errores
Mensaje Acceso denegado ( El archivo o carpeta no existe ( No se trata de una carpeta... ( Memoria insuficiente (1) Nombre de archivo demasiado largo ( Dispositivo lleno ( El archivo ya existe ( Error del sistema... ( Descripcin La carpeta padre no tiene permiso de escritura para el proceso, o una de las carpetas dentro de la Ruta no tiene permiso de consulta. Una de las carpetas que componen la Ruta no existe, o es un enlace simblico roto. Uno de los componentes empleados en la Ruta, no es una carpeta. Memoria insuficiente en el ncleo (kernel). Ruta demasiado larga. El dispositivo que contiene la Ruta no dispone de espacio libre. La Ruta ya existe (no necesariamente como carpeta). Esto incluye el caso de que sea un enlace simblico, roto o no. Otros posibles errores del sistema:
Demasiados enlaces simblicos encontrados a lo largo de Ruta. El sistema de archivos que contiene la Ruta no soporta la creacin de carpetas. Ruta se refiere a una carpeta dentro de un sistema de archivos de slo lectura.
RDir
FileNameArray = RDir ( Directory AS String [ , Pattern AS String , Filter AS Integer ] ) AS String[]
Returns a string array that contains the names of files located in Directory and its sub-directories that matches the Pattern and the Filter. The specified directory is recursed. The pattern can contain the same generic characters than the LIKE operator. If no pattern is specified, any file name is returned. The filter specifies what kind of files will be returned. The filter can be one of the following values: gb.File for returning only files. gb.Directory for returning only directories. gb.File + gb.Directory for returning both. If Filter is not specified, all files and directories are returned. The file paths returned are relative to the searched directory.
Example
' Print the png image files in a directory and its sub-directories SUB PrintDirectory(Directory AS String) DIM File AS String FOR EACH File IN RDir(Directory, "*.png") PRINT File NEXT END
Vase tambin
Funciones para Archivos y Carpetas
MOVE
MOVE Antiguo Nombre TO Nuevo nombre
Renombra o mueve un archivo o carpeta. Antiguo nombre y Nuevo nombre pueden estar situados en diferentes carpetas, pero deben pertenecer al mismo dispositivo. Si desea mover un archivo cualquiera que sea su ubicacin, haga lo siguiente: TRY MOVE OldName TO NewName IF ERROR THEN TRY COPY OldName TO NewName IF NOT ERROR THEN KILL OldName ENDIF
RMDIR
RMDIR Ruta
Stat
Informcin Archivo = Stat ( Ruta )
Devuelve informacin sobre un archivo o carpeta como el objeto virtual .Stat: Tipo de archivo, es decir, archivo normal, carpeta, tubera con nombre... Tamao del archivo. Fecha y hora de la ltima modificacin. Permisos. ...
Example
WITH Stat("/home") PRINT .Type = gb.Directory PRINT Round(.Size / 1024); "K" END WITH
True 4K
Temp$
Nombre archivo = Temp$( [ Nombre ] ) Nombre archivo = Temp( [ Nombre ] )
Devuelve una ruta para un archivo temporal. Las rutas tienen esta forma: /tmp/gambas.[id Usuario]/[id Proceso]/[Nombre].tmp Donde [id Usuario] es el identificador del usuario en el sistema (UID), [id Proceso] es el identificador del sistema para el proceso en curso (PID), y [Nombre] es el valor del argumento Nombre. Si no se especifica Nombre, es reemplazado por un nmero entero incrementado cada vez que se llama a la funcin. De esta forma, se asegura que disponga de nombres no duplicados. Todos los archivos situados en la carpeta /tmp/gambas.[id Usuario]/[id Proceso] se eliminan automticamente al finalizar el programa Gambas.
Example
PRINT Temp$() /tmp/gambas.501/14593/1.tmp PRINT Temp$() /tmp/gambas.501/14593/2.tmp PRINT Temp$("version") /tmp/gambas.501/14593/version.tmp