Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Ayuda En La Creación De Un Componente
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Ayuda En La Creación De Un Componente 
 
Hola a todos, estoy intentando hacer un componente, mirando el manual de gambas y alguna otra página, pero no lo consigo.
He probado de crear un formulario con un botón, pongo la sentencia EXPORT y lo compilo como un componente.
Teóricamente me tendria que salir después en los componentes de gambas pero no logro encontrarlo.
En el manual pone que debo crear otras constantes pero no se como ponerlas, no hay ningún ejemplo.
Alguien tiene un sencillo ejemplo de componente creado o puede postear el código mínimo necesario?
Muchas gracias.
 



 
maikl - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
Nunca he programado un componente, pero hacía mucho tiempo que este tema me intrigaba así que me he puesto manos a la obra y he sacado esto. Muchas cosas son literales de la documentación que he buscado pero he procurado dejarlas mas claras y explicando los ejemplos para la mejor comprensión. Alguno de esos textos está en ingles y eso a mucha gente no le ayuda xDDDDD.

Veamos:

Tu creas una clase nueva.
Si te basas en una clase ya existente pones el inherits
Luego añades la claúsula export.
Luego tienes que definir la constante _properties que es obligatoria. Esta constante proporciona información al IDE de como debe operar con esa propiedad.
También tienes que definir un icono para ese control en la caja de herramientas.
Y por último te tienes que poner a escribir código para esas propiedades y métodos.

la constante _properties
Luego pones la variable _properties que tiene el siguiente formato:
PUBLIC CONST _properties="*, propiedad1, propiedad2, ..., etc"

cada propiedad en la línea anterior lleva la siguiente información:
[-] Name [ { Kind [ Arguments ] } ] = Default

El signo menos: Si una de las propiedades la declaras con un signo - significa que las quitas. Eso ocurre si usas un * para heredar todas las propiedades del padre, pero alguna de ellas no la quieres. Entonces la declaras como una mas pero con un signo menos.
La clase puede valer lo siguiente:
Color ---> un entero que representa a un color. Al verlo el IDE sacará un colorchooser para elegir el color
Font ---> Una fuente. El IDE sacará un fontchooser  para elegir una fuente.
Path ---> Un path. El IDE sacará un filechooser para elegir un path
Picture ---> Una imagen o un icono de stock. El IDE sacará un picturechooser para elegirla.
Range ---> Una propiedad con valor entero y un valor mínimo y máximo. El IDE sacará un spinbox para elegirlo.
Clase ---> En vez de los casos anteriores puedes poner el nombre de una clase que contenga una lista de constantes.

Si no especificas clase entonces se utiliza el tipo de dato de la propiedad (string, ..., etc).

Ejemplo
PUBLIC CONST _properties="Enabled=True,Font{Font},Background{Color}=-1,Foreground{Color}=-1," &
   "mode{select.*}=Single,Handle,Tag"

Esto declara las siguientes propiedades:
Una propiedad TAG que no tiene ningún valor inicial. Al no especificarle nada el IDE asumirá su valor datatype especificado posteriormente.
Una propiedad HANDLE que no tienen ningún valor inicial. Al no especificarle nada el IDE asumirá su valor datatype especificado posteriormente y que como veremos es integer.
Una propiedad ENABLED que inicialmente valdrá TRUE
Una propiedad FONT.  No tiene un valor inicial y para seleccionar una fuente el IDE mostrará el fontchooser.
Una propiedad BACKGROUND que tiene valor inicial -1 (no se que color es ese) y para elegirla el IDE usará el colorchooser.
Una propiedad FOREGROUND que funciona igual que la anterior.
Una propiedad MODE cuyos valores posibles están definidos como constantes en una clase llamada 'select'. Tiene por valor por defecto 'single' que es el nombre de una de esas constantes de esa clase.

Con ello habrás definido el nombre de las diversas propiedades que tendrás. el * se utiliza para heredar todas las propiedades de la clase padre si estás basando tu nueva clase en una ha existente que  tendrás que heredar de la siguiente forma:
inherits nombre_clase

Si una de las propiedades la declaras con un signo - significa que las quitas. Eso ocurre si usas un * para heredar todas las propiedades del padre, pero alguna de ellas no la quieres. Entonces la declaras como una mas pero con un signo menos.

La constante DefaultEvent
PUBLIC CONST _DefaultEvent AS String = "Click"

Si pones esto (no es obligatorio) entonces al estar en el IDE y hacer doble click para acceder al código te saldrá el evento click para escribir código.

La constante DefaultSize
PUBLIC CONST _DefaultSize AS String = "36,36"

Es el tamaño del control cuando lo pones en un formulario del IDE. En este caso es 36x36.

La constante _DrawWith
PUBLIC CONST _DrawWith AS String = "TextBox"

Cuando pongas un control de esta clase en el formulario del IDE pintará un textbox.

La constante _Arrangement
PUBLIC CONST _Arrangement AS Integer = 2 ' Arrange.Vertical

Es el arrange que tendrán sus hijos si se trata de un contenedor. En el caso propuesto es 2. Los valores posibles son los de la clase arrange.class
Solo se usa si el control es un container.

El icono del componente
En la caja de herramientas debe aparecer un icono del control para poder seleccionarlo. Para definirlo hacemos lo siguiente:
En la raíz del directorio del proyecto creamos una carpeta llamada control que contendrá los iconos (deben ser png) y el nombre del icono debe ser el nombre de la clase.

Implementación de las propiedades
Anteriormente se explicó como declararlas para el IDE. Esto es el icono que tendrá en la caja de herramientas o la manera en que el IDE debe ofrecernos dar valores a las propiedades o el valor por defecto que tendrán.

Pero llega el momento en que hay que escribir código de lo que esas propiedades hacen. Una propiedad será de tipo string o integer o lo que sea.
PROPERTY Enabled AS Boolean
PROPERTY READ Handle AS Integer
...

PRIVATE $bEnabled AS Boolean
PRIVATE $iHandle AS Integer

' Implements the Enabled property
FUNCTION Enabled_Read() AS Boolean
  RETURN $bEnabled
END

SUB Enabled_Write(bEnabled AS Boolean)
  $bEnabled = bEnabled
  UpdateEverything
END

' Implements the Handle property
FUNCTION Handle_Read() AS Integer
  RETURN $iHandle
END
 

En este caso implementamos la propiedad ENABLED que es de tipo boolean.

y también definimos una propiedad handle que es de tipo entero y de solo lectura


Recuerdo que en _properties se escribió una propiedad enabled=true osea que el ide pondrá el valor true a una propiedad enabled que ahora definimos como boolean.

Como la propiedad ENABLED es de lectura escritura esta será la función para el caso de lectura (nota el _Read)
FUNCTION Enabled_Read() AS Boolean
  RETURN $bEnabled
END

Y esta será la función de escritura para ENABLED (nota el _write)
SUB Enabled_Write(bEnabled AS Boolean)
  $bEnabled = bEnabled
  UpdateEverything
END

La variable $bEnabled es una variable privada y UpdateEverything es un método privado de esta clase.

La función handle es de solo lectura así que solo tiene función _read
FUNCTION Handle_Read() AS Integer
  RETURN $iHandle
END


Tras la codificación de las propiedades vendrían los métodos uno de los cuales será un método privado llamado UpdateEverything
PRIVATE SUB UptadeEverything()
...
END

Y otros serán públicos y devolverán valores
PUBLIC FUNCTION Ordenar(MiArray as string[]) as string[]
...
return MiArray
END


Así que en definitiva un componente nuevo que se base en un textbox y que admita la propiedad locked que sea boolean y por defecto false sería así:
inherits textbox
export

PUBLIC CONST _properties="*,locked=false" 'el * hereda todas las propiedades de textbox
PUBLIC CONST _DefaultEvent AS String = "Keypress" 'el evento por defecto en el IDE es keypress
PUBLIC CONST _DrawWith AS String = "TextBox" 'se pinta como un textbox

PROPERTY Locked AS Boolean
PRIVATE FUNCTION Locked_read()
...
END
PRIVATE FUNCTION Locked_write()
...
END
y aquí comenzaría la declaración de métodos

Además crearemos un icono para la caja de herramientas, lo dejaremos en la carpeta controls, será de tipo png y tendrá por nombre el de la clase "miclase.png"

Con esto habremos conseguido un nuevo textbox que se llame como sea y que además de las propiedades del textbox tenga una propiedad nueva llamada locked que puede valer true o false y que hace lo que corresponda según locked_read al leer o locked_write al escribirla.(por ejemplo en este caso anular el keypress) cuando sea true


Todo esto lo he sacado de aquí
Programar Componentes en Gambas
Declaración de propiedades
Declaración de métodos

 
 



 
última edición por soplo el Domingo, 01 Noviembre 2009, 17:25; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
Muchas gracias por la información, que currada!
Me lo miraré y haré las pruebas a ver...
Gracias!
 



 
maikl - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
Hacía tiempo que tenía gana de meterle el diente a esto. Cuenta tu experiencia y si va bien lo convierto en un manual.

Como ves a primera vista parece mucho porque hay varias cosas, pero en realidad es muy simple y se resume en tres o cuatro líneas que son siempre iguales. Solo que hay que entender el por que están allí.

Suerte y cuéntanos la experiencia a ver que tal

 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
Hola, por ahora no lo consigo, creo que he seguido los pasos pero despues no veo el control nuevo en ningun sitio para añadirlo a otro proyecto.
Por cierto en el código que has puesto faltaria una coma:
PUBLIC CONST _properties="Enabled=True,Font{Font}Background{Color}=-1,Foreground{Color}=-1," &
   "mode{select.*}=Single,Handle,Tag"

Seria:
PUBLIC CONST _properties="Enabled=True,Font{Font},Background{Color}=-1,Foreground{Color}=-1," &
   "mode{select.*}=Single,Handle,Tag"

(una coma entre ...{font} y Background...)

Continuaré probando, a ver si se anima alguien mas hábil a intentarlo...
 



 
maikl - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
bueno bueno bueno, vamos progresando.

Mis pasos (a ver si lo recuerdo todo):
Nuevo proyecto normal. Nombre: component3
Quito el form, solo usaré la clase que llamaré igual: component3
La hago principal (botón derecho en la clase)
Creo carpeta control en el proyecto y pongo el icono con el mismo nombre: component3.png
En la clase pongo este código (no hace nada, pero solo queria que despues pudiese añadir el control en otro proyecto.

' gambas class file
EXPORT

PUBLIC CONST _properties AS String = "Enabled=True,Font{Font},Background{Color}=-1,Foreground{Color}=-1,mode{select.*}=Single,Handle,Tag"
PUBLIC CONST _DefaultEvent AS String = "Click"
PUBLIC CONST _DefaultSize AS String = "36,36"
PUBLIC CONST _DrawWith AS String = "TextBox"
'PUBLIC CONST _Arrangement AS Integer = 2 ' Arrange.Vertical

PROPERTY Enabled AS Boolean
PROPERTY READ Handle AS Integer

PRIVATE $bEnabled AS Boolean
PRIVATE $iHandle AS Integer

' Implements the Enabled property
FUNCTION Enabled_Read() AS Boolean
  RETURN $bEnabled
END

SUB Enabled_Write(bEnabled AS Boolean)
  $bEnabled = bEnabled  
END

' Implements the Handle property
FUNCTION Handle_Read() AS Integer
  RETURN $iHandle
END
 


Voy a proyecto - propiedades - pestaña opciones.
Al final de todo podremos activar que sea un componente, lo he puesto como terminado y estable
En la pestaña "provee" (no se si se llama así, que no lo tengo en castellano):
tenemos la clase puesta, cambiamos el tipo a "control" y en grupo ponemos "Form", que es la pestaña de la caja de herramientas donde veremos el control.
En requiere he activado la opción "Gestión gráfica de formularios" que ni idea de si se usa.
Aceptamos
Vamos a Proyecto - Crear - Ejecutable
Marcamos la opción "instalar en la carpeta de controles del usuario"
Aceptamos.
Abrimos un gambas nuevo (si ya estaba abierto no se dará cuenta del nuevo control)
Vamos a proyecto - propiedades y en la pestaña componentes tenemos al final un apartado de componentes de usuario.
Y allí está nuestro componente, lo marcamos y aceptamos, ahora en la caja de herramientas tenemos nuestro control listo para ser puesto en un form.
Lo ponemos y ahí tenemos un textbox que no hace mucha cosa, pero pronto, pronto...
Ahora me toca hacer otro control a partir de una clase y un formulario donde podré ir añadiendo otros controles, por ejemplo un picture y un list, a ver que pasa.
jeje Saludos y muchas gracias por todo!
 



 
maikl - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
He mirado esa cuestión y veo lo siguiente:

Se trata de agregar la información global del nuevo componente. Cuando vas a proyecto y propiedades para agregar algún nuevo componente aparece una lista que puedes elegir donde cada componente tiene una descripción y unos requerimientos.

Se trata de completar esa información. Se hace en Proyecto - Propiedades
Pestaña Prove
Por cada clase hay que especificar el tipo y el grupo.
El tipo es si es un control y que clase de control.
Los distintos tipos son:
class ----> una clase normal que no es un control
control --> un control que no es un container
virtual ---> Es una clase que puede ser puesta en el formulario y hace cosas pero no muetra nada (ej. el timer).
container ---> pues eso
multicontainer ----> un control container que contiene otros container pero solo uno visible a la vez como por ejemplo el tabstrip
form ---> solo posible en gambas 3 para especificar alguna nueva clase de formulario.

El grupo es el nombre de la pestaña de la caja de herramientas donde este contról estará incluído (containers, form, network, ..., etc).

La pestaña requiere
Aquí se anotan las dependencias de componentes de este nuevo componente. Por ejemplo quizá hemos hecho un componente que requiere gb.settings.

Hay cuatro opciones. Activar una de ellas (por ejemplo gestión gráfica de formularios) supone que requerimos los componentes básicos para la gestión gráfica de formularios sean cuales fueren.

Si por alguna razón necesitamos uno concreto (quizá porque es uno propio) podemos agregarlo un poquito mas abajo en la opción de componentes. en principio con las cuatro opciones anteriores no debiera ser necesario cuando se trata de componentes nativos de gambas.

Instalación
Basta con hacer el ejecutable y aparecerá en la lista de componentes de las propiedades de un proyecto.

Me pregunto si será posible hacer componentes y venderlos para hace negocio. Esto es componentes gambas profesionales con licencia comercial.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ayuda En La Creación De Un Componente 
 
Con mas pruebas he logrado hacer un control a partir de un formulario.
En este caso en lugar de ser una clase el objeto inicial del proyecto será un formulario donde he puesto una lista y un picture.
Al arrastrar el control a un formulario no se ve lo que hay dentro en tiempo de diseño, sale un cuadro con el icono y el nombre, pero bueno, ya es algo.
La variable  _DrawWith creo que solo sirve para dar el aspecto de un control ya definido, he probado en poner el nombre del formulario pero tampoco.
PUBLIC CONST _DrawWith AS String = "cmpDisco"
De hecho por ahora estoy llamando el formulario y el control igual, por si acaso, pero seguro que no hace falta.

Aquí está el código del control, la clase que tenia antes la he quitado, solo queda en el proyecto el formulario y el icono.
Por cierto, el nombre del icono siempre debe ir en minúsculas, aunque el nombre del control sea en mayúsculas, a mi me ha pasado y he estado un rato hasta que lo vi.

' gambas class file
EXPORT

PUBLIC CONST _properties AS String = "Enabled=True,Font{Font},Background{Color}=-1,Foreground{Color}=-1,mode{select.*}=Single,Handle,Tag"
PUBLIC CONST _DefaultEvent AS String = "Click"
PUBLIC CONST _DefaultSize AS String = "100,100"
PUBLIC CONST _DrawWith AS String = "cmpDisco"
'PUBLIC CONST _Arrangement AS Integer = 2 ' Arrange.Vertical

PROPERTY Enabled AS Boolean
PROPERTY READ Handle AS Integer

PRIVATE blnEnabled AS Boolean
PRIVATE intHandle AS Integer

' Implements the Enabled property
FUNCTION Enabled_Read() AS Boolean
  RETURN blnEnabled
END
SUB Enabled_Write(bEnabled AS Boolean)
  blnEnabled = bEnabled  
  lstCanciones.Enabled = blnEnabled
END

' Implements the Handle property
FUNCTION Handle_Read() AS Integer
  RETURN intHandle
END

PUBLIC SUB _new()
  intHandle = ME.Handle
  ME.Show()
END

PUBLIC FUNCTION AbrirDisco(strRuta AS String) AS Boolean
  
  lstCanciones.Add(strruta)
  RETURN TRUE
    
END

PUBLIC FUNCTION AbrirFoto(strArchivo AS String) AS Boolean
  
  TRY picDisco.Picture = Picture.Load(strArchivo)
  IF ERROR THEN
    Message.Error(Error.Text)
  ENDIF
  
END
 


Así que en el formulario donde pongo el control añado un botón que haga:

PUBLIC SUB Button1_Click()

  cmpDisco1.AbrirDisco("hola")
  cmpDisco1.AbrirFoto("/home/maikl/screenshot.bmp")

END
 


y efectivamente al darle al botón se añade el texto "hola" a la lista y el picture carga la imagen que le paso.
A partir de aquí se abre la veda para hacer controles a cascoporro jeje

Saludos!
 



 
maikl - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron