none
Ejecutar función en el load después de que carge el formulario RRS feed

  • Pregunta

  • Hola, tengo un formulario que debe ejecutar un código sin pulsar ningún botón.

    El problema es que si el código lo pongo en el Form_load o Form_activate se ejecuta pero no se muestra el formulario.

    Es un proceso de actualización y necesito mostrar el formulario completo (barra de progreso incluida) y ejecutar el código.

    Intenté con el código Form.Show en el evento Load pero no carga los controles sólo el formulario.

    También intenté llamando a la función desde el load pero tampoco se muestra el diseño del formulario.

    ¿Cómo podría hacerlo? Gracias!

    lunes, 27 de febrero de 2012 7:42

Respuestas

  • Yo ignoro si winforms tiene algún mecanismo propio, pero se trata de un problema ordinario de la gui que se resuelve dejando un mensaje en la cola.

    Public Class Form1
    
        Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        Private Const WM_APP As Integer = &H8000
        Private Const MI_FUNCION As Integer = WM_APP + 1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            PostMessage(Me.Handle, MI_FUNCION, 0, 0)
        End Sub
    
        Protected Overrides Sub WndProc(ByRef m As Message)
    
            If m.Msg = MI_FUNCION Then
                MiFunción()
            End If
    
            MyBase.WndProc(m)
        End Sub
    
        Private Function MiFunción() As Integer
    
            Threading.Thread.Sleep(5000)
    
            MsgBox("Estuviste viendo el form los últimos 5 segundos")
    
            Return 0
        End Function
    End Class
    

    lunes, 27 de febrero de 2012 11:33
  • podrias aplciar la trecnica que aqui se plantea

    [WinForms] - Abrir formulario modal en el evento Load

    como veras si puedes en los eventos que mencionas ejecutar acciones sin que loqueen la carga del formulario, proque lo haces lanzando desacoplado

    Public Partial Class Form2
     
        Private Sub Form2_Load(sender As Object, e As EventArgs)

            Dim timer As New Timer()
            timer.Interval = 1
            AddHandler timer.Tick, AddfressOf Timer_Tick
            timer.Start()

        End Sub

        Private Function Timer_Tick (s As Object, eventarg As EventArgs) Do           

                DirectCast(s, Timer).Stop()

               'aqui tu codigo

            End Function

    End Class

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 27 de febrero de 2012 11:59

Todas las respuestas

  • En Form_Activate te tiene que mostrar el formulario. Usala propiedad AutoRedraw del formulario.

    Saludos,

    Javier J.

    lunes, 27 de febrero de 2012 9:33
  • Gracias por tu respuesta, pero ya había probado el Form_Activated pero no muestra el diseño del formulario. Pasa por el load, luego el Activated y ejecuta el código sin mostrar el formulario.

    La propiedad AutoRedraw no aparece en las propiedades del formulario ni por código.

    lunes, 27 de febrero de 2012 9:40
  • Yo ignoro si winforms tiene algún mecanismo propio, pero se trata de un problema ordinario de la gui que se resuelve dejando un mensaje en la cola.

    Public Class Form1
    
        Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        Private Const WM_APP As Integer = &H8000
        Private Const MI_FUNCION As Integer = WM_APP + 1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            PostMessage(Me.Handle, MI_FUNCION, 0, 0)
        End Sub
    
        Protected Overrides Sub WndProc(ByRef m As Message)
    
            If m.Msg = MI_FUNCION Then
                MiFunción()
            End If
    
            MyBase.WndProc(m)
        End Sub
    
        Private Function MiFunción() As Integer
    
            Threading.Thread.Sleep(5000)
    
            MsgBox("Estuviste viendo el form los últimos 5 segundos")
    
            Return 0
        End Function
    End Class
    

    lunes, 27 de febrero de 2012 11:33
  • podrias aplciar la trecnica que aqui se plantea

    [WinForms] - Abrir formulario modal en el evento Load

    como veras si puedes en los eventos que mencionas ejecutar acciones sin que loqueen la carga del formulario, proque lo haces lanzando desacoplado

    Public Partial Class Form2
     
        Private Sub Form2_Load(sender As Object, e As EventArgs)

            Dim timer As New Timer()
            timer.Interval = 1
            AddHandler timer.Tick, AddfressOf Timer_Tick
            timer.Start()

        End Sub

        Private Function Timer_Tick (s As Object, eventarg As EventArgs) Do           

                DirectCast(s, Timer).Stop()

               'aqui tu codigo

            End Function

    End Class

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 27 de febrero de 2012 11:59
  • Te hicieron una sopa... es mas sencillo:

    Me.Show()

    Lo pones en el Form_load. Bueno seguramente a esta altura no te sirve, pero si a todos los que siguen entrando acá.

    • Propuesto como respuesta yoel mendoza martes, 8 de agosto de 2017 3:17
    martes, 16 de diciembre de 2014 15:19