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;
Pergunta
Micheus
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.
Exemplo de utilização no seu Form: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.