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); aux_item.Caption:=DataSet.Fields[i].DisplayLabel; aux_item.Checked:=True; aux_item.AutoCheck:=True; aux_item.Tag:=i; PopupMenu1.Items.Add(aux_item); 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
Procedure AlHacerClick(Sender: TObject);...
...
implementation
{$R *.dfm}
...
...
procedure TForm1.AlHacerClick(Sender: TObject);
begin
with (Sender as TMenuItem)do
begin
DBGrid1.Columns[Tag].Visible:=Checked; 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); aux_item.Caption:=DataSet.Fields[i].DisplayLabel; aux_item.Checked:=True; aux_item.AutoCheck:=True; aux_item.Tag:=i; PopupMenu1.Items.Add(aux_item);
aux_item.OnClick:=AlHacerClick; 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);end;
Y eso es todo amigo....

Saludos...
