Mensajes: 7
Temas: 4
Gracias Recibidas: 0 en 0 posts
Gracias Dadas: 7
Registro en: Jan 2022
02-03-2022, 07:57
(Última modificación: 05-03-2022, 03:08 por
YuHi.)
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
'''''''módulo que hace la conexión
hConn.Type = "mysql"
hConn.Host = "localhost"
hConn.Login = "usuario"
hConn.Password = "clave"
hConn.Name = "NombreBase"
GAMBAS
''''''''''Formulario FMain
Ventana.Show
GAMBAS
''''''''Formulario #2
rData3.MoveTo(Row)
GridData3.
Data.
Text = Str(rData3
[Column
])
txtRequest3.Text = "SELECT * FROM `NombreTabla`"
rData3
= hConn.
Exec(txtRequest3.
Text) GridData3.Rows.Count = 0
GridData3.Columns.Count = rData3.Fields.Count
GridData3.Rows.Count = rData3.Count
hConn = mConexBase.ConexionBase()
Mensajes: 1,183
Temas: 136
Gracias Recibidas: 446 en 297 posts
Gracias Dadas: 463
Registro en: Jul 2020
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:
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:1 usuarios dice Gracias! a Shordi por este post
• YuHi
Mensajes: 466
Temas: 111
Gracias Recibidas: 17 en 16 posts
Gracias Dadas: 101
Registro en: Jul 2020
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:1 usuarios dice Gracias! a gambafeliz por este post
• YuHi
Mensajes: 7
Temas: 4
Gracias Recibidas: 0 en 0 posts
Gracias Dadas: 7
Registro en: Jan 2022
04-03-2022, 02:31
(Última modificación: 04-03-2022, 02:53 por
YuHi.)
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
Mensajes: 7
Temas: 4
Gracias Recibidas: 0 en 0 posts
Gracias Dadas: 7
Registro en: Jan 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.