Tuesday, December 16, 2014

Buscando titulos de ventanas externas a Ax

Anteriormente hemos visto como hacer que una función se ejecute varias veces respetando un intervalo de tiempo (aquí), también sabemos como identificar una aplicacion que se está ejecutando (aquí).

Ahora vamos a buscar por titulo de la ventana, para saber si el usuario está realizando algo especifico.

Lo ideal es que el siguiente fragmento de código pertenezca a una clase que se ejecute de forma automática cronometrizada (ya dejé los links arriba).

01 void aMethod()
02 {
03    int64   hWnd;
04    str 150   cad;
05
06    ;
07    hWnd=  WinApi::findWindow("MozillaWindowClass","");
08    if (hWnd)
09        cad = winApi::getWindowText(hWnd);
10
11    if (cad!='')
12    {
13       if ( strscan(cad,"MercadoLibre",1,strlen(cad))!=0)
14       {
15           info ("Ya deja de comprar!!!");
16       }
17    }

18 }
De esta manera, cuando el usuario use Mozilla Firefox para navegar y el título de la ventana tenga la palabra 'MercadoLibre', Ax hará una sugerencia muy sutil con respecto a sus compras compulsivas de fin de año.

:)

Monday, December 15, 2014

Nuestra propia barra de Favoritos

Para complementar el post anterior vamos a crear una barra de herramientas (Se requiere crear controles dinámicos y leer el menú Favoritos del usuario).

Creamos un formulario llamado TestBar, luego vamos a fijar las siguientes propiedades a su diseño:



Ahora vamos al código.


01 public void run()
02 {
03
04    TreeNode treeNode;
05    TreeNodeIterator iterator;
06    FormButtonControl   button;
07 ;
08
09    super();
10    treeNode = infolog.userNode();
11    iterator = treeNode.AOTiterator();
12    treeNode = iterator.next();
13
14    treeNode = treeNode.AOTfindChild('Mis Favoritos');
15    iterator = treeNode.AOTiterator();
16
17    while (iterator)
18    {
19
20        treeNode = iterator.next();
21        if (treeNode)
22        {
23            button = element.design().addControl(FormControlType::Button,'Dynamic');
24            button.text(treenode.treeNodeName());
25           
26
27            button.border(4);
28            this.controlMethodOverload(true);
29
30
31        }
32        else
33            break;
34    }
35
36}


En la línea 23 agregamos un botón "coqueto", al cúal se le llamará Dynamic,  todo lo demás se explicó en post anteriores (Controles Dinámicos en Ax  y  Leyendo el menú favoritos desde código).

01 void Dynamic_Clicked()
02{
03     TreeNode treeNode;
04     TreeNodeIterator iterator;
05     #AOT
06     ;
07
08     treeNode = infolog.userNode();
09     iterator = treeNode.AOTiterator();
10     treeNode = iterator.next();
11
12     treeNode = treeNode.AOTfindChild('Mis Favoritos');
13      iterator = treeNode.AOTiterator();
14     while (iterator)
15     {
16        treeNode = iterator.next();
17        if (!treeNode)
18            break;
19
20        if (treeNode.treeNodeName()==element.controlCallingMethod().labelText())
21        {
22                    treeNode.AOTrun();
23                    break;
24        }
25
26     }
27
28 }


 Bueno, en este caso se busca el menú y se compara en la línea 20 para saber cuál de todos los botones creados fue el que llamó el método, y en la línea 22 se ejecuta la opción.

Así queda la barra, ya ustedes le darán un mejor formato.

:)






Tuesday, December 9, 2014

Leyendo el menú Favoritos desde código

En esta ocasión vamos a leer el menú Favoritos que el usuario ha configurado previamente.

01 static void FAV(Args _args)
02 {
03
04    TreeNode treeNode;
05    TreeNodeIterator iterator;
06  ;
07
08    treeNode = infolog.userNode();
09    iterator = treeNode.AOTiterator();
10    treeNode = iterator.next();
11
12    treeNode = treeNode.AOTfindChild('Mis Favoritos');
13    iterator = treeNode.AOTiterator();
14
15    while (iterator)
16    {
17
18        treeNode = iterator.next();
19        if (treeNode)
20        {
21
22            info(treeNode.treeNodeName());
23
24        }
25        else
26            break;
27    }
28 }


A partir de la línea 15 recorremos el nodo resultante y enviamos un info con el nombre de dicho nodo.



Ahi están mis favoritos y abajo la comprobación ;)



Si quisieramos abrir el menú solo bastaria con incluir esta línea de código en la posición 23

 treeNode.AOTrun();

Este post y el anterior nos servirán más adelante para crear una barra de herramientas.

Wednesday, December 3, 2014

Controles Dinámicos en Ax

Aqui les dejo ésto por si necesitan crear controles dinámicos en un formulario de Ax.

Primero vamos a crear un formulario con un Tab y un TabPage.


Luego,  en su método run vamos a agregar el control, en este caso es de tipó FormButtonControl

01 public void run()
02 {
03    FormButtonControl   button;
04    super();
05    button = element.design().addControl(FormControlType::Button,'DynamicButton');

06    button.name("Original");
07    button.text("Duplícame plz!!");
08    Total=1;
09    this.controlMethodOverload(true);

10 }

En la línea 05 lo agregamos al diseño del formulario y lo llamamos 'DynamicButton', en la línea 07 incremento mi variable para saber cuantos botones llevo agregados.

La línea 08 nos permitirá escribir métodos para este control.

01 void DynamicButton_Clicked()
02 {
03
04    FormButtonControl   button;
05
06    button = element.design().addControl(FormControlType::Button,'DynamicButton');
07    Total++;
08     button.text("Duplícame plz!!(" + int642str(Total)+")");
09
10 }


Bueno, un poco redundante pero se duplica a sí mismo pero ahora con el contador y sin nombre.





Cualquie botón, genera uno nuevo con el consecutivo correspondiente, pero ahora vamos a identificar el botón original para que el sea el único capaz de ejecutar la acción.

el código queda así:

01 void DynamicButton_Clicked()
02 {
03
04    FormButtonControl   button;
05    ;
06
07    if (element.controlCallingMethod().name()=="Original")
08   {
09        button = element.design().addControl(FormControlType::Button,'DynamicButton');
10        Total++;
11        button.text("Duplícame plz!!(" + int642str(Total)+")");
12    }
13 
14 }


Ya cuando lo implementen usen menos cadenas para comparar, es decir ya lo hacen bien.

Saludos =)