Como criar um DBGrid baseado em checkboxes ?

Delphi

25/07/2013

Tenho uma conexão com o BD Access. Os dados do access estão em uma ADOTable e são mostrados por um DBGrid.
Quero colocar alguns checkbox com alguns dados, por exemplo, nome e endereço.
Se o checkbox do nome estiver marcado, o DBGrid mostra a coluna de nomes, se não estiver marcado ele não mostra.

Como posso fazer isso?
Obrigado!
Matheus Gomes

Matheus Gomes

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

25/07/2013

Você pode exibir e ocultar as colunas do DBGrid da seguinte forma:
DBGrid1.Columns[0].Visible := checkBox1.Checked;
GOSTEI 0
Matheus Gomes

Matheus Gomes

25/07/2013

Consegui ocultar as colunas da maneira que me disse, mas tenho um probleminha.
Tenho um botão que exporta os dados do DBGrid para o Excel e quando clico nele, todas as colunas são exportadas.
Quero encontrar uma maneira de exportar apenas as colunas que não estão invisíveis no DBGrid.

Veja o código para exportação:

procedure TFormRelPers.Button2Click(Sender: TObject);
var linha, coluna: integer;
    planilha: variant;
    valorCampo: string;
begin
   planilha:= CreateOleObject('Excel.Application');
   planilha.Workbooks.add(1);
   planilha.Cells.Select;
   planilha.Selection.NumberFormat := '@';
   planilha.caption:= 'Relatório Personalizado';
   planilha.visible:= true;
   AdoTable1.First;

   for linha:= 0 to AdoTable1.RecordCount-1 do
   begin
      for coluna:= 1 to AdoTable1.FieldCount do
      begin
         valorCampo:= AdoTable1.Fields[coluna-1].AsString;
         planilha.cells[linha+2,coluna]:= valorCampo;
      end;
     AdoTable1.Next;
   end;

   for coluna:=1 to AdoTable1.FieldCount do
   begin
      valorCampo:= AdoTable1.Fields[coluna-1].DisplayLabel;
      planilha.cells[1,coluna]:= valorCampo;
   end;
   planilha.columns.AutoFit;
end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

25/07/2013

No for interno em que você faz a exportação, faça a verificação se a coluna do grid está visível. Por exemplo:
for linha:= 0 to AdoTable1.RecordCount-1 do
begin
	for coluna:= 1 to AdoTable1.FieldCount do
	begin
		if dbGrid1.Columns[coluna].Visible then
		begin
			valorCampo:= AdoTable1.Fields[coluna-1].AsString;
			planilha.cells[linha+2,coluna]:= valorCampo;
		end;
	end;
	AdoTable1.Next;
end;

GOSTEI 0
Matheus Gomes

Matheus Gomes

25/07/2013

Consegui fazer com algumas mudanças. Muito obrigado pela sua ajuda amigo!

Vou deixar o código que usei aqui caso alguém queira usá-lo:
procedure TFormRelPers.Button2Click(Sender: TObject);
var linha, coluna, sub: integer;
    planilha: variant;
    valorCampo: string;
begin
  planilha:= CreateOleObject('Excel.Application');
  planilha.Workbooks.add(1);
  planilha.Cells.Select;
  planilha.Selection.NumberFormat := '@';
  planilha.caption:= 'Relatório Personalizado';
  planilha.visible:= true;
  AdoTable1.First;

  for linha:= 0 to AdoTable1.RecordCount-1 do
  begin
    sub:=0;
    for coluna:= 1 to AdoTable1.FieldCount do
    begin
      if DBGrid1.Columns[coluna].Visible then
      begin
        valorCampo:= AdoTable1.Fields[coluna-1].AsString;
        planilha.cells[linha+1,coluna-sub]:= valorCampo;
      End
      Else
      Begin
        sub:=sub+1;
      End;
    end;
    AdoTable1.Next;
  end;

  sub:=0;
  for coluna:=1 to AdoTable1.FieldCount do
  begin
    if DBGrid1.Columns[coluna].Visible then
    begin
      valorCampo:= AdoTable1.Fields[coluna-1].DisplayLabel;
      planilha.cells[1,coluna-sub]:= valorCampo;
    End
    Else
    Begin
      sub:=sub+1;
    End;
  end;
  planilha.columns.AutoFit;

end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

25/07/2013

Show de bola, amigo. Que bom que deu certo e obrigado por compartilhar o código.
Neste caso estou encerrando o tópico.
Abraço.
GOSTEI 0
POSTAR