Consultas, desarrollo de programas y petición de presupuestos:

Mostrando entradas con la etiqueta comentarios. Mostrar todas las entradas
Mostrando entradas con la etiqueta comentarios. Mostrar todas las entradas

domingo, 8 de enero de 2012

MapComen: Generador de comentarios para Robodoc



MapComen:
Generador de comentarios para Robodoc desde el código fuente en gambas2 y gambas3





Como os comente la semana pasada he estado realizadon este programa, con el FrontEndRoboDoc, podeis documentar facilmente vuestros proyectos de gambas2 y gambas3. En concreto esta utilidad, analiza el codigo fuente, añadiendo "etiquetas" y la estructura que necesita RoboDoc para crear la documentación. 




Su utilización es muy sencilla, y simplemente tenéis que elegir el proyecto y pulsar el botón de "Generador comentarios".

Luego, ejecutar el FrontEndRobodoc y ya tendreis la documentación generada.

Aqui teneis una pagina web generada del proyecto "Siesta" de Shordi:


Enlaces de descarga: 


Y un video de ejemplo de su uso:



Saludos

Nota:
Esta versión es una beta, puede contener errores, hacer copias de seguridad de vuestros proyectos antes de usar el programa.

Generador de Documentacion para Gambas2 y Gambas3: Front-End para RoboDoc

Generador de Documetación para Gambas2 y Gambas3
Un Front-End para RoboDoc

Cuando conocí java, también encontré a javadoc (no confundir con gambadoc), un generador de documentación que analizaba el código fuente y los comentarios para crear la documentación del programa.

He estado buscando un programa, similar, para que hiciera esa tarea con nuestras aplicaciones realizadas con gambas2 o gambas3, y revisando el cuadro de la wikipedia de generadores de documentación, encontré a RoboDoc. (He traducido (con google traduce) al castellano el manual de instrucciones  enlace )

Para poder usarlo con los proyectos de gambas, este programa hay que crear un archivo robodoc.rc.

 Ejemplo de configuración realizada:
headertypes:
P "Procedure" robo_procedure
E "Events" robo_event
header markers:
'****
remark markers:
'*
end markers:
'****
  ( En el FrontEnd que he realizado, ademas se ha añadido la serie de palabras claves para Gambas2 y Gambas3, que no lo pongo aqui porque es muy extensa).

He creado este Front-End (que añade este archivo de configuración) para que podamos usar RoboDoc, y que nos cree la documentación de nuestros proyectos Gambas.


Programa Ejecutable: FrontEndRoboDoc002.83.gambas [version 0.0.2]
Código Fuente (no ejecutar): frontendRoboDoc-0.0.83.tar.gz [version 0.0.2]

Nota Importante:
Es una beta, usarlo con cuidado, hacer copias de seguridad de vuestros proyectos antes de ejecutar el programa.

Podeis ver este video para ver como se utiliza:



El programa crea una nueva carpeta (Hdoc) dentro de la carpeta de nuestro proyecto, y alli podemos encontrar los archivos .html (si hemos elegido la opción de tipo html).

Os dejo aqui un archivo para que veas como hay que "codificar" los comentarios y para ver el resultado en html obtenido por RoboDoc, ver este enlace (ficheros html)


Captura de Pantalla:
Código que la genera:
'****h* Clases/Tableview
'****
'****h* Tableview/Definicion
'* FUNCTION
'* El Control Tableview
'* http://www.gambas-es.org/el-control-tableview-vf4-vt37.html
'* SYNOPSIS
'* Mejora del gridviews, para hacerlo editable
'* INPUTS
'* Hereda de un gridview
'* RESULT
'* Retorna un control gridviews editable
'* SOURCE
' Codigo fuente '
' Gambas class file '
' hereda del control Gridviews '
INHERITS GridView
' la clase se exporta: Esto significa que la clase será visible desde un programa principal cuando creemos un componente. '
EXPORT
' Creamos nuevos eventos o sustituyen a otro ya definido '
EVENT Save(Row AS Integer, Column AS Integer, Value AS String)
EVENT Insert
EVENT Click
' creamos controles auxiliares '
PRIVATE $hTextBox AS TextBox
PRIVATE $hComboBox AS ComboBox
' objeto hEditor: es un objeto que podra ser un combobox o un textbox... '
PRIVATE $hEditor AS Object
PRIVATE $bTextBox AS Boolean
PRIVATE $iCol AS Integer
PRIVATE $iRow AS Integer
' Objeto Watcher: Esta clase implementa un Objeto que puede ver cualquier tipo de control y crear algunas situaciones '
' cuando algo sucede en él. Esta clase es especialmente útil para saber cuando un UserControl o UserContainer se mueve, cambia de tamaño, mostrar u ocultar. '
PRIVATE $hWatcher AS Watcher
'****
'****m* Tableview/Constructor de Tableview
'* FUNCTION
'* Construye el tableview
'****
'constructor.....
PUBLIC SUB _new()
DIM hObs AS Observer
' llama al observador y al wacther como nombre del grupo "GridView" '
hObs = NEW Observer(ME) AS "GridView"
$hWatcher = NEW Watcher(ME) AS "GridView"
$hComboBox = NEW ComboBox(ME.Window) AS "Editor"
$hComboBox.Ignore = TRUE
$hComboBox.Hide
$hTextBox = NEW TextBox(ME.Window) AS "Editor"
$hTextBox.Ignore = TRUE
$hTextBox.Border = FALSE
$hTextBox.Hide
END
'****m* Tableview/SaveEditor()
'* FUNCTION
'* Guarda en la celda lo editado
'****
PRIVATE SUB SaveEditor()
DIM sText AS String
IF NOT $hEditor THEN RETURN
sText = $hEditor.Text
IF sText = ME[$iRow, $iCol].Text THEN RETURN
' Raise: Esta orden dispara un evento antes declarado con la palabra clave EVENT. '
RAISE Save($iRow, $iCol, sText)
' refresca la celda.. '
ME[$iRow, $iCol].Refresh
END
'****m* Tableview/Save()
'* FUNCTION
'* Oculta el editor.
'****
PUBLIC SUB Save()
HideEditor
END
'****m* Tableview/Cancel()
'* FUNCTION
'* Cancela la edicion
'****
PUBLIC SUB Cancel()
HideEditor(TRUE)
END
'****c* Tableview/HideEditor()
'* FUNCTION
'* Oculta el editor.
'* RESULT
'* Retorna el editor, como oculto y null
'****
PRIVATE SUB HideEditor(OPTIONAL bNoSave AS Boolean)
IF $hEditor THEN
IF NOT bNoSave THEN SaveEditor
$hEditor.Hide
$hEditor = NULL
ENDIF
END
PRIVATE SUB MoveEditor()
DIM X, Y AS Integer
IF NOT $hEditor THEN RETURN
' determina posicion del editor text '
X = ME.ScreenX - ME.Window.ScreenX
Y = ME.ScreenY - ME.Window.ScreenY - ME.Window.ClientY
'DEBUG $iRow;; $iCol
' Mueve el objeto $hEditor, a la posicion de la celda (x,y, y su ancho y altura) '
WITH ME[$iRow, $iCol]
X += .X
Y += .Y
$hEditor.Move(X, Y, .Width, .Height)
END WITH
'DEBUG
$hEditor.Font = ME.Font
$hEditor.Show
'DEBUG
END
PUBLIC SUB GridView_MouseDown()
HideEditor
END
PUBLIC SUB GridView_RowResize(Row AS Integer)
HideEditor
END
PUBLIC SUB GridView_ColumnResize(Column AS Integer)
HideEditor
END
PUBLIC SUB GridView_Scroll()
HideEditor
END
PUBLIC SUB GridView_Resize()
HideEditor
END
PUBLIC SUB GridView_Hide()
HideEditor
END
PUBLIC SUB GridView_Change()
HideEditor
END
PUBLIC SUB Edit(OPTIONAL List AS String[], OPTIONAL ReadOnly AS Boolean)
' DEBUG '
HideEditor
$iCol = ME.Column
$iRow = ME.Row
IF $iCol < 0 OR $iRow < 0 THEN RETURN
IF List THEN
$hComboBox.List = List
$hComboBox.ReadOnly = ReadOnly
$hEditor = $hComboBox
$bTextBox = NOT ReadOnly
ELSE
$hEditor = $hTextBox
$bTextBox = TRUE
ENDIF
$hEditor.Text = ME[$iRow, $iCol].Text
TRY $hEditor.SelectAll
MoveEditor
$hEditor.SetFocus
END
PUBLIC SUB Editor_Activate()
SaveEditor
END
PUBLIC SUB Editor_Click()
SaveEditor
END
PUBLIC SUB Editor_KeyPress()
SELECT CASE Key.Code
' pulsa la tecla Esc '
CASE Key.Escape
$hEditor.Text = ME[$iRow, $iCol].Text
STOP EVENT
' pulsa la tecla Flecha hacia arriba '
CASE Key.Up
WHILE ME.Row > 0
'DEC: quita 1 unidad.
DEC ME.Row
RAISE Click
IF $hEditor THEN
STOP EVENT
BREAK
ENDIF
WEND
' pulsa la tecla Flecha hacia abajo '
CASE Key.Down
WHILE ME.Row < (ME.Rows.Count - 1)
' INC: incrementa 1 unidad '
INC ME.Row
' Esta orden dispara un evento antes declarado con la palabra clave EVENT. En este caso el Click '
RAISE Click
IF $hEditor THEN
' para el evento '
STOP EVENT
BREAK
ENDIF
WEND
' pulsa la tecla Flecha hacia izquierda '
CASE Key.Left
IF $bTextBox AND IF $hEditor.Pos > 0 THEN RETURN
DO
IF ME.Column > 0 THEN
'DEC: Decrementa una variable. (le quita 1)
DEC ME.Column
RAISE Click
ELSE IF ME.Row > 0 THEN
ME.MoveTo(ME.Row - 1, ME.Columns.Count - 1)
RAISE Click
ELSE
BREAK
ENDIF
IF $hEditor THEN
TRY $hEditor.Pos = $hEditor.Length
STOP EVENT
BREAK
ENDIF
LOOP
' pulsa la tecla Flecha hacia la derecha '
CASE Key.Right
IF $bTextBox AND IF $hEditor.Pos < $hEditor.Length THEN RETURN
DO
IF ME.Column < (ME.Columns.Count - 1) THEN
INC ME.Column
RAISE Click
ELSE IF ME.Row < (ME.Rows.Count - 1) THEN
ME.MoveTo(ME.Row + 1, 0)
RAISE Click
ELSE
BREAK
ENDIF
IF $hEditor THEN
TRY $hEditor.Pos = 0
STOP EVENT
BREAK
ENDIF
LOOP
' pulsa la tecla Enter o Return '
CASE Key.Enter, Key.Return
IF $bTextBox THEN
DO
IF ME.Column < (ME.Columns.Count - 1) THEN
INC ME.Column
RAISE Click
ELSE IF ME.Row < (ME.Rows.Count - 1) THEN
ME.MoveTo(ME.Row + 1, 0)
RAISE Click
ELSE
RAISE Insert
STOP EVENT
BREAK
ENDIF
IF $hEditor THEN
TRY $hEditor.Pos = 0
STOP EVENT
BREAK
ENDIF
LOOP
ENDIF
END SELECT
END
'****h* Clase/SegundaClase
'* FUNCTION
'* Viendo la cabecera de SegundaClase clase
'****
'****h* SegundaClase/Definicion
'* FUNCTION
'* Esto es una comprobacion de clase
'* http://www.gambas-es.org/el-control-tableview-vf4-vt37.html
'* SYNOPSIS
'* Mejora del gridviews, para hacerlo editable
'* INPUTS
'* Hereda de un gridview
'* RESULT
'* Retorna un control gridviews editable
'****


Espero que os resulte util.

Nota:
Estoy trabajando en un programa que "lea" el codigo fuente y crea el 80% de los comentarios necesarios para RoboDoc, asi sera mucho mas facil (y menos trabajoso) añadirles los comentarios.
Ver este enlace: mapcomen-generador-de-comentarios


Notas:
21/nov/2011: corregido bugs cuando fallaba la copia del icono.
13/nov/2011: Las descargas estan actualizadas a la version 0.0.2.
Se le ha añadido la impresión en la documentación del icono y titulo del proyecto
21/nov/2011: corregido bugs cuando fallaba la copia del icono.

lunes, 29 de agosto de 2011

Indentador / Sangrado de nuestro Código Fuente realizado en Gambas2

Actualización a Gambas3
El indentado del código en Gambas3 ya esta integrado en el Ide. Lo podeis activar en el menu: Herramientas/Preferencias/Formateo de Codigo


Este programa es para Gambas2:
El otro dia charlando con jguardon, uno de los administradores del foro gambas-es.org, estuvimos hablando sobre las diferencias entre Gambas y Python. Me comentaba que en lenguajes como Python el sangrado o indentado es fundamental ya que indican cuando termina un bucle o intrucción. Me explico que no existe, por ejemplo ENDIF, solo que se se disminuye la indentación o sangría (este es el termino correcto en castellano) para indicarle a Python que se ha terminado la instrucción IF THEN.

Una de las razones  de la "mala fama" que tiene programar en Basic, es que es considerado por los otros programadores "profesionales", que es para personas que empiezan a programar y no con fines serios. Y que al no ser necesario indentar o sangrar los programas realizados en Basic, para que funcionen, los usuarios de este lenguaje no cuidan este detalle, que es fundamental para facilitar la lectura del programa para otras personas que no han realizado e incluso para el propio autor para futuras ampliaciones , que se tiene que volver a "enterar" de como lo hizo (importantísimo también el tema de comentar el código del programa).

Bueno, para resolver este problema (que también lo tengo yo....), he realizado esta utilidad. Este pequeño programa  realiza la indentación o sangría de nuestro código fuente de un proyecto completo realizando en Gambas, archivos de .class y .module, que son los que contienen el código fuente del programa.









Ejemplo del código sin indentar:



Ejemplo del código una vez indentado:


Varios Comentarios:

1) El programa sirve para hacer el indentado o sangria, pero no detecta los errores del código fuente.
2) Hacer siempre una copia de seguridad de vuestro proyecto antes de usar este programa. Aunque lo he probado y funciona correctamente, puede producirse errores y perderse o alterarse el código fuente.
3) Vuestro programa  no tiene que estar acabado para realizar el indentado, es un proceso que lo podemos realizar mientras vamos realizando las distintas partes del código.

 Aqui teneis el enlace de descarga del código fuente:  http://manualjsb.googlecode.com/files/Indentacion-0.0.3.tar.gz



Espero que os sea útil y que vuestros programas sean "más legibles" y "más profesionales"

domingo, 28 de agosto de 2011

Componente gb.odt: 2º versión

Ya esta aquí la 2º versión de este control, ampliamente mejorado en lo referido a los formatos y tipos de letras que se reconocen.







 Enlaces de descarga:
Paquete código fuente:
https://app.box.com/s/5kjcnmqolh3jic9s8o3z (actualizado enlace 27/05/2014)

http://manualjsb.googlecode.com/files/odt-0.2.0.tar.gz


Ayuda sobre el componente:
http://manualjsb.googlecode.com/files/manual%20del%20uso%20del%20componenete%20gbgbt%20020.odt%20.odt

Paquete .deb

http://manualjsb.googlecode.com/files/gambas2-odt_0.2-1_all.deb

Código fuente de un programa de ejemplo:
http://manualjsb.googlecode.com/files/pruebaodt-0.2.tar.gz

Saludos

Gambas: nueva clase MultiInput

 
 MultiInput

Una nueva clase para  facilitar la introducción de datos en Gambas2





En gambas existe la clase InputBox, con la cual podemos obtener fácilmente del usuario una cadena para asignarla posteriormente a una variable. Un ejemplo:

 Asi, obtenemos el valor de "edad".


Pues bien, he desarrollado una nueva clase , para poder trabajar con mas asignaciones, obteniendo un formulario  como este:

Para poderlo usar en vuestros programas, os paso el código fuente,del cual tendreis que:
- Descomprimirlo y abrirlo con Gambas2.
- Crear el ejecutable (Proyecto/Crear/Ejecutable).
- Os creara un nuevo control personalizado que lo podréis incluir en vuestros proyectos (Proyecto/Propiedades/Componentes/Componentes del usuario)

Os explico a continuación el uso de la nueva clase:

Propiedad/Método Nombre Definición
Atributo titulo Define el titulo del formulario.
Método add Añade una variable,texto de presentación, y opcionalmente valor inicial
Método mostrar Muestra el formulario para rellenar los datos.
Nota: El botón cancelar hara que los valores no se guarden y se muestre “N/A”
Método devuelve Devuelve una cadena de texto del valor de la variable que le hayamos indicado.


Os paso también un ejemplo del uso de la nueva clase.
Esta es la transcripcion del código del ejemplo:

PUBLIC SUB Form_Open()
DIM mu AS NEW MultiInput
mu.titulo = "hola esto es una prueba"
mu.add("nombre1", "nombre usuario:", "ninguno")
mu.add("apellidos1", "primer apellido:", "")
mu.add("apellidos2", "segundo apellido:", "")
mu.add("direccion", "direccion de vivienda:")
mu.mostrar()
TextArea1.Text = mu.devuelve("nombre1") & "\n"
TextArea1.Text &= mu.devuelve("apellidos1") & "\n"
TextArea1.Text &= mu.devuelve("apellidos2") & "\n"
TextArea1.Text &= mu.devuelve("direccion") & "\n"
TextArea1.Text &= "Ahora probamos con una variable que no existe:" & "\n"
TextArea1.Text &= mu.devuelve("dksl") & "\n"
END


Como veis lo primero que hacemos es crear nuestra nueva instancia "mu" del MultiInput.

Luego le voy pasando el titulo del formulario
mu.titulo

Y voy añadiendo variables, primero el nombre, luego el texto de la etiqueta texto que pondra, y el valor por defecto.
mu.add({nombre_variable},{texto de la etiqueta},{valor opcionar})

Luego llamamos al formulario con:
mu.mostrar()

Y para obtener los valores, usamos el método devuelve indicandole el nombre de la variable
mu.devuelve({nombre_variable})

En esta página podéis ver como lo hice:
http://componentesgambas2.blogspot.com/p/multiinput.html

Bueno, espero que os sea util.

Saludos