Простая процедура копирования информации из 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 dos := s + dbg.Columns.Items[j].Title.Caption +#9 ;s := s + #13+#10;if not dbg.DataSource.DataSet.active thenbeginShowMessage('Нет выборки!!!');Exit;end;trydbg.Visible := False; //Делаем грид невидимым, чтобы не тратилось время//на его перерисовку при прокрутке DataSet - просто и//эффективноbm := dbg.DataSource.DataSet.GetBookmark; // для того чтобы не// потерять текущую записьdbg.DataSource.DataSet.First;while not dbg.DataSource.DataSet.EOF dobegins2 := '';for j := 0 to dbg.Columns.Count-1 dobegins2 := 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' dobeginActivateKeyboardLayout(HKL_NEXT,0);GetKeyboardLayoutName(pch);if strComp(pch, pch1) = 0 then//Круг замкнулся - нет такого языка '00000419'StrCopy(pch,'00000419');end; clipboard.AsText := s; //Данные - в буфер!!! //Возвращаем режим клавиатуры while strComp(pch, pch1)<>0 dobeginActivateKeyboardLayout(HKL_NEXT,0);GetKeyboardLayoutName(pch);end; FreeMem(pch);FreeMem(pch1); dbg.DataSource.DataSet.GotoBookmark( bm );//ShowMessage('Данные успешно скопированы в буфер обмена.');finallydbg.Visible := True;end;end; end. |
//как в простой текстовый редактор, так и в Excell {AK: Excel - с одной L на конце} ... dbg.Visible := False; // Делаем грид невидимым, чтобы не тратилось время // на его перерисовку при прокрутке DataSet - просто и// эффективно{AK: Вот изврат, который сразу бросается в глаза. Для это предназначены методы EnableControls/DisableControls датасета!} bm := dbg.DataSource.DataSet.GetBookmark; // для того чтобы не // потерять текущую запись{ АК: насколько я помню, сами борланоиды не рекомендовали пользоваться Get/SetBookmark и использовать вместо них свойство BookMark } |