Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-01-2011
tiago_begins tiago_begins is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 15
Poder: 0
tiago_begins Va por buen camino
Seleccionar columnas a mostrar en DBGrid

Hola a todos... soy nuevo en Delphi y estoy haciendo una agenda y mi pregunta es la que sigue:

Tengo un DBGrid con conexion Zeos con MySql... lo que quiero hacer es que en tiempo de ejecución, al darle 2do botón del mouse sobre CUALQUIER columna del grid me abra un menú contextual donde me permita seleccionar através de checkbox o algo parecido, que columnas quiero mostrar y/o ocultar.

Por ejemplo:

Corro el programa y tengo la columna Nombre, Telefono y Celular. YO USUARIO no quiero ver la columna ''Celular'' entonces hago doble click sobre cualquier columna y veo un menu contextual con Nombre, Telefono y Celular y SOLO destildo (deselecciono) ''Celular'' y la columna se refresca quedando solo Nombre y Telefono.


Disculpas por la extensión de la pregunta pero como leí en las reglas debo ser bien específico con la pregunta.

Desde ya gracias.
Responder Con Cita
  #2  
Antiguo 05-01-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Bueno... voy a tratar de ayudarte un poco:
Para hacer lo que pretendes hay que utilizar un Componente PopupMenu al que le vamos a cargar los item en tiempo de ejecucion.

Bueno... manos a la Obra
Para cargar los item al PopupMenu en Tiempo de Ejecucion es necesario que el DataSet(ZQuery o ZTable al que está conecatado el DBGrid) esté Abierto o Activo, Por ello vamos a utilizar el evento AfterOpen (Despues de Abrir ) de ese dataset y poner el siguiente Código:
Código Delphi [-]
procedure TForm1.ZTable1AfterOpen(DataSet: TDataSet);
var i:Integer;
aux_item:TMenuItem;
begin
  for  i:=0  to DataSet.Fields.Count-1  do
  begin
    aux_item:=TMenuItem.Create(PopupMenu1);// creo un item por cada Iteracion
    aux_item.Caption:=DataSet.Fields[i].DisplayLabel; // pongo como caption el nombre de la columna o campo correspondiente
    aux_item.Checked:=True;// hago que éste chequeado
    aux_item.AutoCheck:=True;// hago que el chequeado sea automatico
    aux_item.Tag:=i;// le pongo como tag la posicion de la columna correspondiente ( es un buen truco para saber a que columna va a afectar)
   PopupMenu1.Items.Add(aux_item);// lo adiciono al PopupMenu
  end;
end;
Para Conseguir ocultar o visualizar la columna Específica del DBGrid tenemos que crearnos un procedimiento(En realidad un manejador de Evento para cada evento OnClick de cada Item del PopupMenu), en nuestro caso es sufiente crearnos un solo procedure de la siguiente forma >
Código Delphi [-]
...
...
  private
    { Private declarations }
    Procedure AlHacerClick(Sender: TObject);// <---------Mi Manejador de evento
...
...
implementation

{$R *.dfm}
...
...
procedure TForm1.AlHacerClick(Sender: TObject);
begin
   with (Sender as TMenuItem)do
   begin
      DBGrid1.Columns[Tag].Visible:=Checked;// Hago Visible o No visible la columna Específica segun el Checked del Item Clickeado
   end;
end;
Ahora nos toca Asignar el evento OnClick a cada Item, lo que podemos hacer es agregar una linea de código al evento AfterOpen (Que anteriormente hemos utilizado)del dataset al que está enganchado el DBGrid quedando dicho evento finalmente de la siguiente forma:
Código Delphi [-]
procedure TForm1.ZTable1AfterOpen(DataSet: TDataSet);
var i:Integer;
aux_item:TMenuItem;
begin
  for  i:=0  to DataSet.Fields.Count-1  do
  begin
    aux_item:=TMenuItem.Create(PopupMenu1);// creo un item por cada Iteracion
    aux_item.Caption:=DataSet.Fields[i].DisplayLabel; // pongo como caption el nombre de la columna o campo correspondiente
    aux_item.Checked:=True;// hago que éste chequeado
    aux_item.AutoCheck:=True;// hago que el chequeado sea automatico
    aux_item.Tag:=i;// le pongo como tag la posicion de la columna correspondiente ( es un buen truco para saber a que columna va a afectar )
   PopupMenu1.Items.Add(aux_item);// lo adiciono al PopupMenu

{La linea siguiente ha sido aumentada}
    aux_item.OnClick:=AlHacerClick;//Asigno el evento OnClick a cada Item del PopupMenu
  end;
end;

Para Mostrar el PoPupMenu cuando el usuario haga Doble Click en la columna del DBGrid , pues para serte franco yo mejor usaría para eso el Evento OnTitleClick ( Al hacer un Clik en el Titulo) del DBGrid, ya que tendriamos que complicarno un poco el controlar que el usuario dé dos click y no uno , por eso sugiero usar el evento OnTitleClick anteriomente mencionado para no complicarnos demasiado.
Bueno..., para mostrar el PopupMenu al hacer click en cualquier columna ( click en cualquier título de columna) podemos poner el siguiente código en el evento OnTitleClick del DBGrid:
Código Delphi [-]
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
 PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);//Muestro Los Item del PopupMenu en la posicion del Mouse
end;
Y eso es todo amigo....
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 05-01-2011 a las 22:07:01.
Responder Con Cita
  #3  
Antiguo 06-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 22
Aleca Va por buen camino
aunque la explicación de rgstuamigo es muy clara, otra opcion es la ultimgrid de las Jedi, ya tiene lo que necesitas.
__________________
Aleca
Responder Con Cita
  #4  
Antiguo 06-01-2011
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cool

Consigo hacer esto sin escribir codigo, y ademas lo hago persistente entre sesiones para el usuario, comorrrrr?

El componente TJvDBGrid de la suite open source JVCL permite mostrar el dialogo para seleccionar/deseleccionar columnas mediante la propiedad TitleArrow y hacer persistente los cambios con la propiedad IniStorage..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #5  
Antiguo 06-01-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Efectivamente... se puede hacer tanto con el JvDBGrid o con JvDBUltimGrid... vaya eso me pasa por querer inventar de nuevo la rueda...
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #6  
Antiguo 10-01-2011
tiago_begins tiago_begins is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 15
Poder: 0
tiago_begins Va por buen camino
Muchas gracias

Gracias RGStuamigo por la ayuda igual... intente instalar el jvcl pero voy a tool palette y no aparece el TJDBgrid que me decis.

Baje el Jvcl y fui a la carpeta install de jvcl y abri el projecto y le di F9 instale ese y tambien el jcl lo mismo.

pd: Tengo instalado el delphi en la particion "D:\Arquivos\Arquivos de programas D\7.0\Embarcadero\RAD Studio\7.0" pero los proyectos y bpl estan en "C:\Users\usuarioX\Documents\RAD Studio" como por defecto será por eso??
Responder Con Cita
  #7  
Antiguo 10-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 22
Aleca Va por buen camino
en la versión 3.40 que es la que tengo instalada, esta en la paleta Jv Data Controls (estan las dos opciones juntas).

Saludos
__________________
Aleca
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Seleccionar multiples columnas en TDbGrid Leandro Ferrara OOP 1 01-11-2008 23:02:29
sumar columnas en un dbgrid y mostrar mas campos VNyes Firebird e Interbase 5 01-06-2007 19:32:10
Seleccionar columnas en TMemo ixMike OOP 8 11-09-2006 18:53:31
¿como seleccionar columnas, StringGrid? TURING Varios 3 25-11-2005 21:15:54
Seleccionar una linea de un dbgrid y mostrar todos los datos... hook Varios 1 15-04-2005 13:38:49


La franja horaria es GMT +2. Ahora son las 20:26:17.


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
Copyright 1996-2007 Club Delphi