Ir para conteúdo
Fórum Script Brasil
  • 0

Adicionando Função Copiar Dados De Um Dbgrid Em Sua Aplicação


Micheus

Pergunta

Para quem precisar, estou compartilhando aqui duas funções a serem utilizadas para implementação da função Copiar do DBGrid para o ClipBoard, viabilizando a colagem em documentos como Word e Excel (uma delas eu já havia colocado em resposta a um post).

Como o texto é formatado com a introdução do caracter de tabulação (#9), torna-se fácil a formatação do documento no Word e até mesmo sua conversão para tabela.

São duas as funções:

1) FullDBGridToClipBoard - copia todas as linhas para o clipboard;

2) SelDBGridToClipBoard - copia as linhas selecionadas (neste caso a propriedade Options do DBGrid deve ter dgMultiSelect habilidata) para o clipboard;

O parâmetro PastHeader determina se o nome das colunas será ou não exportado.

Obs: Faz-se necessário adicionar a unit Clipbrd na cláusula uses da unit aonde o código for colocado.

procedure FullDBGridToClipBoard(DBGrid :TDBGrid; PastHeader :Boolean);
var
  StrToCopy :string;
  Idx,
  IdxCol :Integer;
  BookMark,
  SavedBookMark :TBookMark;
begin
  StrToCopy := '';
  if PastHeader then// se for para colar o nome das colunas...
  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 +#13#10;
  end;
  with DBGrid.DataSource.DataSet do  // utilizaremos o dataset do DBGrid - evidente...
  begin
    SavedBookMark := GetBookmark;  // salvamos a posição atual do cursor - linha selecionada no DBGrid
    DisableControls;  // evitamos que a movimentação no dataset provoque o scroll do DBGrid
    First;  // posicionamos no primeiro registro do dataset
    while not EOF do  // varremos todas as linhas no DBGrid
    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 +#13#10;
      Next;  // processando próxima linha...
    end;
    ClipBoard.Clear;  // limpamos o ClipBoard
    ClipBoard.SetTextBuf(PAnsiChar(StrToCopy));  // Copiamos o texto montado para o ClipBoard
    GotoBookMark(SavedBookMark);  // reposicionamos o cursor na linha em que estava antes do processo
    FreeBookMark(SavedBookMark);  // liberamos a memória alocada pelo BookMark
    EnableControls;
  end;
end;
procedure SelDBGridToClipBoard(DBGrid :TDBGrid; PastHeader :Boolean);
var
  StrToCopy :string;
  Idx,
  IdxCol :Integer;
  BookMark,
  SavedBookMark :TBookMark;
begin
  if DBGrid.SelectedRows.Count = 0 then // só processamos algo se houver linhas selecionadas
    Exit;
  StrToCopy := '';
  if PastHeader then// se for para colar o nome das colunas...
  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 +#13#10;
  end;
  with DBGrid.DataSource.DataSet do  // utilizaremos o dataset do DBGrid - evidente...
  begin
    SavedBookMark := GetBookmark;  // salvamos a posição atual do cursor - linha selecionada no DBGrid
    DisableControls;  // evitamos que a movimentação no dataset provoque o scroll do DBGrid
    for Idx := 0 to DBGrid.SelectedRows.Count -1 do // percorreremos todas as linhas selecionadas
    begin
      GotoBookMark(Pointer(DBGrid.SelectedRows[Idx])); // posicionando na linha a ser exportada
      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 +#13#10;
    end;
    ClipBoard.Clear;  // limpamos o ClipBoard
    ClipBoard.SetTextBuf(PAnsiChar(StrToCopy));  // Copiamos o texto montado para o ClipBoard
    GotoBookMark(SavedBookMark);  // reposicionamos o cursor na linha em que estava antes do processo
    FreeBookMark(SavedBookMark);  // liberamos a memória alocada pelo BookMark
    EnableControls;
  end;
end;
Exemplo de utilização no seu Form:
procedure TForm1.btnCopyFromDBGridClick(Sender: TObject);
begin
  FullDBGridToClipBoard(DBGrid1, True);
// ou
  SelDBGridToClipBoard(DBGrid1, True);
end;

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...