martes, 16 de abril de 2013

Debugar en Smallworld

Smallworld a partir de la versión  4.1, es capaz de debugar una función es particular, para activar esta opción, debemos cargar los módulos de “Development Tools”, que se realzará desde el dialogo de carga de modulos.
Para iniciar la carga de módulos, utilizamos el método:
-          sw_module_dialog.open();



Cargaremos todos los modulos de  Development tools, esto nos creará una nueva aplicación en el aplication manager llamada Development tools,  esta aplicación nos dara el poder de un desarrollador avanzado, con múltiples funcionalidades, que iremos explicando poco a poco, pero la que nos interesa actualmente es la debugación de un método determinado, para ello abriremos la aplicación u activaremos la función “debug Magik Methods”

Al abrir esta funcionalidad, nos encontraremos con una ventana muy simple, con un gran espacio para escribir, en este espacio deberemos copiar el método que queremos debugar. Esta pantalla de debugación también se puede abrir una vez cargamos los módulos de desarrollador, con el mathode:
-          dev_tools.activate_debugger()
Como ejemplo hemos creado el siguiente método:
_method integer.mola()   x<<3   y<<2   z<< x+y
   _return z_endmethod$
La hemos compilado y copiado en el debuger, una vez copiado hemos clicado el botón OK.
Inmediatamente la ventana nos ha recompilado el código y nos ha puesto checkbox al lado de cada línea, estos chekbox serán nuestros breakpoints, si esta activo se parara en esa línea.


Ahora al ejecutar el método, si tenemos algún punto de interrupción se parará en esa línea
La opciones  que tenemos para debugar nuestro código son:


-          Step: Ejecuta la línea de código actual.
-          Run: Sigue la ejecución del código, hasta el siguiente punto de interrupción.
-          TraceBack: nos abrirá una ventana con el traceback de nuestro código.
-          Object: esta opción abre una ventana para la inspección del objeto, esta ventana se puede abrir con un click sobre la variable.

Hasta aquí el primer contacto con el debugador de magik, para todos aquellos que estamos usando Emacs en lugar del MDT. En breve explicaremos con más detalle, tanto más opciones de las developers tools, como la ventana del inspector.

Hasta la próxima.

viernes, 22 de marzo de 2013

Volvemos a la programación Magik

Buenos dias, por unas cosas de la vida, despues de cinco años de no tocar Magik, para nada, vuelvo al maravilloso mundo de Magik y Emacs.
Esta vez para realizar una migración de una aplicación de versión 4.0 a la versión de SmallWord 4.3.
He empezado a ver muchas diferencias entre estas versiones de Smallworld, así que ire explicandolas a medida que las vaya descubriendo y usando.

Para abrir boca, de la primera funcionalidad que hablaremos es de la debugación de metodos, pero eso serà en el proximo articulo.

Por tanto solo me queda por decir bienvenido de nuevo al mundo Magik.

Saludos y hasta pronto

lunes, 3 de marzo de 2008

Nos Linkamos con sworldwatch


El blog por excelencia de SmallWorld y programación Magik sworldwatch, hacen referencia nuestro Blog, cosa que nos enorgullece muchísimo.

Con apoyos como este, esperamos seguir vivos durante mucho tiempo, muchísimas gracias a Alfred Sawatzky, por su apoyo.

viernes, 29 de febrero de 2008

Ejemplo Barra de Progreso

Aquí tenéis otro ejemplo de código, esta vez una barra de progreso, que se abre en un dialog nuevo, es muy sencilla de utilizar.

_block
_local Bprog << progress_indicator_dialog.new ( "Generando" )
Bprog.info_string << "Prueba de barra progreso."
Bprog.bar_label << "Generación de frames frames..."
Bprog.image << { :help, _unset }
Bprog.activate ()

Bprog.max_count << 100

_for n _over range(1,100,1)
_loop
_thisthread.sleep(10)

Bprog.progress_changed(n)
_endloop
Bprog.close()
_endblock
$
Si tenéis preguntas sobre el código, me las podéis hacer como comentarios, intentare responder lo antes posible.

miércoles, 27 de febrero de 2008

Ejemplo con tree_item

primer ejemplo, creo que sencillo, por si alguna vez teneis que utilizar un tree_item.
El funcionamiento es sencillo, creamos un dialogo, montamos un tree_item en un Row_Col, para llenarlo usamos una Rope, rellena de display_tree.
Aquí un ejemplillo:

#% text_encoding = iso8859_1

def_slotted_exemplar(:Proba_tree,
{
{:item,_unset},
{:datos,_unset}
},
:model)
$

$
# Definicion de acceso a los slots de la clase
Proba_tree.define_slot_access(:item, :write, :private)
$
# Definicion de acceso a los slots de la clase
Proba_tree.define_slot_access(:datos, :write, :public)
$

_pragma(classify_level=basic)
_method Proba_tree.new()
##
## en el ini llenamos el Tree
.datos< _local dt, vals, dtC, dtCC
dt << display_tree.new("IMPAR")
dtC << display_tree.new(_unset, "UNO",dt)
dtC << display_tree.new(_unset, "TRES",dt)
dtC << display_tree.new(_unset, "CINCO",dt)
dtC << display_tree.new(_unset, "SIETE",dt)
dtC << display_tree.new(_unset, "NUEVE",dt)
dtCC << display_tree.new(_unset, "NUEVE UNO",dtC)
dtCC << display_tree.new(_unset, "NUEVE DOS",dtC)
dtCC << display_tree.new(_unset, "NUEVE TRES",dtC)
.datos.add(dt)
dt << display_tree.new("PAR")
dtC << display_tree.new(_unset, "DOS",dt)
dtC << display_tree.new(_unset, "CUATRO",dt)
dtC << display_tree.new(_unset, "SEIS",dt)
dtC << display_tree.new(_unset, "OCHO",dt)
dtC << display_tree.new(_unset, "DIEZ",dt)
.datos.add(dt)
>> _clone.init()

_endmethod
$

_pragma(classify_level=basic)
_private _method Proba_tree.init()
##
## Inicializacion del nuevo elemento
_super.init()
.item << property_list.new()
_self.changed(:datos, :renew)
>> _self

_endmethod
$

_pragma(classify_level=basic)
_method Proba_tree.capcalera
##
## Defineix una capçalera al tree_item
>> {"PROBA"}
_endmethod
$

# metodo redefinido de model del que recibe a_container con el
# cual no tenemos que crear ni el frame ni el panel. ya nos lo
# da :model
_pragma(classify_level=basic)
_method Proba_tree.activate_in(a_container)
##
## Activacion de pantalla

_local rc

# propiedades de la ventana
a_container.resizable? << _false
a_container.maximizable? << _true
a_container.minimizable? << _true

# cración de Tree item.
# Tree_item. :many significa que se puede seleccionar mas de uno

rc_0 << rowcol.new(a_container, 1, 1, :pixel,
:style, :top_level,
:col_spacing, 0
)
.item[:lista] << tree_item.new(rc_0,
:column_headings, _self.capcalera ,
:model, _self,
:aspect, :datos,
:data_selector, :datos,
:col, 1,
:col_alignment, :fill,
:row_alignment, :fill,
:height, 300,
:mode, :many,
:row, 1,
:width, 340 )

# elemento rowcol para colocar objetos en la pantalla
rc << rowcol.new(a_container, 1, 3, :pixel,
:style, :top_level,
:col_spacing, 0
)
# boton para salir de la pantalla
button_item.new(rc,"Salir",_self,
:quit|()|,
:row, 1,
:col, 2
)

>> a_container

_endmethod
$

# procedimiento para inicial la aplicación
_block
_local a << _unset
a << Proba_tree.new()
a.activate()
_endblock
$
Si teneis dudas las contestare en los comentarios.

Presentación

Antes de nada bienvenidos a lo que espero sea un blog útil para todos aquellos que nos tenemos que romper los cuernos, con la programación en Magik de Smallworld.
Hoy mismo he acabado una formación que ha durado un mes, para la adquisición de conocimientos sobre la materia, a partir de mañana empezara lo serio, trabajo para el cliente. Por ello he pensado que podria crear un Blog, donde ir colgando diferentes ejemplos, dudas que me surgieran,... ya que para la formación he tenido muchos problemas para encontrar información util, sencilla y ademas en castellano.

Espero no defraudar a nadie.