Botones


Para la creación de botones, con lo que se podrán ejecutar acciones. El prop para definir un botón se realiza con el atributo type=“B”.

La creación de un botón, consta de dos partes: por un lado la propiedad que define sus atributos visuales, y por otro un nodo donde estarán todas y cada una de las acciones a realizar.


Aquí se muestra el nodo button. Además de los atributos que deciden si es visible, el título a mostrar en pantalla o en que group se muestra, tenemos el atributo method, que es un atributo bastante importante, ya que es el lugar donde se realiza la llamada al nodo que ejecuta las acciones del botón.

<prop name="BUTTON1" type="B" method="ExecuteNode (inicializar)" title="Iniciar Ruta" visible="1" toolbar="false" labelwidth="24"  onchange="refresh255" lmargin="7"/>
 
<!-- boton con imagen atributo img, width y height  -->
<prop name="Buscar" type="B" title="Buscar" visible="1" method="ExecuteNode(buscar)" class="boton" labelwidth="1" img="search.png" width="50" height="50" />
 
<prop name="MAP_BTLINEA90LINK" type="B" labelwidth="0" onclick="javascript:ui.openUrl('http://tuweb.com/');" />
 
<!-- Anteriormente existía el nodo button con las mismas funcionalidades del prop type="B" que ya está obsoleto
     y no se interpretan muchos de los estilos definidos con css y tampoco atributos nuevos. 
-->
<button name="BUTTON1" method="ExecuteNode (inicializar)" caption="Iniciar Ruta" visible="1" toolbar="false" labelwidth="24"/>

El nodo method name=“ExecuteNode, es un nodo de sistema, y ya está DEPRECATED (obsoleto) en todos los Framework. Actualmente solo en el Framework de PC es obligatorio. Solo se pone una vez en la colección que tenga botones, y siempre es igual.

<method name="ExecuteNode">
    <param name="P1" type="T" value=""/>
</method>

Y por último, el nodo en el que se pone el código que se va a ejecutar. El nombre es definido por el usuario, y como único requisito, es que el nombre del nodo tiene que llamarse igual (mayúsculas-minúsculas) que el nodo al que llama el nodo button en su atributo method. En el ejemplo, se muestran acciones realizadas en código Script, pero se podían haber puesto nodos action.

<inicializar>
    <action name="runscript">
        <script language="VBScript">
            Dim vResult
            vResult =AppData.UserInterface.MsgBox ("Esta acción reiniciará toda la ruta. ¿Está seguro que desea ejecutarla?","Advertencia",1)
            If vResult =1 Then 	
                'OJO, el update va a meter las operaciones en réplica, si no se desea, mirar el código definido en maintenance.			
                appdata.executeSQL "UPDATE Gen_Rutas SET VISITADO=0 WHERE IDUSUARIO=" + CStr(This("IDUSUARIO"))
                vResult =AppData.UserInterface.MsgBox ("Ruta inicializada","Advertencia",0)
            End If							
        </script>
    </action>
</inicializar>
 
<prop name="MAP_BT_CITAS_MEDICAS" method="executenode(irgroup(8))" type="B" visible="1" width="120" height="95" labelwidth="1" newline="false" img=".\icons\tr.png" imgsel=".\icons\trsel.png" />
<prop name="MAP_BT_VIVIR_BIEN" method="executenode(irColl(VivirBien))" type="B" visible="1" width="120" height="95" labelwidth="1" img=".\icons\tr.png" imgsel=".\icons\trsel.png" />
 
<!-- Con este nos vamos a otra pestaña dentro de la misma colección -->
<irgroup>
	<action name="runscript">
	<param name="group" />
		<script language="VBScript">
			this("MAP_NGROUP") = group
			'appdata.UserInterface.MsgBox this("MAP_GROUP"),"",0
			AppData.UserInterface.ShowGroup group,"##ALPHA_IN##",500,"##ALPHA_OUT##",500
		</script>
	</action>
</irgroup>
 
<!-- Con este nos vamos a otra colección -->
<irColl>
	<action name="runscript">
	<param name="coll" />
		<script language="VBScript">
			'ui.openmenu "coleccion",mascara,modo (0-listado, 1-Edicion)
			appData.userinterface.openmenu coll,26,1
		</script>
	</action>
</irColl>
 
<mensajes show-wait-dialog="false">
	<action name="runscript">
		<script language="VBScript">
			'MsgBox0,MsgBox1,MsgBox4,ShowToast,ShowNotification,Sonido
			Dim vResult
			Select Case this("MAP_TIPO_MENSAJE")
			Case "MsgBox0"
				ui.MsgBox "Mensaje Informativo solo con OK","Titulo Ventana",0
			Case "MsgBox1"
				'Si pulsa ACEPTAR vale 1 y si pulsa CANCELAR vale 2
				vResult =ui.MsgBox ("Pregunta si ACEPTAR ó CANCELAR","Advertencia",1)
				ui.MsgBox "Ha pulsado el botón con valor: "+cstr(vResult),"Titulo Ventana",0
			Case "MsgBox4"
				'Si pulsa SI vale 6 y si pulsa NO vale 7
				vResult =ui.MsgBox ("Pregunta SI ó NO","Advertencia",4)
				ui.MsgBox "Ha pulsado el botón con valor: "+cstr(vResult),"Titulo Ventana",0
			Case "ShowToast"
				ui.showToast "Mensajito efímero que dura 3 segundos"
			Case "ShowNotification"
				ui.ShowNotification 1, "Título", "Esto es una notificación", "Aviso de recepción de datos"
			Case "Sonido"
				'El sonido tiene que estar en la carpeta files del proyecto
				ui.PlaySoundAndVibrate "bultonoencontrado.wav",true,1
			End Select
		</script>
	</action>
</mensajes>

Atributo que llama al nodo que ejecutará las instrucciones correspondientes.

A este método se le pueden pasar parámetros, de forma que varios botones puedan llamar a un mismo código con ligeras variaciones…

<prop type="B" ..... method="executeNode (sacamsg(Parametro1,Parametro2))" />
<sacamsg>
	<action name="runscript">
		<param name="parametro1" />
		<param name="parametro2" />
		<script language="VBScript">
			if parametro1="loquesea" then
				......
			end if
			llamadaafuncion parametro1 parametro2
		</script>
	</action>
</sacamsg>

Nombre del botón.

El postonchange es un atributo que se especifica para que sea ejecutado cuando se vuelve al flujo normal de la aplicación después de un pushvalue, para que se ejecute algún nodo o para que se refresquen las propiedades por si alguna ha sido modificada durante el pushvalue.

Ejemplo de Código:

<prop name="Aceptar" type="B" title="Aceptar" onchange="Refresh" method="ExecuteNode(aceptar)" postonchange="ExecuteNode(postaceptar)" ... /> 

En el nodo <aceptar> se lanza un pushvalue y al volver del pushvalue se ejecutaría el postonchange=”ExecuteNode(postaceptar)” o bien hacer un postochange=“refresh” para que refresque las propiedades si alguna hubiese cambiado su valor durante el pushvalue.

Si se hace un pushvalue desde un before-edit el postonchange hay que ponerlo en el propio nodo.

<before-edit postonchange="refresh">
	-------
	-------
</before-edit>