Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear TabSheet... (https://www.clubdelphi.com/foros/showthread.php?t=38246)

vladimirbp 07-12-2006 21:37:58

Crear TabSheet...
 
Que tal?

Tengo un Page Control que contendrá desde 1 hasta N TabSheets, estos TabSheets tendrán un DBGrid.

Como se puede crear estos TabSheets en tiempo de ejecución?, y a su vez sus respectivos DBGrids??

gracias y saludos

VB

AzidRain 07-12-2006 23:14:52

Eso que quieres hacer viene en la ayuda de Delphi...me pregunto 2 cosas

1.- Los grids son identicos? Es decir contendran las mismas columnas (posiblemente no los mismos datos)

Cual es tu idea o que piensas hacer...

vladimirbp 08-12-2006 00:49:04

gracias por responder...
 
Cada TabSheet tendrá un solo DBGrid, pero el numero de columnas de cada grid puede variar.

Tengo pensado hacer Catálogos parametrizables, de tal manera que si tengo un catálogo de articulos en una pestaña, en otra pestaña podria tener que proveedores me venden ese artículo, en otra pestaña podría tener los costos, precios de venta, margenes de utilidad, etc. por sucursal.

saludos

P.D.
revisaré la ayuda de Delphi, pero no están demás unos Tips de los expertos. :o)


Cita:

Empezado por AzidRain
Eso que quieres hacer viene en la ayuda de Delphi...me pregunto 2 cosas

1.- Los grids son identicos? Es decir contendran las mismas columnas (posiblemente no los mismos datos)

Cual es tu idea o que piensas hacer...


Lepe 08-12-2006 01:45:30

¿qué ganas con tener N-tabsheets?

Si cambias de tabsheet, ocultas la anterior, así que...¿no podrías utilizar un solo DBGrid? 5 DBgrids, con sus respectivas consultas y datos en memoria, consume recursos.

Usando una consulta y los datos, solo tendrías que guardar la sentencia sql de artículos (un string) y reutilizas el Query y el DBGrid.

Por otra parte, mezclar temas distintos en una sola ventana puede llegar a ser engorroso para el usuario. Yo pondría botones con proveedores, otro con costes, otro con ventas, etc, al pulsar el botón abres la ventana de cada uno de ellos.

Saludos

vladimirbp 08-12-2006 02:34:18

que tal?

lo que pasa es que lo quiero hacer lo mas parametrizable posible, para que los cambios que haga se reflejen sin necesidad de recompilar y estar enviando el EXE a todas las sucursales. Todos los parametros los guardaría en tablas.

lo de poner varias pestañas con los datos que mencioné es porque así me lo pidió el cliente. Ni modo, al cliente lo que pida.

Por lo pronto ya logré crear TabSheets en tiempo de ejecución, falta crear un DBGrid para cada TabSheet.

saludos



Cita:

Empezado por Lepe
¿qué ganas con tener N-tabsheets?

Si cambias de tabsheet, ocultas la anterior, así que...¿no podrías utilizar un solo DBGrid? 5 DBgrids, con sus respectivas consultas y datos en memoria, consume recursos.

Usando una consulta y los datos, solo tendrías que guardar la sentencia sql de artículos (un string) y reutilizas el Query y el DBGrid.

Por otra parte, mezclar temas distintos en una sola ventana puede llegar a ser engorroso para el usuario. Yo pondría botones con proveedores, otro con costes, otro con ventas, etc, al pulsar el botón abres la ventana de cada uno de ellos.

Saludos


Lepe 08-12-2006 15:18:08

Ahh, vale, vale, si el cliente lo pide se hace y punto (ya me ha pasado jejej).

Crear el DBgrid es exactamente lo mismo. Crear, asignar el padre (parent) que será el tabsheet, asignar el el datasource y por último hacer un grid.RebuildColumns (esto hace que tome de la base de datos la definición de cada columna, con el displayWith (ancho de cada columna, formato para mostrar cada columna, etc).

En principio, tampoco hace falta llamar a Rebuildcolumns, creo que se hace internamente, aunque a mí me gusta hacerlo de forma explícita.

Si dentro de cada TabSheet va lo mismo, es decir, un grid, un par de botones, etc. Yo te aconsejaría hacer un Frame, en él pones el grid, los botones que te haga falta y alguna que otra rutina que necesites.

Después de crear el TabSheet, creas dentro una instancia de ese frame. Así quizás puedas tener más facilidad de trabajo.

Saludos

Lepe 08-12-2006 15:38:03

Para hacerlo parametrizable, yo guardaría algo así en la Base de datos, (supongo que es más o menos lo que has hecho) quizás te aporte algo:

Tabla de configuración:
Código:

Name                          Valor
TabsheetNames            articulos, proveedores, ventas

sqlarticulos            select codigoArticulo, descripcion  from articulos
sqlproveedores          select codigoprov, nombre  from proveedores where %s
sqlventas                select codigoVenta, codigo Articulo from ventas where %s

Para guardar los nombres de los tabsheet, te puedes ayudar del CommaText de un StringList

Se supone que cada tabsheet tendrá un Query asociado al grid, y guardamos el sql de cada uno de esas querys.

Saludos

vladimirbp 08-12-2006 21:09:56

tendrás por ahi algun ejemplito??, suponiendo que ya tengo el PageControl con sus TabSheets, el ADOQuery y el DataSource.

gracias :D

Cita:

Empezado por Lepe
Ahh, vale, vale, si el cliente lo pide se hace y punto (ya me ha pasado jejej).

Crear el DBgrid es exactamente lo mismo. Crear, asignar el padre (parent) que será el tabsheet, asignar el el datasource y por último hacer un grid.RebuildColumns (esto hace que tome de la base de datos la definición de cada columna, con el displayWith (ancho de cada columna, formato para mostrar cada columna, etc).

En principio, tampoco hace falta llamar a Rebuildcolumns, creo que se hace internamente, aunque a mí me gusta hacerlo de forma explícita.

Si dentro de cada TabSheet va lo mismo, es decir, un grid, un par de botones, etc. Yo te aconsejaría hacer un Frame, en él pones el grid, los botones que te haga falta y alguna que otra rutina que necesites.

Después de crear el TabSheet, creas dentro una instancia de ese frame. Así quizás puedas tener más facilidad de trabajo.

Saludos


Lepe 09-12-2006 02:47:29

Como te dije es más fácil crear un componente en ejecución (el frame) que 3 componentes.

En delphi, file -> new -> frame

ahora dentro colocas el grid, el datasource, el query y los enlazas todos. Obviamente no funciona porque falta asignar el sql, pero eso creo que es lo de menos ¿no?

Guarda como FrameBase (el Frame en sí, como si fuera un Form) y como UFrameBase el .pas

Si lo vas a usar en el Form1, haces esto:
Código Delphi [-]

uses UFrameBase;

procedure TForm1.Form1Create(....);
var frame :TFrameBase;
begin
   frame := TFrameBase.Create(Self);
   with frame do
   begin 
      top := 10;
      left:= 10;
      parent := TabSheet1;
      Query1.sql.text := 'select * FROM ARTICULOS';
      Query1.Open;
      DBGrid.RebuildColumns;
   end;
end;

Saludos

AzidRain 09-12-2006 16:49:52

Según veo como lo quiere tu cliente es que empieza siempre en la primera pestaña, luego de algún registro que esté consultado puede obtener detalles del mismo en las otras pestañas.

No entiendo tu concepto de "parametrizables", como lo planteas el número de tablas (y pestañas) que vas a utilizar es fijo (artículos,proveedores, ventas) por lo que no veo caso ir creando en tiempo de ejecución los querys y pestañas.

De acuerdo a como lo quiere tu cliente, necesitas efectivamente las tres tablas pero como ya vimos que dos de ellas son detalle de la primera,podrías usar un enfoque "Maestro-Detalle" y hacer los enlaces correspondientes. De forma que cada vez que cambias de artículo los otros querys se actualizan en automático con la información pertinente.

Ahora bien, no siempre se puede esto porque implica cargar las tablas completas...miles de registros a veces.

Entonces si se va a ejecutar el query cada vez que se quiere accesar a los detalles es exactamente el mismo caso de poner las pestañas previamente con sus grids dentro y unicamente ejecutar el query de cada grid de detalle cuando el cliente haga click en la pestaña por primera vez. La secuencia sugerida podria ser:

1.- El cliente abre la ventana y se le muestran los artículos (la ventana tiene las tres pestañas)
2.- El cliente hace click en proveedores para ver los que venden ese artículo
3.- La aplicación verifica si se seleccionó un artículo distinto y si no está ya abierto el query de proveedores...en su caso lo abre (con el parametro que corresponda)
4.-Se muestra el grid con los proveedores.
5.- Se repite 3 y 4 para las otras pestañas de detalle si el cliente las usa.
6.-Si el cliente cambia de artículo, cerrar los otros querys (ya no corresponden al artículo)

vladimirbp 11-12-2006 18:57:23

gracias, lepe. Lo voy a intentar...

saludos


Cita:

Empezado por Lepe
Como te dije es más fácil crear un componente en ejecución (el frame) que 3 componentes.

En delphi, file -> new -> frame

ahora dentro colocas el grid, el datasource, el query y los enlazas todos. Obviamente no funciona porque falta asignar el sql, pero eso creo que es lo de menos ¿no?

Guarda como FrameBase (el Frame en sí, como si fuera un Form) y como UFrameBase el .pas

Si lo vas a usar en el Form1, haces esto:

Código Delphi [-]

uses UFrameBase;

procedure TForm1.Form1Create(....);
var frame :TFrameBase;
begin
frame := TFrameBase.Create(Self);
with frame do
begin
top := 10;
left:= 10;
parent := TabSheet1;
Query1.sql.text := 'select * FROM ARTICULOS';
Query1.Open;
DBGrid.RebuildColumns;
end;
end;





Saludos


vladimirbp 11-12-2006 19:00:56

AzidRain

manejo el concepto de parametrizable ya que esa misma pantalla de articulos la podré reutilizar para crear otros catalogos que tambien podrían llevar 1 o mas pestañas.

Los parametros los guardaré en tablas y los cargaré al iniciar mi aplicación. Por ejemplo: SQL del catalogo, orden, botones que estaran visibles o invisibles segun el usuario, etc.

Cita:

Empezado por AzidRain
Según veo como lo quiere tu cliente es que empieza siempre en la primera pestaña, luego de algún registro que esté consultado puede obtener detalles del mismo en las otras pestañas.

No entiendo tu concepto de "parametrizables", como lo planteas el número de tablas (y pestañas) que vas a utilizar es fijo (artículos,proveedores, ventas) por lo que no veo caso ir creando en tiempo de ejecución los querys y pestañas.

De acuerdo a como lo quiere tu cliente, necesitas efectivamente las tres tablas pero como ya vimos que dos de ellas son detalle de la primera,podrías usar un enfoque "Maestro-Detalle" y hacer los enlaces correspondientes. De forma que cada vez que cambias de artículo los otros querys se actualizan en automático con la información pertinente.

Ahora bien, no siempre se puede esto porque implica cargar las tablas completas...miles de registros a veces.

Entonces si se va a ejecutar el query cada vez que se quiere accesar a los detalles es exactamente el mismo caso de poner las pestañas previamente con sus grids dentro y unicamente ejecutar el query de cada grid de detalle cuando el cliente haga click en la pestaña por primera vez. La secuencia sugerida podria ser:

1.- El cliente abre la ventana y se le muestran los artículos (la ventana tiene las tres pestañas)
2.- El cliente hace click en proveedores para ver los que venden ese artículo
3.- La aplicación verifica si se seleccionó un artículo distinto y si no está ya abierto el query de proveedores...en su caso lo abre (con el parametro que corresponda)
4.-Se muestra el grid con los proveedores.
5.- Se repite 3 y 4 para las otras pestañas de detalle si el cliente las usa.
6.-Si el cliente cambia de artículo, cerrar los otros querys (ya no corresponden al artículo)



La franja horaria es GMT +2. Ahora son las 18:15:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi