Sie sind auf Seite 1von 36

Cmo programar componentes en Gambas

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.

Clases Exportadas Ocultas


Si tienes que exportar algunas clases que no quieres que sean visibles al usuario, puedes ocultarlas simplemente comenzando su nombre con un guin bajo. Por ejemplo, mira el cdigo fuente de gb.desktop y vers muchas clases exportadas que no son visibles explcitamente. Con esto, podemos reemplazar el concepto de "clase virtual" existente slo en componentes escritos en

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

Boolean FALSE Boolean FALSE

_IsMultiContainer Boolean FALSE _IsVirtual Boolean FALSE

_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

_Properties _DefaultEvent _DefaultSize _DrawWith

String String String 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 , ... "

Cada propiedad tiene la siguiente sintaxis:


[-] Nombre [ { Tipo [ Argumentos ] } ] = Default

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

Las otras Constantes Especiales


La constante _DefaultEvent
Esta constante es una cadena que representa el evento por defecto del control. Este evento por defecto

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"

Esta constante es opcional, pero es muy conveniente declararla.

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"

Esta constante es opcional. Si no se declara, el IDE tratar de hacer lo mejor posible.

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

"F" Usa el valor real de la propiedad Arrange. Por ejemplo:


PUBLIC CONST _DefaultArrangement AS Integer = "V" ' Arrange.Vertical

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

Requerimientos del componente


Se pueden especificar los requerimientos del componente en la pestaa "Requiere" del dilogo de propiedades del proyecto. Observa que esta pestaa no es visible cuando un proyecto no es un componente. En esta pestaa se listarn todas las dependencias de tu componente sobre otros componentes. La seccin "Caractersticas" tiene cuatro check-boxes, cada una con una caracterstica proporcionada por uno o varios componentes. Esta seccin se usa cuando tu componente necesita una caracterstica especfica que no depende de un un componente en especial. Si realmente se necesita algn componente especfico, se pueden seleccionar en la seccin "Componentes" de esta pestaa. Los componentes seleccionados en la pestaa "Componentes" del dilogo de propiedades del proyecto, no tienen nada que ver con los componentes especificados en la pestaa "Requiere" de las propiedades del componente. stos slo se usan para correr el proyecto del componente desde el IDE con fines de depuracin.

Depuracin, instalacin y empaquetado del componente


Depuracin
Para depurar tu componente, directamente se puede usar y correr el proyecto tal cual. La clase de inicio del proyecto y los componentes chequeados en la pestaa "Componentes" del

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!

Componentes adicionales de Gambas


componente Los componentes en Gambas son libreras compartidas externas escritas en C, C++ o en Gambas que agregan nuevas funciones al interprete de Gambas. Estos son almacenados en $PREFIX/lib/gambas2, el valor del $PREFIX dependen de donde este instalado Gambas en su sistema. Por default, $PREFIX esta en /usr/local. Informacin relacionada con los componentes es almacenada en $PREFIX/share/gambas2/info. Para usar un componente en un proyecto, debe seleccionar el componente en el men Project Propiedades, o de lo contrario obtendr un mensaje de error:
Cannot load name class. Unable to load clase file

Cmo programar componentes en C/C++ Introduccin


NOTA: Esta pgina est en proceso de traduccin. Nos vendra bien tu ayuda para terminarla

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.

La Interfaz de Programacin de Gambas


La Interfaz de Programacin de Gambas es un conjunto de utilidades, funciones y macros que le permiten: Describir el componente. Definir los ganchos (hooks) del intrprete. Manipular matrices (arrays), tablas hash... Manipular los tipos de datos nativos de Gambas. Crear arrays (matrices) y colecciones de Gambas. Lanzar eventos Manipular los objetos de Gambas. Cargar un fichero desde el archivo de proyecto. Cargar otros componentes. ...

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.

Escribir buenos componentes (Components)


Escribir buenos componentes es bastante difcil!. Supongamos que quiere escribir un componente SDL, es decir, un componente que le permita a un proyecto de Gambas usar toda la potencia de la librera SDL: grficos, sonido, CD-ROM... Se puede contentar con simplemente recubrir las funciones de la librera, sus estructuras y constantes. Es el modo fcil, incluso si el recubrimiento de funciones y estructuras de C no fuera posible en todos los casos con Gambas. Su componente sera til, pero no muy interesante para el programador de Gambas porque se vera obligado a programar en estilo C o C++. En lugar de hacer esto, sera mejor que se rascara un poco el cerebro para crear un interfaz distinto entre Gambas y la librera, intentando generalizar y simplificar la interfaz original de la librera. That is what I did with QT: it is far easier to use the QT component than programming the QT library directly. And if one day somebody writes a GTK+ component, he will be able to use the same interface because I tried to generalize the QT interface by avoiding all the QT specific stuff... Well, to be honest, I put all the useful QT specific stuff into a dedicated extended component, gb.qt.ext

Component Source Organization


The source files of a component are stored in a sub-directory of the lib directory of the source package. The path of this directory reflects the name of the component. For example, the gb.qt.kde component sources are stored in the .src/lib/qt/kde directory. A typical component directory contains : The autoconf/automake stuff, i.e. a Makefile.am file that describes how to /def/compile the component. (new topic) One source file and one header file for each main class implemented in the component. One main file that implements the entry points of the component. One component description file. For example, here is the result of ls ./src/lib/qt/kde just before the compilation :
CApplication.cpp Makefile.am CApplication.h Makefile.in CDatePicker.cpp CDatePicker.h CDialog.cpp CDialog.h lib.gb.qt.kde.component main.cpp main.h Makefile

The component source directory structure looks something like this:


-+- lib | +---+- db | | | +----- mysql | | | +----- postgresql | +----- eval | +----- example | +----- net | +---+- qt | | | +----- editor | | | +----- ext | | | +----- kde | +----- sdl

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

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 caractersticas. Posiblemente hay ms similitudes que diferencias, pero no puedes copiar un proyecto de VB e intentar compilarlo bajo Gambas. El smbolo aparecer algunas veces en las pginas de esta documentacin, para indicar que hay

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.

Diferencias no referentes al lenguaje


En VB el cdigo de cada formulario y el objeto formulario estn 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 Archivo de definicin del proyecto Mdulo Archivo de Class Archivos de recursos binarios Visual Basic .vbp .bas .cls .frx Gambas .project (uno por directorio) .module .class .form Algn otro archivo almacenado en el directorio del

Archivo de definicin del Form .frm

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 :-).

Lo que VB tiene y Gambas no


No se puede editar el cdigo en modo de depuracin en Gambas; es necesario detener la ejecucin 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 parmetros por referencia si no se usa la palabra clave ByVal, as que tenga cuidado cuando intente portar un proyecto VB. Tambin 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 versin en desarrollo. No existe nada parecido a una variable global para todo el proyecto en Gambas. Para simularlo se puede hacer una clase llamada Global y declarar las variables globals como variables pblicas estticas de esa clase, entonces se puede referir a ellas como Global.nombre_de_la_variable en todo el proyecto. No es una prctica de programacin muy elegante, pero al menos funcionar como una variable global cuando quiera usarla ;) En un mdulo 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 cdigo a expensas de trabajar un poquito ms. No hay nada en Gambas equivalente a la propiedad Index de los controles en los formularios de VB. Es muy fcil crear arrays de controles, pero hay que hacerlo mediante cdigo. No hay en la actualidad ninguna forma de hacerlo grficamente. Por tanto, cuando copie y pegue un control, en lugar de preguntar si desea hacer un array de controles, lo que hace Gambas automticamente 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 versin en desarrollo. El evento MouseMove solo ocurre en Gambas cuando hay pulsado un botn del ratn. La nica

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! :-)

Same Functionality, Different Terminology


End Sub/End Function: see END. Exit Sub/Exit Function: see RETURN. Also, rather than setting a variable 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 Float 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 ../../comp/gb.form/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 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.

Preguntas Frecuentes Por que este proyecto se llama "Gambas"?


Parece que todos los proyectos de Software libre, tienen nombre de animales, especialmente los lenguajes de programacin como: Python, Camel, Bonobo, etc. Y yo buscaba un acronimo recursivo con la palabra "Basic" en ella. As que Gambas Almost Means BASic! (Gambas Casi Significa Basic).

Gambas es compatible con Visual Basic?


No, y nunca lo sera!. Afortunadament, hay muchas similitudes, pero no esperes tomar tu codigo viejo de Visual Basic y correrlo en Gambas sin ningn cambio. Tu puedes localizar y resolver muchos problemas relacionados con las diferencias entre los dos lenguajes leyendo la siguiente pgina: Diferencias con Visual Basic.

Gambas sera compatible con Java or .Net?


Nunca, me temo. Hay muchas razones, buenas y malas: Yo no soy Sun o Microsoft, yo no quiero imponer un solo lenguaje para todo en todas partes. Una cosa estupida, o no lo es? :-) Yo quiero un simple y poderoso lenguaje, no necesariamente para profesionales o nerds. Yo hago esto por diversin tambin!. Me gusta escribir compiladores, interpretes, mquinas virtual... Entonces yo no use el spec de Java o .Net. El IDE de Gambas esta escrito en Gambas.

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.

Por que no mezclar el proyecto con HBasic, MonoBasic, Parrot...?


Existen muchas diferencias tcnicas entre esos proyectos y el mio como para pensar en mezclarlos. Otro problema es que el interprete de Gambas esta limitado a las necesidades del lenguaje que yo necesito. .Net/Parrot tienen necesidades muy diferentes a las de Gambas. No solo es cuestin de interpretar el bytecode. Por ejemplo, esta el problema del conteo de referencia sobre el recolector de basura. Que le pasara al administrador de los componentes del sistema? Al administrador de clases inherentes? Y tambin a...

Como puedo compilar e instalar Gambas?


Por favor leea el LEME

Como puedo desinstalar Gambas?


Si instalaste Gambas usando el sistema de paquetes de tu sistema operativo, entonces es fcil, solo utiliza la forma habitual de desinstalar paquetes. _ Si tu instalaste el codigo fuente como root, entonces solo borra el directorio donde esta instalado. Por ejemplo, si tu instalaste Gambas bajo /opt/gambas2, como root teclea:
$ rm -rf /opt/gambas2

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!

Yo soy un programador de C/C++. Puedo Ayudar?


Por supuesto, tu ayuda es bienvenida! Primero, puedes suscribirte a la lista de correo para desarrolladores y presentarte tu mismo. Entonces, puedes intentar entender la arquitectura de Gambas, el compilador, el interprete, el ambiente de desarrollo, los componentes, y como todo este interactua entre si. Entonces, puedes leer la documentacin en el Wiki: donde explica como puedes programar tu propio componente. Puedes tambien encontrar en los ejemplos un ejemplo completo de un componente llamado componente.example, leyendo el codigo fuente de este componente, puedes entender como escribir tu propio componente. Si deseas escribir un driver para la base de datos, el driver de PostgreSQL esta comentado, entonces es ms fcil entender que es lo que hace. Por supuesto, yo te ayudare con cualquier pregunta que puedas tener, solo espero que t desees invertir ms que solo un ao de escuela para aprender C/C++ :-)

Si no soy programador de C/C++. Como puedo ayudar?


Ayuda en las siguientes tareas es muy bienvenida. Y no necesitas programar en C/C++ para hacerlas!. Jugar con Gambas y reportar cualquier bug. Hacer ejemplos de programacin para principiantes, y mandarmelos para que yo los incluya en la distribucin. Hacer un tutorial para mostrar a los principiantes como escribir su primer programa en Gambas. Esta es una gran idea! :-) Traducir Gambas en tu propio idioma, si es que aun no se ha hecho. Por favor consulte How To Translate The Gambas IDE para mas informacin. Ayudar a traducir este Wiki al espaol, para ello debe Registrarse.

Puedo desarrollar un software comercial con Gambas?


Si, tu puedes hacerlo. Pero si usas el componente de QT, por ejemplo si tu programa tiene una interfaz grafica usando QT, entonces tu tendrs que comprar la licencia de QT antes de empezar ese desarrollo. De lo contrario, tu software tendr que ser software libre :-)

Portaras Gambas a Windows ?


Yo no, pero ayudare a otras personas a intentarlo. Yo anteriormente he compilado el cdigo fuente de Gambas en Cywin, pero eso realmente no funciono. Note que existen muchas cosas por portar, administrador de procesos, componente de Qt, y otras cosas... Es un trabajo enorme.

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.

A continuacin, seleccione su idioma de traduccin en la lista de la izquierda.

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

A continuacin, introduzca su traduccin en el campo de texto en la parte inferior del ../../comp/gb.form/dialog.

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.

Hay otras funciones que ofrece el cuadro de dilogo de botones:

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"

ENDIF 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.

Pi Sin Sinh Tan Tanh Rad

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 )

Devuelve el arcocoseno de un nmero.

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

Elimina un archivo existente. Si quiere eliminar una carpeta, emplee RMDIR.

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

Elimina una carpeta especificada por Ruta. La carpeta ha de estar vaca.

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