Codigos Fuente

|


Preguntar

|


Comunicaciones

|


Tutoriales

|


Contactenos

 


  Buscador del Site  

 

 Se Recomienda Resolución de 800x600 pixels


 

2da PARTE

8.- Activar la instancia anterior de una aplicación al cargarla por segunda vez

Cuando se ejecuta una aplicación de Visual Basic, se puede saber, mediante la propiedad PrevInstance del objeto App, si dicha aplicación se está ejecutando.
El TIP que te traigo hoy es para activar la aplicación que se ejecuto por primera vez.
Es decir sólo quieres que haya una "copia" del programa ejecutándose y si se intenta ejecutar de nuevo, hacer que se "active" la copia que haya en ejecución, en lugar de una nueva.

He de aclarar que este truco sólo sirve si el Caption del programa es siempre el mismo.
Para hacer que se "active" la aplicación incluso si el caption se cambia, por ejemplo en el caso de que sea una aplicación MDI o que por cualquier razón cambies el Caption tendrás que "ingeniartelas" por tí mismo.
Lo que yo hago en esos casos, es crear una entrada en el registro o en un fichero INI con el caption que tiene mi aplicación cuando éste cambia, de esta forma puedo saber de forma fácil y rápida el nombre que necesito para activar esa instancia del programa.
También se podría averiguar examinando los títulos de las ventanas (aplicaciones) activas y de esta forma activarla, pero eso sería algo más complicado... pero si lo haces, me mandas el código y lo pondría para que otra gente lo viera.
Como pista para conseguirlo, podrías usar el código usado para saber si una aplicación se está ejecutando... Vamos ya con el código para hacer eso de activar la aplicación que se está ejecutando.

Private Sub Form_Load()

    Dim sCaption As String

   

    'si ya se está ejecutando

    If App.PrevInstance Then

        'Guardar el caption de esta aplicación

        sCaption = Caption

        'Cambiar el caption actual para que no se active esta

        Caption = "cualquier cosa"

       

        'Activar la otra instancia

        AppActivate sCaption

       

        'Terminar esta copia del programa

        End

    End If

   

    'Continuar ya que no hay otra copia

   

End Sub

Esto es lo que habría que hacer si el caption de la aplicación cambia y no mantiene siempre el mísmo valor.
Es importante guardar el nuevo caption cada vez que éste se modifique.

Private Sub Form_Load()

    Dim sCaption As String

   

    'si ya se está ejecutando

    If App.PrevInstance Then

        'Leer del fichero de configuración el caption de la aplicación

        sCaption = GetSetting("Aplicacion.ini", "General", "Caption", Caption)

       

        'Cambiar el caption actual para que no se active esta

        Caption = "cualquier cosa"

        

        'Activar la otra instancia

        AppActivate sCaption

       

        'Terminar esta copia del programa

        End

    End If

   

    'Cuando se cambie el caption de la aplicación,

    'guardarlo en el fichero de configuración

    SaveSetting "Aplicacion.ini", "General", "Caption", Caption

   

End Sub

También se puede usar este método en el caso de que el inicio de la aplicación esté en un procedimiento SUB MAIN, en ese caso no podrás usar la propiedad Caption en la asignación de sCaption ni es necesario cambiarla para que no se active esta copia, siempre y cuando al iniciarse desde el módulo BAS aún no se haya mostrado el form.

9.- Hacer referencia a un control usando una variable

Ya sabes que para asignar un valor de una propiedad de un control debes hacer lo siguiente:
NombreControl.Propiedad = Valor
Por ejemplo para asignar el Caption de Command1, sería:
Command1.Caption = "Nuevo caption"

Pero puede que te encuentres en la necesidad de hacer referencia a un control por medio de una variable, por ejemplo en el caso de que crees una clase que manipule controles pero sólo sabe de ese control el nombre y nada más.
Pues bien, en esos casos, puedes usar la colección de controles que tiene cada Form. Usando el mismo ejemplo de asignar el Caption del Command1, pero siendo la variable unControl$ la que tiene el nombre, se puede hacer esto:
Controls(unControl).Caption = "Nuevo Caption"

Si el control está dentro de un array de controles, se tendrá que hacer esto:
Controls(unControl)(Indice).Caption = "Nuevo Caption del indice " & Indice

Esta forma de usar los controles, la tuve que usar en una clase que manipulaba unas etiquetas y unos contenedores, para no obligarme a usar siempre el mismo nombre en las etiquetas y contenedores.

10.- Otra procedimiento para esperar X segundos

Pues eso, otra forma de esperar un número determinado de segundos.

'Si se quiere usar de forma GLOBAL, insertarlo en un Módulo BAS y declararlo como público

Private Sub Wait(ByVal nSec As Integer)

    'Esperar un número de segundos

    Dim t1 As Date, t2 As Date

 

    t1 = Second(Now)

    t2 = t1 + nSec

    Do

        DoEvents

    Loop While t2 > Second(Now)

End Sub

11.- Más sobre la colección Forms y Controls (hacer referencia a un control o form usando variables)

La cuestión es la siguiente:
Modificar propiedades de controles usando una variable tanto para el form como para el control.

Se puede referenciar a una propiedad de un control de la siguiente forma:
Controls(nombre_del_control).Propiedad = Valor_de_la_propiedad
También se puede asignar ese control a una variable de tipo Control, para posteriormente referenciar a las diferentes propiedades:

Dim tControl As Control

 

Set tControl = Controls(sNombreControl)

 

tControl.BackColor = 0&

Por tanto, se supone que se debería poder hacer esto otro para poder modificar esa misma propiedad:
Forms(nombre_form).Controls(nombre_control).Propiedad = valor_propiedad
o bien esto otro:

Dim tForm As Form

 

Set tForm = Forms(sNombreForm)

 

tForm.BackColor = vbRed

Pues no... al menos a mi no me ha funcionado... me da Type Mismatch (error 13)
El tema de querer hacerlo así, está en poder usar una rutina genérica que permita cambiar algunas propiedades de algunos controles en cualquier form, pero usando variables para indicar esos Forms y esos Controles... (las propiedades deben especificarse "explícitamente", ya que no existe ninguna colección de propiedades).

La solución que he encontrado para hacer esto es la siguiente:
Se busca el nombre del form en cuestión en la colección Forms y se asigna a una variable del tipo Form, después se puede acceder al control indicado usando la colección controls, como se explica un poco más arriba.
Veamos el código de un procedimiento genérico (público) que permite asignar ciertas propiedades... (recuerda que sólo es un ejemplo, así que no me eches en cara que es una chorrada, aunque si tienes el VB6 verás que es muchísimo más simple gracias a CallByName)

Public Sub Propiedades(ByVal elForm As String, _

                       ByVal elControl As String, _

                       ByVal laPropiedad As String, _

                       ByVal elValor As Variant)

    'Los parámetros se indican como cadena de caracteres,

    'salvo el último que indica el valor a asignar

   

    Dim tmpForm As Form

    Dim tForm As Form

    Dim tControl As Control

   

    'Recorremos la colección Forms en busca del form indicado

    For Each tmpForm In Forms

        'Si es el mismo nombre, este es el form que queremos

        If tmpForm.Name = elForm Then

            'Asignarlo a la variable

            Set tForm = tmpForm

        End If

    Next

    'Si no se ha encontrado ese form, avisarlo mediante un error

    If tForm Is Nothing Then

        Err.Raise vbObjectError + 1000, _

                  "Propiedades", _

                  "No se ha hallado el form indicado por " & elForm

 

    Else

        'Para detectar el error de asignación del control

        On Local Error Resume Next

       

        'Asignamos el control deseado a la variable

        Set tControl = tForm.Controls(elControl)

       

        If Err Then

            Err = 0

            'No atrapar los errores, sino no se mostraría el nuestro...

            On Local Error GoTo 0

            Err.Raise vbObjectError + 1000, _

                      "Propiedades", _

                      "No se ha hallado el control indicado por " & elControl & _

                      " en el form " & elForm

        End If

       

        'interceptamos las propiedades que podemos manipular

        'si se deja esto de LCase(laPropiedad), los nombres deben estar en minúsculas

        'También puedes usar Option Compare Text en el módulo.

        Select Case LCase(laPropiedad)

        Case "backcolor"

            tControl.BackColor = elValor

        Case "forecolor"

            tControl.ForeColor = elValor

        Case "caption"

            tControl.Caption = elValor

        Case "text"

            tControl.Text = elValor

        Case Else

            'etc.

        End Select

        '

        'En VB6 se puede usar CallByName para asignar el valor de una propiedad:

        'evitandote todo el mogollón de comparaciones...

        'CallByName tControl, laPropiedad, VbLet, elValor

        '

 

    End If

End Sub

 

 

'Para usarlo:

Propiedades Me.Name, "Label1", "Caption", "Hola Mundo"

En resumen: si se quiere obtener un "objeto" form usando Forms("nombre del form"), no se puede...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


©1998-2001 FMC Webs® Todos los derechos Reservados. Ferraro Mauro - San Nicolás - Argentina

El Codigo del Mes

Aqui le mostraremos el Codigo Fuente del Mes, Votalo Ya!!!

Preguntar

Dudas

Trucos

API de windows

Tutoriales

Trucos

Api de Windows

Bajate el manual de VB

Contactenos

Enviar Codigos Fuente

Links y Banners

Publicite en nuestro Site

Pone Tu link Gratis!!!

Crea tu Web

Redirecciona tu Pagina Gratis!!!

Votanos en La web del Programador

Sugerencias