YuHi   02-03-2022, 07:57
#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.


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
Última modificación: 05-03-2022, 03:08 por YuHi.
Shordi   02-03-2022, 10:29
#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:

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

No podemos regresar
gambafeliz   02-03-2022, 13:48
#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.
YuHi   04-03-2022, 02:31
#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
Última modificación: 04-03-2022, 02:53 por YuHi.
YuHi   05-03-2022, 03:00
#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.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.