Copiar dados de um Dbgrid


Vamos começar essas duas funções servem para Copiar do TDBGrid o conteúdo para assim ser jogada para documentos como Word e Excel

Obs: Não esqueça de adicionar a Clipbrd nas uses;

Vamos precisar de:
  • 1 - TDBGrid { dbgridCDS };
  • 1 - TClientDataSet {  CDS };
  • 1 - TDataSource { dsCDS };
  • 1 - TPopupMenu { pmCDS };
Primeiro passo: Vincule os componentes;
Segundo passo: Crie 2 campos no dbgridCDS  CODIGO, DESCRICAO;
Terceiro passo: Jogue algumas informações para não ficar em branco o dbgridCDS 



Quarto passoColoque o pmCDS vinculado com o dbgridCDS pela propriedade PopupMenu
Quinto passo: Crie três itens no pmCDS 


Sexto passo: Marque as propriedades "AutoCheck = True"  e "Checked = True"

No segundo item coloque o Código abaixo

1 - Segundo item "CopiarUmaLinhaGrid" coloque o evento abaixo
procedure TFPrincipal.miCopiarUmaLinhaGridClick(Sender: TObject);
begin
  CopiarUmaLinhaGrid(dbgridCDS, miExibirtitulo.Checked);
end;
No segundo item coloque o Código abaixo

2 - Terceiro item "CopiarTodasLinhasGrid" coloque o evento abaixo
procedure TFPrincipal.miCopiarTodasLinhasGridClick(Sender: TObject);
begin
  CopiarTodasLinhasGrid(dbgridCDS, miExibirtitulo.Checked);
end;

As funções em 
procedure TFPrincipal.CopiarTodasLinhasGrid(DBGrid :TDBGrid; PastHeader :Boolean);
var
  StrToCopy :string;
  Idx,
  IdxCol :Integer;
  BookMark,
  SavedBookMark :TBookMark;
begin
  StrToCopy := EmptyWideStr;
  if PastHeader then begin {Titulo das colunas}
    StrToCopy := DBGrid.Columns[0].Title.Caption;
    for IdxCol := 1 to DBGrid.Columns.Count -1 do
      StrToCopy := format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Title.Caption]);
    StrToCopy := StrToCopy + sLineBreak;
  end;
  with DBGrid.DataSource.DataSet do begin
    SavedBookMark := GetBookmark;
    DisableControls;
    First;
    while not EOF do begin
      StrToCopy := StrToCopy +DBGrid.Columns[0].Field.AsString;
      for IdxCol := 1 to DBGrid.Columns.Count -1 do
        StrToCopy := Format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Field.AsString]);
      StrToCopy := StrToCopy + sLineBreak;
      Next;
    end;
    ClipBoard.Clear;
    ClipBoard.SetTextBuf(PChar(StrToCopy));
    GotoBookMark(SavedBookMark);
    FreeBookMark(SavedBookMark);
    EnableControls;
  end;
end;


No código a baixo fará a cópia de uma linha apenas com a opção de cópia o titulo ou não
procedure TFPrincipal.CopiarUmaLinhaGrid(DBGrid: TDBGrid; PastHeader: Boolean);
var
  StrToCopy :string;
  Idx,
  IdxCol :Integer;
  BookMark,
  SavedBookMark :TBookMark;
begin
  if DBGrid.SelectedRows.Count = 0 then
    Exit;
  StrToCopy := EmptyWideStr;
  if PastHeader then begin
    StrToCopy := DBGrid.Columns[0].Title.Caption;
    for IdxCol := 1 to DBGrid.Columns.Count -1 do
      StrToCopy := format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Title.Caption]);
    StrToCopy := StrToCopy + sLineBreak;
  end;
  with DBGrid.DataSource.DataSet do begin
    SavedBookMark := GetBookmark;
    DisableControls;
    for Idx := 0 to DBGrid.SelectedRows.Count -1 do begin
      GotoBookMark(DBGrid.SelectedRows[Idx]);
      StrToCopy := StrToCopy +DBGrid.Columns[0].Field.AsString;
      for IdxCol := 1 to DBGrid.Columns.Count -1 do
        StrToCopy := Format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Field.AsString]);
      StrToCopy := StrToCopy + sLineBreak;
    end;
    ClipBoard.Clear;
    ClipBoard.SetTextBuf(PChar(StrToCopy));
    GotoBookMark(SavedBookMark);
    FreeBookMark(SavedBookMark);
    EnableControls;
  end;
end;




0 comentários:

Postar um comentário