mIRC
Clonar con Looksharp
Clonar con mIRC
Comandos mIRC
Diálogos
Goku Script
Floods
Guerra IRC
Nukes
Sockets
Trucos estéticos

Programación
Controles de Visual FoxPro
Curso TCP/IP
Lenguajes utilizados en las Herramientas CASE
Programación Orientada a Objeto


 

Cuadros de Dialogos

Los diálogos son pequeños programas que se ejecutan independientemente, pero bajo la supervisión de mIRC, en realidad sirven para bastante poco, pero es una bonita forma de embellecer el script si no nos queremos meter a complicados entornos gráficos.

Los dialogs se pueden incrustar en scripts de mirc desde la versión 5.51 en adelante. Pero desde mi punto de vista, me quedo con las picture win. Otra cosa que ha que señalar de los dialogs es que sus coordenadas empiezan a contar desde el 0,0 de la pantalla, no desde la MDI de mIRC, y esto genera algún problema al trabajar con píxeles, ya que según la resolución que utilizemos el dialog se mostrará de manera diferente, así que para eso empleamos los "dbu", un tipo de coordenadas que omite la responsabilidad de los píxeles.

Los dialogs se pueden crear bien con em comando /dialog o con el identificador $dialog, la diferencia es que los primeros son moderados, es decir, no afectan al script y los segundos son modales, esto es, detienen la ejecución hasta ser devueltos.

De igual manera, los dialgos se pueden crear con tablas, y esta es la única forma que trataremos, ya que todos los diálogos se pueden hacer con tablas y son mucho más dinámicos, la sintaxis que emplearíamos podría ser:

/dialog -m <nombre> <tabla>

Donde el parámetro nombre sería el nombre del dialog, y tabla el nombre de la tabla, pero para ello antes debemos crear una tabla en un remoto, de esta manera:

dialog <nombre tabla> {
size <x y w h>
title "titulo"
button "caption",id,x y w h,style
}

Lo mínimo que una tabla debe contener es un tamaño, un título y un botón, en el tamaño, que se especifica con size, hay que decir que el valor -1 en x y hace que centre el dialog en la pantalla. Sobr el título, no creo que haya nada que comentar, y el botón lo trataremos a continuación. Sólo indicar que sería conveniente añadir por costumbre la opción dbu, para salvaguardarnos de problemas con la resolución de la pantalla, la cosa quedaría así:

dialog <nombre tabla> {
size <x y w h>
title "titulo"
option dbu
button "caption",id,x y w h,style
}

Ahora vamos a tratar lo que le podemos poner a nuestro dialog, que irá desde vulgares etiquetas de texto hasta pestañas y combos desplegables.

text "texto", id, x y w h, style (right,center) Crearía una etiqueta con un texto. El style puede ser right para alinear a la derecha, center para alinear al centro y no ponerlo para alinear a la izquierda.

edit "texto", id, x y w h, style (right, center, multi, pass, read, return, hsbar, vsbar, autohs, autovs) Esto crea una caja de texto, donde podemos escribir, el texto entre comillas sería el que aparecería en la caja antes de escribir nada. El style tiene además de los de antes muti que sirve para especificar multilineas, pass, que muestra asteriscos en vez de lo que escribimos, read, que no permite editar lo que pone, hsbar, que pone una barra de desplazamiento horizontal, vsbar que hace lo mismo, pero en vertical, y los autohs y autovs que ponen barras de desplazamiento horizontal y verticalmente respectivamente, si se requieren.

button "texto", id, x y w h, style (default, ok, cancel) Esto crea un botón pulsable, con el texto "texto". El style puede ser default, para especificar por defecto, ok para un botón de aceptar y cancel para cancelar.

check "texto", id, x y w h, style (left, push, 3state) Esto crearía una casilla para marcar, el style es left para alinear a la izquierda, push que crea un botón y 3state que actuá igual que en windows.

radio "texto", id, x y w h, style (left,push) Crea un botón de opción, que puede estar marcado o no, el style es igual que en el caso anterior.

box "texto", id, x y w h Crea un frame o una caja donde se pueden incrustar botones u otros eventos, no tiene style, y el "text" es el que encabeza el marco.

list id, x y w h, style (sort, extsel, vsbar, hsbar) Esto crea una lista con opciones, el style puede ser sort o extsel, la diferencia es que la última permite multiple selección, y la primera no.

combo id, x y w h, style (sort, edit, drop, vsbar, hsbar) Crea un combo de edit y list, donde puiede escribir, y también contiene una lista. El style puede ser sort (igual que en el caso anterior), edit una lista editable, y drop, con un menú deplegable.

icon id, x y w h, fichero, índice muestra una imagen, qué sólo puede estar en mapa de bits (bmp, ico...)

tab "text", id, x y w h Crea una pestaña, como en las opciones de windows, el "text" es el texto de la peteña. Las coordenadas puede sólo llevarlas la primara definición de tab, siendo las siguientes de igual forma, y desplazadas automáticamente.

Indicar que todos los controles tienen o pueden tener unos style globales:

disable desactivas el control
hide ocultas el control
group empezar con un grupo
result identifica el control cuyo valor será usado como el valor de retorno a la llamada del script cuando el usuario pulsa el botón ok

Esto es lo que necesitamos para crear un dialog, pero para controlar estos dialogs, necesitaremos además algunos comandos y eventos. Los comandos son:

/did -ftebvhnmcukradiog nombre id [n] [text | fichero]

-f pone foco en id
-t pone id como botón por defecto

-e activa id
-b desactiva id
-v hace a id visible
-h oculta id

-n activa editbox
-m desactiva editbox

-c chequea línea checkbox/radiobutton list/combo
-u no chequea línea checkbox/radiobutton list/combo

-k trabaja con -cu, guarda otras selecciones en la lista de edición

-r borra todo el texto en id
-a añade línea de texto al final

-d borra línea N
-i inserta texto en la línea N
-o sobreescribe la línea N con texto

-g pone nuevo icono/bmp en control de icono "/did -g nombre id [n] fichero"

-z devuelve el ancho del scroll

Esto es el comando que utilizaremos para modificar el dialog una vez creado, ahora bien, en algunos casos nos interesará saber que información contiene el dialog, para ello emplearemos el identificador $did:

$did(nombre,id)
$did(nombre,id,N)

Si usas en un evento on dialog (que ya explicaré), nombre es opcional.

.text da la línea o Número de línea $did(id) es como $did(id).text
.len da la longitud de la línea o de la línea N
.lines da el número de líneas
.sel da la Línea Número o la línea N seleccionada si N es 0, da el número de líneas seleccionadas
.state da 0 = off, 1 = on, y 2 = indeterminado

.next da el id o control siguiente en el orden de la tecla tab
.prev da el id previo en el orden de la tecla tab
.visible da $true si el control está, $false si no lo está
.enabled da $true si el control está activo, $false si no lo está

.focus devuelva el control id del foco actual

.tab da el id o tab actualmente mostrado.

Una vez que ya conocemos como modificar y "leer" un dialog, tendremos que ligar estos conocimientos a través de un evento remoto, el evento on dialog.

On dialog permite controlar remotamente una dialog, tanto modal como moderada, el evento transcurre de esta manera:

on 1:dialog:<nombre>:<evento>:<id>: { <comandos> }

Donde nombre sería el nombre del dialog que quremos controlar, id, el número que hemos asociado al control que queremos controlar (valga la redundancia), y evento puede ser:

init se produce nada más crear el dialog, es ideal para añadir textos a lista o combos.
edit se produce cuando cambiamos el texto de un edit, o cuando escribimos algo en un combo.
sclick se produce al hacer click con el botón por defecto del ratón, es un click normal.
dclick se produce al realizar doble click encima de un control.

Con esto ya podemos hacer algo, sólo indicar antes del ejemplo que par hacer dialgoos modales la sintaxis sería a través de un identificador que devuelve un valor, de esta manera:

set %devuelve $dialog(nombre,tabla[,ventana origen])

Donde ventana origen es la ventana en la que se muestra el dialog, puede ser: -1 (en el escritorio), -2 (principal del mIRC), -3 (ventana activa), -4 (dialog activo). Por defecto se asume -3, además $dialog al igual que $?, no puede ser invocado desde un evento remoto. Pues al ejemplo, en este caso ejemplos, ya que primero pondré uno que he sacado de una charla de #ayuda_scripting del irc-hispano, y que es bastante sencillo, y luego haremos un dialog para escribir e-mails a un server SMTP.

Ejemplo primero, Lista de servidores.

alias servers { dialog -m servers serv | $inserv }
dialog serv {
title "Servidores"
size 0 92 200 200
button "OK", 2, 80 175 40 20, style ok
list 1, 2 2 195 173, style sort
}
on 1:dialog:servers:dclick:1: {
if ($server != $null) { quit }
server $server($did(1).sel) $server($did(1).sel).port
}
alias inserv {
set %linea 0
:proxlinea
inc %linea
if ($server(%linea) == $null) {
halt
unset %linea
}
did -i servers 1 %linea $server(%linea)
goto proxlinea
}

Ejemplo segundo, Ezcribir e-mails... (cortesía de {EiRoN} :P)

alias WriteMail {
if $dialog(WriteMail) == $null { dialog -m WriteMail Mail }
}

dialog Mail {
title "Escribir un E-Mail"
size -1 -1 300 200
option "dbu"
text "Servidor SMTP" , 1, 10 10 200 20
combo 2, 50 8 70 200, edit drop
box "", 4, 5 20 293 120
text "Desde:", 3, 10 30 200 20
edit "", 5, 30 30 100 10
text "Para:",6, 140 30 200 10
edit "", 7, 160 30 100 10
box "",8, 5 45 293 95
text "Tema:",9, 10 55 70 20
edit "",10, 30 55 100 10,autohs
text "Cuerpo del E-Mail",11,10 75 100 10
edit "", 12, 10 85 283 50, return multi vsbar
text "Copias:", 13, 140 55 20 10
edit "1",14,160 55 20 10,right
text "Estado",15,10 148 200 10
edit "Esperando Ordenes...", 16, 10 158 283 50, return multi vsbar
button "&Enviar", 50, 210 55 30 10, style ok
button "&Cancelar", 51, 250 55 30 10, style ok
}

on 1:dialog:WriteMail:init:0: {
did -a WriteMail 5 $me $+ @ $+ $me $+ .kom
did -m WriteMail 16
if %strSockSMTP != $null {
set %temp55 1
:Bucle
if $gettok(%strSockSMTP,%temp55,32) != $gettok(%strSockSMTP, $calc( %temp55 -1),32) { did -a WriteMail 2 $gettok(%strSockSMTP,%temp55,32) }
inc %temp55
if %temp55 > $numtok(%strSockSMTP,32) { unset %temp55 | goto fin }
goto Bucle
}
:fin
did -a WriteMail 16 $crlf
}

on 1:dialog:WriteMail:sclick:51: {
sockclose SMTP
did -r WriteMail 16
did -a WriteMail 16 Esperando ordenes... $crlf
halt
}
on 1:dialog:WriteMail:sclick:50: {
if $did(2).text != $null {
set %strSockSMTP %strSockSMTP $did(2).text
set %temp59 1
sockopen SMTP $did(2).text 25
}
else {
did -a WriteMail 16 ERROR: Faltan datos $crlf
halt
}
}

on 1:sockopen:SMTP: {
if $sockerr > 0 { did -a WriteMail 16 ERROR: Imposible establecer comunicación $crlf | halt }
sockwrite -tn SMTP HELO
Datos
}

alias Datos {
sockwrite -tn SMTP MAIL FROM: < $+ $did(WriteMail,5).text $+ >
sockwrite -tn SMTP RCPT TO: < $+ $did(WriteMail,7).text $+ >
sockwrite -tn SMTP DATA
sockwrite -tn SMTP Subject: $did(WriteMail,10).text
sockwrite -tn SMTP From: $+ $did(WriteMail,5).text $+
sockwrite -tn SMTP To: $+ $did(WriteMail,7).text $+
sockwrite -tn SMTP X-Priority: 1
sockwrite -tn SMTP X-MSMail-Priority: High
sockwrite -tn SMTP X-Mailer: IRC-Sea Scripting
sockwrite -tn SMTP $did(WriteMail,12).text
sockwrite -tn SMTP $chr(46)
inc %temp59
}

on 1:sockread:SMTP: {
sockread %temp60
if (received isin %temp60) || (accepted isin %temp60) {
if %temp59 > $did(WriteMail,14).text { did -a WriteMail 16 FINALIZADO TRANSMISIÓN DE MENSAGES $crlf | unset %temp58 | unset %temp59 | sockclose SMTP | halt }
did -a WriteMail 16 Enviado %temp59 de $did(WriteMail,14).text $crlf
Datos
}
}

on 1:sockwrite:SMTP: {
if $sockerr > 0 { did -a WriteMail 16 ERROR: Imposible transmitir al servidor $crlf | halt }
}

Para más información:
http://fly.to/ayuda_scripting
http://www.insok.net
http://www.sockets.net