Ver Mensaje Individual
  #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
Reputación: 19
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