Идёт загрузка страницы...

htp://aptem.net.ru





Копирование информации из DBGrid-а в Clipboard

Читатель советует:

Простая процедура копирования информации из DBGrid-а в Clipboard может существенно облегчить жизнь при реализации требований экспорта выборок данных во внешние приемники. Удобнее вызов "прицепить" к контекстному меню грида.

С уважением, Беличенко Б.


    unit UnGridToClb;

interface

Uses

Windows, SysUtils, Classes, Dialogs,
Grids, DBGrids, Db, DBTables, ClipBrd;



procedure CopyGRDToClb(dbg :TDBGrid);
//Копирует DBGrid в буфер обмена,
//после чего данные отлично переносятся
//как в простой текстовый редактор, так и в Excell

implementation
procedure
CopyGRDToClb(dbg :TDBGrid);
var
bm : TBookMark;
pch,pch1:  PChar;
s,s2 : string;
i,j : integer;

begin


s := '';
for j := 0 to dbg.Columns.Count-1 do
s := s + dbg.Columns.Items[j].Title.Caption +#9 ;
s := s + #13+#10;
if not dbg.DataSource.DataSet.active then
begin
ShowMessage('Нет выборки!!!');
Exit;
end;
try
dbg.Visible := False; //Делаем грид невидимым, чтобы не тратилось время
//на его перерисовку при прокрутке DataSet - просто и
//эффективно
bm := dbg.DataSource.DataSet.GetBookmark; // для того чтобы не
// потерять текущую запись
dbg.DataSource.DataSet.First;
while not dbg.DataSource.DataSet.EOF do
begin
s2 := '';
for j := 0 to dbg.Columns.Count-1 do
begin
s2 := s2 + dbg.Columns.Items[j].Field.AsString +#9;
end;
s := s + s2 + #13+#10;
dbg.DataSource.DataSet.Next;
end;
//Переключаем клавиатуру "в русский режим",
//иначе - проблемы с кодировкой
GetMem(pch,100);
GetMem(pch1,100);
GetKeyboardLayoutName(pch);
StrCopy(pch1,pch);
while pch <> '00000419' do
begin
ActivateKeyboardLayout(HKL_NEXT,0);
GetKeyboardLayoutName(pch);
if strComp(pch, pch1) = 0 then
//Круг замкнулся - нет такого языка '00000419'
StrCopy(pch,'00000419');
end;

clipboard.AsText := s; //Данные - в буфер!!!

//Возвращаем режим клавиатуры
while strComp(pch, pch1)<>0 do
begin
ActivateKeyboardLayout(HKL_NEXT,0);
GetKeyboardLayoutName(pch);
end;

FreeMem(pch);
FreeMem(pch1);

dbg.DataSource.DataSet.GotoBookmark( bm );
//ShowMessage('Данные успешно скопированы в буфер обмена.');
finally
dbg.Visible := True;
end;
end;


end.

Замечания:

Я привожу только сомнительную часть. Мои комментарии отмечены {AK:}


    //как в простой текстовый редактор, так и в Excell
{AK: Excel - с одной L на конце}

...

dbg.Visible := False;  // Делаем грид невидимым, чтобы не тратилось время
// на его перерисовку при прокрутке DataSet - просто и
// эффективно
{AK: Вот изврат, который сразу бросается в глаза. Для это предназначены методы EnableControls/DisableControls датасета!}
bm := dbg.DataSource.DataSet.GetBookmark; // для того чтобы не
// потерять текущую запись
{ АК: насколько я помню, сами борланоиды не рекомендовали пользоваться Get/SetBookmark и использовать вместо них свойство BookMark }

Удачи!
Алексей Коган

Примечание (В.О.): вот так советы превращаются в споры и дискуссии, а то и в форумы между читателями :-) [000887]