Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ceubas 09
Ceubas 09
9
EL DRAG & DROP (Arrastrar y Soltar)
LA FUNCION SHELL
LA FUNCION COMMAND PARA PASAR PARAMETROS
El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello se toma
algo de una parte de la interface gráfica, mediante la operación de colocar el puntero del ratón
y pulsar su botón izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botón
izquierdo del ratón se desliza (se arrastra) el puntero del ratón hasta el punto de la interface
gráfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en
el punto de destino se suelta el botón del ratón y se “deja caer” lo que habíamos tomado en el
punto de origen. El efecto de “tomar” algo de un control le denominaremos DragOver, y el
efecto de dejar caer le denominaremos DragDrop.
El Drag & Drop tiene un efecto visual muy didáctico. Pero NO HACE otra cosa. Es decir, no
toma nada del control origen ni lo suelta al llegar a destino. Esa acción de tomar algo en el
origen o soltarlo al llegar al destino debemos realizarla mediante código en los eventos
adecuados (MouseDown, DragOver , DragDrop), dando los valores adecuados a las
propiedades DragMode y DragIcon, y utilizando el método Drag.
PROPIEDAD DragMode
Donde número puede tomar los valores 0 (Manual) ó 1 (Automático). El valor predeterminado
es el 0.
Cuando esta propiedad está a 0 (Manual) se debe emplear el Método Drag para iniciar una
operación Drag & Drop. Si está a 1, la operación de arrastrar y soltar se inicia
automáticamente cada vez que hacemos click sobre el botón izquierdo del ratón, teniendo el
puntero del mismo sobre el control. Los controles contenedores OLE sólo se arrastran
automáticamente cuando no tienen el enfoque.
Parece en principio mas práctico tener esta propiedad a 1. Sin embargo la realidad es distinta.
Se controla mucho mejor el Drag & Drop poniendo esta propiedad a 0 (Manual), pese a que en
este caso deberemos utilizar el método Drag para iniciar el proceso.
El poner esta propiedad en automático conlleva también el hecho de que el control no toma el
foco haciendo click sobre él, ya que no sabe si lo que quiere hacer es llevarle el foco o iniciar
una operación de Drag & Drop.
PROPIEDAD DragIcon
Devuelve o establece el icono que se presenta como puntero del ratón durante una operación
de arrastrar y soltar.
Esta propiedad va a marcar el icono que aparezca durante la operación Drag & Drop
desplazándose a lo largo de la ventana. Si no se especifica esta propiedad, el desplazamiento
se expresa mediante un rectángulo del tamaño del control origen, cosa que resulta bastante
desagradable en cualquier aplicación. Debe ponerse por lo tanto un icono en esta propiedad.
Para Nota. Cuando quiera colocar un icono animado en la propiedad DragIcon (una hoja de
papel que oscila al moverse, una hoja de papel que se destruye - ejemplos tomados de W95-),
debe usar varios iconos en secuencia. Por lo tanto debe cambiar la propiedad DragIcon a lo
largo del tiempo que dura el arrastre. Puede utilizar para ello un temporizador (control Timer) o
basarse en las coordenadas del formulario por donde se mueve (para eso introducen en el
evento DragOver del Formulario). Dado que el cambio debe ser rápido, no es conveniente
acceder al disco (mediante la función LoadPicture) cada vez que tiene que cambiar la imagen
del icono. Como para simular un movimiento tan sencillo son suficientes pocas imágenes, (8
por ejemplo) puede crear otras tantas variables tipo Picture, cargar las imágenes al comienzo
de la aplicación (con la función LoadPicture) y cuando necesite el movimiento animado del
icono, cargar las 8 imágenes secuencialmente desde esas variables, para simular el
movimiento
NCO.DragIcon = Variable1
NCO.DragIcon = Variable2
......
NCO.DragIcon = Variable8
Esto le ocupará mas memoria. Es el precio a pagar por la rapidez y la buena presentación de
una aplicación.
METODO Drag
Inicia, termina o cancela una operación de arrastre de cualquier objeto excepto los controles
Line, Menu, Shape o Timer.
NombreControlOrigen es el nombre del control donde se inició la operación Drag & Drop.
TipoAcción es un valor o una constante que especifica la acción a realizar, según se describe a
continuación :
El uso del método Drag para controlar una operación de arrastrar y soltar sólo se requiere
cuando la propiedad DragMode del control origen tiene el valor Manual (0). Sin embargo, Drag
puede usarse con objetos cuya propiedad DragMode tenga el valor 1 (o vbAutomatic).
En versiones anteriores de Visual Basic, Drag era un método asíncrono y las instrucciones
siguientes se ejecutaban incluso aunque la acción de arrastre no hubiera terminado. En Visual
Basic versión 4.0, Drag es un método síncrono y las instrucciones siguientes no se ejecutan
hasta que la acción de arrastre no haya terminado.
Usando el método Drag puede controlar exactamente cuando quiere que se produzca el inicio
del Drag & Drop y el final. El autor de esta Guía del Estudiante vuelve a recomendar que
ponga la propiedad DragMode = 0 (Manual). Entre otras razones por la siguiente :
Como decíamos al principio, el Drag & Drop solamente es una manifestación visual de algo
que se está produciendo, pero ese algo deberemos programarlo. Por ejemplo, es muy típico
llevar un dato de una casilla a otra (de un TextBox a otro p.e.) mediante una operación D & D.
El dato debemos llevarlo a una variable que nos permita, al final de la operación, introducir
ese dato en el TextBox final. (No olvide declarar la variable en el lugar correspondiente para
que sea válida en ambos controles). La acción de llevar el dato a la variable debemos hacerla
en el procedimiento mas adecuado. Puede ser por ejemplo, el procedimiento MouseDown del
control origen, ya que cualquier operación de D & D comienza haciendo click en el control
origen. Si tiene la propiedad DragMode de ese control en Manual, en el momento de hacer
Click, ese control toma el foco y, caso de un TextBox, puede arrastrar con el ratón para
cambiar el texto, cosa que no podría hacer si pone DragMode=1.
EVENTO DragOver
Cuando una operación de arrastrar y soltar está en progreso y el cursor del ratón pasa por
encima de un control o un formulario, se produce el evento DragOver de ese control o
formulario.
Donde :
origen = Control que se está arrastrando. O dicho de forma mas ortodoxa, control en el que se
inició la operación de Drag & Drop. Dentro de este procedimiento puede hacer referencia a sus
propiedades y métodos con este argumento. Por ejemplo, Source.Visible = False. Caso de
que el Control Origen fuese parte de un array de controles, el Index de ese control se tiene en
índice
x, y Número que especifica la posición horizontal (x) y vertical (y) actual del puntero del
mouse dentro del control o formulario destino. Estas coordenadas se expresan siempre en
términos del sistema de coordenadas del destino tal y como se establece en las propiedades
ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop.
estado Entero que nos indica el estado de transición del control que se está arrastrando en
relación al formulario o control destino:
0 = Entra. Este valor se produce en el instante en el que entra el cursor del ratón a
este control o Formulario. Se genera también en el control origen en el instante que se
pulsa el botón del ratón, iniciándose de esta forma el D & D.
1 = Deja Este valor se produce cuando el cursor sale del control o Formulario.
2 = Sobre Este valor se produce cuando el cursor se está moviendo sobre el control o
el Formulario destino.
En el siguiente ejemplo, se declaran 6 variables tipo Picture que van a almacenar seis iconos
distintos :
En General - Declaraciones
Dim pepe as string
Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture
Dim Icono4 As Picture, Icono5 As Picture, Icono6 As Picture
El Form1.Load se cargan los valores de estas variables con seis iconos existentes en el disco.
El icono asignado al control origen (Text1) es Icono4.
Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico")
Set Icono2 = LoadPicture("C:\vb\icons\dragdrop\drag2pg.ico")
Set Icono3 = LoadPicture("C:\vb\icons\dragdrop\drag3pg.ico")
Set Icono4 = LoadPicture("C:\vb\icons\dragdrop\drop1pg.ico")
Set Icono5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr.ico")
Set Icono6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico")
Text1.DragIcon = Icono4
EVENTO DragDrop
Ocurre cuando se completa una operación de arrastrar y soltar como resultado de arrastrar un
control sobre un formulario o control y liberar el botón del mouse o utilizar el método Drag con
su argumento acción establecido a 2 (Drop).
Utilice un procedimiento de evento DragDrop para controlar qué ocurre tras completarse una
operación de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo
lugar o copiar un archivo de un lugar a otro, depositar un valor sobre un control etc.
Recuerde que la operación Drag & Drop no hace otra cosa que lo que se puede ver en la
interface gráfica. Debe poner en este Procedimiento (DragDrop) el código necesario para que
se realice la operación deseada.
LA FUNCION SHELL
La función Shell se utiliza para ejecutar un programa ajeno a la aplicación que se está
ejecutando. Imaginemos que tenemos una aplicación Visual Basic que necesita, por ejemplo,
establecer una comunicación telefónica, y que esa comunicación telefónica nos la realiza un
programa desarrollado en C++ , llamado MARCADOR.EXE que funciona perfectamente y no
queremos desaprovechar. Imaginemos que ese programa tiene la posibilidad de introducirle el
número telefónico que debe marcar como un parámetro. Este parámetro se le introduce,
supongamos, añadiendo el número al nombre del programa ejecutable. Por ejemplo:
MARCADOR.EXE 1234567
En nuestra aplicación Visual Basic introduciremos una línea invocando la función Shell seguida
del nombre (y Path) del ejecutable y del parámetro que le vamos a introducir al ejecutable:
donde:
rutaDeAcceso es el nombre del programa por Ejecutar (con su Path) y cualquier argumentos
o conmutadores (switches) de línea de comando requeridos; puede incluir directorio o carpeta
y unidad de disco. También puede ser el nombre de un documento que se ha asociado con un
programa ejecutable.
Si la función Shell ejecuta con éxito el archivo nombrado, devuelve la identificación de la tarea
(ID) del programa iniciado. La ID de la tarea es un número exclusivo que identifica el programa
en ejecución. Este número debe ser un Long. Si la función Shell no puede iniciar el programa
nombrado, ocurrirá un error. Si desea conocer el ID de la tarea, realice una aplicación con un
botón (cmbCalculadora) y un label (label1). Ponga en ese botón en su procedimiento click, el
siguiente código. - Observe que esta aplicación inicia la calculadora de Windows -
Posiblemente lo único que le importe sea el ejecutar esa aplicación, sin dar mayor importancia
al ID de la tarea. Utilice una línea con la siguiente expresión :
Shell ("C:\windows\calc.exe"), 1
(Observe en las dos formas de ejecutar la función Shell, que la colocación de los paréntesis y
la coma separadora es distinto.
Nota La función Shell ejecuta otros programas de manera asíncrona. Esto quiere decir que
no se puede esperar que un programa iniciado con Shell termine su ejecución antes de que se
ejecuten las instrucciones que siguen a la función Shell en la aplicación. Esto es un gran
inconveniente de la función Shell. Excepto en contadas ocasiones, siempre es necesario
conocer cuando se ha terminado de ejecutar el programa iniciado mediante Shell. Y no es ese
el único problema. La mayoría de los programas DOS que se ejecutan con Shell no se cierran
automáticamente. Esto significa que si podemos evitar el uso de Shell debe evitarse. Pero si
es completamente necesario, tampoco pasa nada. Pero hay que controlar, tanto la terminación
del proceso DOS como su cierre.
Podemos usar para ello APIs. No las hemos explicado todavía. Por eso, y adelantar un poco
como se trabaja con ellas, vamos a presentar, sin grandes explicaciones, lo que hay que hacer
para poder detectar que se ha terminado de ejecutar el programa DOS y para cerrarlo. Verá
mas APIs mas adelante.
El programa DOS elegido para este ejemplo es el popular ARJ.EXE, un compresor de datos
que, sin ánimo de publicidad, es uno de los mejores que existen. Pero trabaja solamente en
DOS. Se utiliza un Procedimiento que he llamado ExecCmdNoFocus, para detectar que el
proceso abierto para comprimir o descomprimir ha finalizado, y proceder a cerrarlo.
Dim hProcess As Long 'handle del proceso donde se invoca la función Shell
Dim RetVal As Long 'Valor donde la función GetExitCode coloca el resultado
Dim winHwnd As Long ' manipulador de la ventana que contenga el Caption
‘Finalizado - ARJ
Dim RetValls As Long 'valor de retorno de PostMessage
Do
GetExitCodeProcess hProcess, RetVal
Sleep 100
'en este apartado comprueba si está abierta la ventana "Finalizado - ARJ"
winHwnd = FindWindow(vbNullString, "Finalizado - ARJ")
If winHwnd <> 0 Then
RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
End If
Loop While RetVal = STILL_ACTIVE
End Sub
La ventana DOS del ARJ tiene el Caption Finalizado - ARJ cuando ya ha terminado el
proceso. En el procedimiento ExecCmdNoFocus se analiza si esa ventana está presente
(prueba de que ARJ ya ha terminado, pues antes de terminar tiene otro Caption).
Para llamar a ese procedimiento hay que citarle por su nombre ( ExecCmdNoFocus) que
como lo hemos declarado Public en un Módulo, podemos llamarle desde cualquier parte de la
aplicación. Debemos pasarle el parámetro CmdLine, que será el programa que vamos a
ejecutar con Shell y los parámetros adicionales que este programa necesite (En este caso, el
programa es ARJ.EXE y a continuación debe indicársele el nombre del archivo ya
comprimido, a continuación a para que añada mas ficheros a ese archivo, y a continuación el
nombre de ese fichero o ficheros a añadir :
LA FUNCION COMMAND
Command (Función)
Devuelve parte del argumento de la línea de comandos utilizada para lanzar Microsoft Visual
Basic o un programa ejecutable desarrollado con Visual Basic.
Cuando se inicia Visual Basic desde la línea de comandos, la parte de la línea de comandos
que sigue a /CMD se pasa al programa como un argumento de la línea de comandos. En el
siguiente ejemplo, cmdlineargs representa la información de argumento devuelta por la función
Command.
VB /CMD cmdlineargs
MyApp cmdlineargs
En la ventana Código, puede usted cambiar el texto devuelto por Command eligiendo
Opciones del proyecto en el menú Herramientas.
Veamos con un par de ejemplos como se pueden usar estas dos funciones:
Marcador Telefónico
Esta aplicación debe marcar un número telefónico. El número a marcar se le pasará como
parámetro tras el nombre de la aplicación. La aplicación ya compilada se llamará
MARCADOR.EXE. Para marcar un número debemos poner, en la línea de Comando de
Windows:
Marcador.exe 1234567
o como ya sabemos, introducirle el parámetro mediante una llamada con la función Shell
desde otra aplicación:
Como no vamos a realizar llamada alguna, sino comprobar que esto puede funcionar, nuestra
pequeña aplicación tendrá solamente un Label llamado FRMARCADORL1 donde
presentaremos el número a marcar. Todo el código necesario se lo metemos en el
procedimiento Activate del formulario:
Si Vd. hace un editor de textos (Editor.EXE) que soporta un formato determinado (por ejemplo
el RichTextFormat RTF), para ejecutar su programa y meterle como parámetro el nombre del
fichero Carta.RTF de forma que al arrancar lea directamente el fichero Carta.RTF, basta con ir
al Explorador de Windows, abrir la carpeta que contenga Carta.RTF, arrastrar el nombre de
ese fichero y llevarlo al icono que representa a Editor.EXE, que imaginemos que le ha
preparado un acceso directo. Suelte el botón del ratón y su editor se ejecutará, y además, le
meterá como parámetro el nombre del fichero Carta.RTF (con su Path correspondiente) Si Ud.
había previsto la captura del Command tal como se explicó mas atrás, y ha preparado su
aplicación para que tome el contenido de Command y entienda que tiene que abrir y cargar
ese fichero, su aplicación Editor.EXE cargará automáticamente ese fichero. Observe que esta
es la forma de trabajar de los procesadores de texto usados normalmente (Word, WordPerfect,
Write, etc.)