Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

SOLUCIONADO Incrustar un formulario dentro de otro.
#1

Buen día, a todos. Tengo dos Formularios y un módulo, El módulo abre una conexión a una base en mysql, el formulario FMain tiene un botón que abre el segundo formulario (ventana) la cual abre una tabla y llena un Gridview. Esto sí me funciona bien. Lo que quiero hacer ahora es que el formulario Ventana se incruste en el formulario FMain. Traté de utilizar el comando 
Ventana.Load(Panel1) 
donde Panel1 está en el formulario FMain, pero al ponerlo obtengo un error "Null object". Sí se incrusta El formulario Ventana dentro de Panel1, pero no puedo llenar el objeto Gridview con los datos de la Base Mysql.

Traté de ponerlo justo antes del comando 
Ventana.show
Supongo que este error es porque al tratar de incrustarlo ya no estoy realmente en el formulario Ventana, pero no sé como resolverlo. ¿pueden por favor ayudarme? Les pongo el código con el que estoy haciendo las pruebas.


GAMBAS
  1. '''''''módulo que hace la conexión
  2.  
  3.  
  4. Public Function ConexionBase() As Connection
  5.   hConn = New Connection
  6.          hConn.Type = "mysql"
  7.          hConn.Host = "localhost"
  8.          hConn.Login = "usuario"
  9.          hConn.Password = "clave" 
  10.          hConn.Name = "NombreBase"
  11.   Try hConn.Open
  12.  
  13.       Message.Error(Error.Text)
  14.   Else
  15.       Return hConn
  16.   Return Null  
  17. End 




GAMBAS
  1. ''''''''''Formulario   FMain
  2.  
  3. Public Sub Form_Open()
  4.  
  5.  
  6. Public Sub btnAbrir_Click()
  7.   
  8.   Ventana.Show




GAMBAS
  1. ''''''''Formulario #2
  2.  
  3.  
  4. Public Sub GridData3_Data(Row As Integer, Column As Integer)
  5.    rData3.MoveTo(Row)
  6.     GridData3.Data.Text = Str(rData3[Column])
  7.  
  8. Public Sub btnIniciar_Click()
  9.   txtRequest3.Text = "SELECT * FROM `NombreTabla`"
  10.   rData3 = hConn.Exec(txtRequest3.Text)
  11.   GridData3.Rows.Count = 0
  12.   GridData3.Columns.Count = rData3.Fields.Count
  13.   GridData3.Rows.Count = rData3.Count 
  14.     Message.Error("Cannot exec request." & "\n\n" & Error.Text)
  15.  
  16. Public Sub Form_Open()
  17.   hConn = mConexBase.ConexionBase()
  18.  
  19. Public Sub Form_Close()
  20.   hConn.Close


    ¡Gracias!
#2

Dentro de FMain tienes que crear un contenedor donde ubicar el formulario secundario (aunque el propio form ya es un contenedor, tener uno para poder controlar su ubicación y demás viene muy bien), digamos Panel1

y luego:

GAMBAS
  1. Public Sub btnAbrir_Click()
  2.  
  3.    dim f as new ventana(Panel1)
  4.  
  5.    f.show()
  6.  



Con eso creas una instancia de Ventana y lo incrustas en dicho panel.

Saludos

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • YuHi
    ¡Gracias!
#3

Y no es:

formulario.Reparent(panel, 0, 0)
formulario.Raise

En realidad es la única forma que yo se, la verdad que voy a probar la forma que propone Shordi que me parece muy interesante.
[-] Los siguientes 1 usuarios dice gracias a gambafeliz por este post:
  • YuHi
    ¡Gracias!
#4

Tomando lo que propone Shordi, pude hacerlo en otro programa que estaba probando (lo modifiqué para no perderme).
En este otro tenemos dos formularios.
En el formulario FMain, tenemos dos botones y un contenedor (Panel1) vacío. El formulario FRequest contiene un GridView.
Uno de los botones de FMain inicia la conexión a mysql; el segundo botón llama al formulario FRequest además llena el GridView con datos de la base de datos y finalmente lo incrusta en el contenedor Panel1.

De esta manera, Nos queda un formulario incrustado en otro y además conteniendo datos de la base de datos.

Les  pongo  el código.

'Formulario   FRequest
Private $hConn As Connection
Private $rData As Result

Public Sub _new(hConn As Connection, panel1 As Panel)
  Dim sConsulta As String
      sConsulta = "SELECT * FROM `test` "
  $hConn = hConn
  $rData = $hConn.Exec(sConsulta)
  ReadData
End 

Private Sub ReadData()
    Inc Application.Busy
      GridData1.Rows.Count = 0
      GridData1.Columns.Count = $rData.Fields.Count
      GridData1.Rows.Count = $rData.Count 
    Finally
    Dec Application.Busy
      Catch
        Message.Error("Cannot exec request." & "\n\n" & Error.Text)
End 

Public Sub GridData1_Data(Row As Integer, Column As Integer)
    $rData.MoveTo(Row)
    GridData1.Data.Text = Str($rData[Column])
End

Public Sub Form_Close()
    Me.Close
End  

Public Sub Form_Open()
  
End


''''''''''''''''''''''''''''''''''''''''''

'Formulario    FMain

Private $hConn As Connection
Private rData3 As Result

Public Sub btnConnect_Click()

 $hConn = New Connection
  Try $hConn.Close

  With $hConn
    .Type = "mysql"
    .Host = "localhost"
    .Login = "Usuario" 
    .Password = "clave"
    .Name = "test"
  End With

    Try $hConn.Open
  FMain.Enabled = True

  Catch
    Message.Error(Error.Text)
End 


Public Sub btnRun_Click()
  Dim hForm As FRequest
      hForm = New FRequest($hConn, Panel1) ' Aquí lo incrusta en Panel1
      hForm.Show
  Catch
    Message.Error(Error.Text)
End 

Public Sub Form_Open()
      
End

Public Sub Form_Close()
     $hConn.Close
End

Ahora bien, en el primer programa tenía la conexión en un modulo, podía incrustar un formulario en otro, pero no pude desplegar la información de la base de datos en el gridView.
En el segundo programa, sí pude incrustar los formularios y en el formulario FRequest incrustado a su vez contenía el GridView que se podía ver los datos de la base de datos. Pero este último la conexión a mysql estaba en FMain en lugar de un módulo aparte.

Mi pregunta ahora es: ¿se puede agregar el módulo que tiene la conexión en este segundo programa? Cuando agrego el módulo (mConexBase) en el segundo programa y reemplazo el contenido de btnConnect_Click()   por esto
       
Public Sub btnConnect_Click()
$hConn = mConexBase.ConexionBase() 
End

mConexBase.ConexionBase no es static en FMain
    ¡Gracias!
#5

¡Resuelto!
estaba en lo correcto al llamar el módulo en la forma 
hConn = mConexBase.ConexionBase() 

Lo que sucedió fue un problema en la definición del módulo. No me percaté que en lugar de crear un módulo, creé una clase. Por eso no me lo reconocía.

Ahora todo trabaja muy bien. Gracias por ayudarme.
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)