![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копировать из StringGrid [D7]
greengeneral © (2007-11-23 22:35:00)Мне надо скопирова данные со всех ячеек StringGrid в буфер обмена, не подскажете как это сделать.
GanibalLector (2007-11-24 00:04:00) [1]2 Зачем это городить?
А ты попробуй ;) Установи рус.язык, скопируй в буффер, открой тот же Excel (язык, предположим станет англ.) и вставь.
Amoeba (2007-11-23 23:50:00) [2]
Uses ...,clipbrd;
....
procedure CopyGrid(Grid: TStringGrid; Cut: boolean);
// при Cut = false происходит Copy, а при true Cut
var x, y: integer;
Buf: string;
begin
Buf := '';
with Grid,Grid.Selection do
begin
for y:=Top to Bottom do
begin
for x:=Left to Right do
begin
Buf := Buf + Cells[x, y];
if Cut then Cells[x, y] := '';
if x < Right then Buf := Buf+#9; //только если несколько в ширину
end;
if y < Bottom then Buf := Buf+#13+#10;
end;
end;
Buf:=Buf+#13+#10; //можно не делать,но по аналогии с Excel
Buf:=Buf+#0+#0;
Clipboard.AsText := Buf;
end;
Amoeba (2007-11-23 23:44:00) [3]
> GanibalLector © (23.11.07 23:22) [2]
Зачем это городить?
procedure SetClipBoard(Text: String);
var LName: array[0..KL_NAMELENGTH] of Char;
Bool:Boolean;
hglbCopy: THandle;
I: Cardinal;
const RUS='00000419';
begin
Bool:=False;
GetKeyboardLayoutName(LName);
if LName=RUS then Bool:=True else
LoadKeyboardLayout(RUS,KLF_ACTIVATE);
I:=Length(Text)+1;
OpenClipboard(0);
EmptyClipboard;
try
EmptyClipboard;
hglbCopy:=GlobalAlloc(GMEM_DDESHARE,I);
Move(PChar(Text)^,GlobalLock(hglbCopy)^,I);
GlobalUnlock(hglbCopy);
SetClipboardData(CF_TEXT, hglbCopy);
finally
CloseClipboard;
end;
if not Bool then LoadKeyboardLayout(LName,KLF_ACTIVATE);
end;
Это излишне. Убрать.
Подготовка строки (Buf) - нормально. Оставить.
Вместо
SetClipBoard(Buf);
Достаточно. Главное не забыть добавить clipbrd в Uses/
Clipboard.AsText := Buf;
И не надо в данной задаче писать лишний код (= procedure SetClipBoard).
Amoeba (2007-11-23 23:35:00) [4]
> В юните Clipbrd описан класс TClipboard. нужно создать объект
> этого типа
Создавать его как раз не надо, т.к. он создается автоматически. Читаем справку:
Do not instantiate separate TClipboard objects by calling the constructor. Instead, use the global instance of TClipboard returned by the Clipboard function. This allows applications to share a single instance of TClipboard and safeguards against accidental deletion of the clipboard. Before calling Clipboard, be sure the uses clause includes the Clipbrd unit.
GanibalLector (2007-11-23 23:22:00) [5]
procedure CopyGrid(Grid: TStringGrid; Cut: boolean);
//
procedure SetClipBoard(Text: String);
var LName: array[0..KL_NAMELENGTH] of Char;
Bool:Boolean;
hglbCopy: THandle;
I: Cardinal;
const RUS='00000419';
begin
Bool:=False;
GetKeyboardLayoutName(LName);
if LName=RUS then Bool:=True else
LoadKeyboardLayout(RUS,KLF_ACTIVATE);
I:=Length(Text)+1;
OpenClipboard(0);
EmptyClipboard;
try
EmptyClipboard;
hglbCopy:=GlobalAlloc(GMEM_DDESHARE,I);
Move(PChar(Text)^,GlobalLock(hglbCopy)^,I);
GlobalUnlock(hglbCopy);
SetClipboardData(CF_TEXT, hglbCopy);
finally
CloseClipboard;
end;
if not Bool then LoadKeyboardLayout(LName,KLF_ACTIVATE);
end;
//
// при Cut = false происходит Copy, а при true Cut
var x, y: integer;
Buf: string;
begin
Buf := '';
with Grid,Grid.Selection do
begin
for y:=Top to Bottom do
begin
for x:=Left to Right do
begin
Buf := Buf + Cells[x, y];
if Cut then Cells[x, y] := '';
if x < Right then Buf := Buf+#9; //только если несколько в ширину
end;
if y < Bottom then Buf := Buf+#13+#10;
end;
end;
Buf:=Buf+#13+#10; //можно не делать,но по аналогии с Excel
Buf:=Buf+#0+#0;
SetClipBoard(Buf);
end;
palva (2007-11-23 23:15:00) [6]Пробежаться по стринггриду и сформировать строку, которую хотите положить в буфер.
В юните Clipbrd описан класс TClipboard. нужно создать объект этого типа и его свойству AsText присвоить эту строку.