Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Seleccionar columnas a mostrar en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=71714)

tiago_begins 05-01-2011 20:44:29

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.

rgstuamigo 05-01-2011 22:02:57

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...:)

Aleca 06-01-2011 00:26:44

aunque la explicación de rgstuamigo es muy clara, otra opcion es la ultimgrid de las Jedi, ya tiene lo que necesitas. :)

Delfino 06-01-2011 17:59:47

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..

rgstuamigo 06-01-2011 20:24:55

Efectivamente... :eek: :D se puede hacer tanto con el JvDBGrid o con JvDBUltimGrid... vaya :rolleyes: eso me pasa por querer inventar de nuevo la rueda...:D
Saludos...:)

tiago_begins 10-01-2011 23:44:51

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?? :confused:

Aleca 10-01-2011 23:53:29

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 :)


La franja horaria es GMT +2. Ahora son las 04:37:42.

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