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 Código: ''''''''''Formulario FMain Código: ''''''''Formulario #2 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() 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. |