Comunidad Gambas-es
SOLUCIONADO Incrustar un formulario dentro de otro. - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Controles/Librerías/Componentes (https://gambas-es.org/forum-7.html)
+--- Tema: SOLUCIONADO Incrustar un formulario dentro de otro. (/thread-836.html)



SOLUCIONADO Incrustar un formulario dentro de otro. - YuHi - 02-03-2022

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.


Código:
'''''''módulo que hace la conexión

Private hConn As Connection

Public Function ConexionBase() As Connection
  hConn = New Connection
         hConn.Type = "mysql"
         hConn.Host = "localhost"
         hConn.Login = "usuario"
         hConn.Password = "clave" 
         hConn.Name = "NombreBase"
  Try hConn.Open

  If Error Then
      Message.Error(Error.Text)
  Else
      Return hConn
  Endif
  Return Null  
End 


Código:
''''''''''Formulario   FMain

Public Sub Form_Open()

End

Public Sub btnAbrir_Click()
  
  Ventana.Show
End


Código:
''''''''Formulario #2

Private hConn As Connection
Private rData3 As Result

Public Sub GridData3_Data(Row As Integer, Column As Integer)
   rData3.MoveTo(Row)
    GridData3.Data.Text = Str(rData3[Column])
End

Public Sub btnIniciar_Click()
  txtRequest3.Text = "SELECT * FROM `NombreTabla`"
  rData3 = hConn.Exec(txtRequest3.Text)
Inc Application.Busy
  GridData3.Rows.Count = 0
  GridData3.Columns.Count = rData3.Fields.Count
  GridData3.Rows.Count = rData3.Count 
Finally
Dec Application.Busy
Catch
    Message.Error("Cannot exec request." & "\n\n" & Error.Text)
End

Public Sub Form_Open()
  hConn = mConexBase.ConexionBase()
End

Public Sub Form_Close()
  hConn.Close
End



RE: Incrustar un formulario dentro de otro. - Shordi - 02-03-2022

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:

Código:
Public Sub btnAbrir_Click()

   dim f as new ventana(Panel1)
 
   f.show()

End

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

Saludos


RE: Incrustar un formulario dentro de otro. - gambafeliz - 02-03-2022

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.


RE: Incrustar un formulario dentro de otro. - YuHi - 04-03-2022

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


RE: Incrustar un formulario dentro de otro. - YuHi - 05-03-2022

¡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.