Comunidad Gambas-es
[SOLUCIONADO] Duda sobre una clase - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: [SOLUCIONADO] Duda sobre una clase (/thread-844.html)



Duda sobre una clase - gambafeliz - 11-03-2022

Hola

Tengo una clase llamada Cuadricula basada en GridView donde hago algunos cosas que no la hace GridView.

En mi formulario tengo un GridView1 y lo cargo llamando a la siguiente Subrutina que la tengo en un módulo, os describo:

Esta subrutina llamada CargarDatos(formulario As Form, SQL As String, Grid As GridView) invoca la clase Cuadricula así:

Dim oCuadricula As New Cuadricula(formulario)

Al final de esta subrutina pongo esto:

' Pinto el GridView
oCuadricula.Cuadricula(Grid, resultado, mDB.obtenerColumnasCamposGridView("", resultado))

Pero cuando termina digamos que carga el GridView1 del formulario pero ahora he descubierto que también pinta un Cuadricula1 en el formulario sin quererlo yo pintar.

Preguntas:
Siguiendo esta manera de hacer mi carga de datos podria usar cuadricula sin pintarla por código en el formulario.

En la actualidad tras cargar los datos del GridView1 del Formulario de esta forma que describo pongo al final de la subrutina CargarDatos esto:
oCuadricula.Visible = False pero no se por que pero creo que esto es una gran chapuza por mi parte ya que sobrecargo supongo la memoria de objetos innecesarios.

Alguien me ilumina el camino, Gracias.


RE: Duda sobre una clase - Harpo - 12-03-2022

Buenos días,

Un tanto confuso su mensaje. Por lo que entiendo lo que hace es:
  1. Tiene un formulario con GridView1.
  2. Carga datos en GridView1 con una función definida en un módulo: CargarDatos(formulario as Form, SQL as String, Grid as GridView).
  3. Y dentro de CargarDatos define una instancia de su clase Cuadricula: Dim oCuadricula as New Cuadricula(formulario).
Cuadrícula es un control que hereda de GridView. Al crearlo en su rutina de carga de datos y asignarle como contenedor el formulario tiene usted dos GridView en el formulario: GridView1 y Cuadricula1.

Sin saber qué hace Cuadricula poco se me ocurre. Tampoco le veo sentido a crear un control nuevo que hereda de GridView cuya utilidad es cargar un GridView estándar y "pintarlo". Yo básicamente sigo dos caminos:
  1. Un control no hace todo lo que necesito. Creo uno nuevo que hereda del anterior y uso el nuevo control en el formulario: "Solución Cuadricula".
  2. Necesito manipular un control. Creo las rutinas en un módulo y paso el control como argumento: "Solución CargarDatos"
Está usted mezclando ambas soluciones.
Un saludo, Harpo.


RE: Duda sobre una clase - gambafeliz - 12-03-2022

Gracias Harpo

Desearía pedirle consejo.

Es exactamente como usted dice.

Pero le cuento mi problema. En todos mis formularios tengo GridView1 y en una versión posterior de mi programa creo Cuadricula con el fin de que cargue el formulario con colores y anchuras según los campos, etc, etc. Que no viene en GridView Estandar pero que Cuadricula es como un camaleón que hace todo lo que no tiene GridView.

Yo haría lo que usted dice y tiene razón pero tendría que sustituir GridView1 y su código por Cuadricula1 y ya no necesitaría CargarDatos tal como existe aunque si pero distinto, solo cargaría los datos sin crear Cuadricula solo pasar por parámetro y listo.

Acabo de pensar en cuando creo cuadricula en el modulo destruir con delete() al final de CargarDatos.

Digame entonces:

Tengo dos opciones y usted me dice si es así:
1. Sustituir GridView1 y su código por Cuadricula1 y su código y en el módulo CargarDatos no crear Cuadricula sino cargar Cuadricula1.
2. Seguir así para no cambiar nada con el riesgo de que se caiga el castillo como naipe y poner al final de CargarDatos oCuadricula.delete() y destruyo el objeto tras cargar GridView1

Basicamente he llegado a esto por que tengo 30 gridview1 por todos mis formulario y todos apuntan a CargarDatos en el módulo y este se encarga de cargarlos y todo esta funcionando, pero me percaté que cometia un grave error por que cada vez que los cargaba, creaba un objeto llamado oCuadricula en los formulario de forma uno a uno y tantas veces como cargaba el GridView1, solo que no los veía por que estaba fuera de visualización por que las coordenadas x e y eran negativas. Ve usted el lío que he montado. Vamos como el niño que se mete en la nevera y se come todo el helado de la familia en un rincón. Ya vera como te vea tu madre Wink


RE: Duda sobre una clase - Harpo - 12-03-2022

Efectivamente creo que tiene dos opciones:
  1. Sustituir GridView1 por Cuadricula1 y en CargarDatos usar este último: CargarDatos(formulario as Form, SQL as String, Grid as Cuadricula). Además puede incluir CargarDatos como un método de Cuadricula con solamente SQL cómo parámetro ya que el formulario puede obtenerlo de Me.Parent - Me.Window dentro del control.
  2. Migrar el código de Cuadricula a un módulo, me parece entender que la función del control es formatear la apariencia del GridView que muestra los datos. Para eso no es necesario que los procedimientos estén en un control.
Para mi la primera opción es la mejor si Cuadricula lo voy a usar en otros proyectos. Yo uso un GridView construido a medida partiendo del original, no heredado, supongo que no es su caso si lo que necesita solamente es cambiar la apariencia del control. También es la opción más trabajosa, tendrá que ir formulario por formulario borrando el GridView y sustituyéndolo por Cuadricula. Aunque ganará tiempo a futuro en mantenimiento.

La segunda opción es más rápida e igualmente buena, solo necesita cambiar CargarDatos para que use las funciones del módulo en vez de las de Cuadricula. En su caso es la que usaría,  lo de usar "oCuadricula.delete()" me chirría mucho.

No sé si he conseguido aclararle algo, un saludo. Harpo.


RE: Duda sobre una clase - gambafeliz - 12-03-2022

Muchísimo, gracias de las de verdad Smile