|
Вопрос # 2 520/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
Как воспользоваться буфером для передачи (копирования) информации из приложения Delphi (например, из StringGrid) в документ Word или книгу Exel? Я работаю в Windows XP.
 |
Вопрос задал: Цыцарев Вадим Николаевич (статус: Посетитель)
Вопрос отправлен: 14 марта 2009, 13:38
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Ученый
Здравствуйте, Цыцарев Вадим Николаевич! Две функции:
CopyToClipboard
PasteFromClipboard;
Объяснять их назначение думаю не стоит.... можно попыться с помощью них...
Хотя у многих компонентов Delphi есть свои методы копирование в буфер обмена....
 |
Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 14 марта 2009, 13:43
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Цыцарев Вадим Николаевич!
Почему не работает Crtl+C для StringGrid? Все очень просто - Windows и/или Делфи не знают, как правильно скопировать в буфер его содержимое. Они просто не знают. По этому нужно написать небольшую процедуру-посредник. А также сделать обманку для Ctrl+C.
Начнем с второго, это просто проще. Что бы Ваш компонент мог реагировать на Ctrl+C, находим у него событие OnKeyDown и вписываем туда такой код
if (ssCtrl in Shift) and (key = ord('C')) then begin
//....
end;
Вместо точек можно вписывать свой код и вуаля, наш компонент может адекватно реагировать на нажатие Crtl+c.
Аналогичным способом можно обучить и другим клавишам. Каким пожелаете. В разумных пределах, конечно.
Теперь займемся более весёлой частью - передать в буфер обмена данные.
Если надо просто положить туда строку, это делается так
в свисок uses надо добавить Clipbrd. Теперь у нас появиться объект Clipboard. И запись произвольной строки в буфер обмена - просто Clipboard.AsText:= 'Some text';
То есть, наша задача сводиться к тому, что бы посмотреть, что находиться в StringGrid, собрать с этого строку и отправить в буфер. В случае с Excel хочется, что бы каждая ячейка попала в отдельную ячейку, не так ли? Для этого копируем таким образом
s := '';
for i := 1 to 5 do begin
for j := 1 to 5 do
s := s + StringGrid1.Cells[j,i] + #9;
s:= s+#13#10;
end;
Clipboard.AsText:= s;
Дообъявить переменные думаю сможете сами. И диапазон попровить, то есть, вместо 5 написать StringGrid1.ColCount и так дальше (может вы хотите копировать текущую ячейку и пару соседних - я не знаю, но свойства Col и Row, которые дают координаты текущей выделенной ячейки помогут Вам).
#9 - это специальная форма записи, она равнозначна chr(9) и обозначает символ с кодом 9 - то есть обычный Tab, #13#10 - это перевод строки - кнопка Enter по современному.
И если после этого в экселе нажать Ctrl+V, то он удачно это дело разпарсит и разложит по ячейкам.
Но вот с вордом проблема. Он таблицей это дело не оформит, хотя числа столбиками и будут расположены.
Здесь есть такие варианты - сделать картинкой - ClipBoard умеет принимать картинки.
Я в свое время делал ещё хитрее. Ставил на форму RichEdit, делал его невидимым, в нем формировал нужный текст (при этом можно оформить и форматирование, и много другого). И копировал его методами в буфер обмена.
Но при больших объемах текста этот способ медленный. И сделать таблицу сложновато. Поэтому можно пойти ещё интереснее. Формировать данные в виде html кода. Вот только буферу обмена надо объяснить, что это не просто обычный текст. Но это уже отдельная история:)
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 марта 2009, 17:34
Оценка за ответ: 5
Комментарий к оценке: Спасибо за обстоятельный ответ!
С Вашей помощью я решил свою проблему!
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 14 марта 2009, 15:22; участников в обсуждении: 3.
|
Dron (статус: Студент), 14 марта 2009, 13:54 [#1]:
Цитата (Ученый):
Ответ #1. Отвечает эксперт: Ученый
По-моему ответ вообще не в тему...
С уважением.
|
|
Цыцарев Вадим Николаевич (статус: Посетитель), 14 марта 2009, 14:46 [#2]:
То есть получается, что мне нужно где-то в исходнике использовать эти функции, а затем организовать вызов этих функций в режиме исполнения программы?
|
|
Ученый (статус: 8-ой класс), 14 марта 2009, 15:03 [#3]:
Цыцарев Вадим Николаевич, CopyToClipboard копирует в буфер обмена, PasteFromClipboard вставляет из буфера обмена.... если вам надо через буфер скопировать скажем выделенный текст в StringGrid а потом вставить в открытый документ Word именно с помощью бубура обмена то можно помудорствовать с этими функциями....
Но если вам просто надо сохранить содержимое StringGrid в документ Word или в книгу Exel то буфер тут не причем.....надо копать в сторону работы с MS Word и MS Exel...для этого посмтрите вот это и это.
Просто путанница из-за того что вы сказали именно через буфер.....
|
|
Цыцарев Вадим Николаевич (статус: Посетитель), 14 марта 2009, 15:16 [#4]:
Мне нужно просто в моем работающем приложении Delphi выделить часть информации в StrigGrid и скопировать ее в буфер. Затем взять эту информацию из буфера и поместить в документWord.
Дело в том, что выделенная в StringGrid информация из моего приложения не попадает в буфер стандартными действиями Windows (Ctr+C).
|
|
Dron (статус: Студент), 14 марта 2009, 15:22 [#5]:
Учёный, о чём вы вообще говорите? Таких функций в природе не существует. Есть только методы с такими названиями у некоторых компонент, например у TEdit. Поясните, что именно за способ предлагаете.
С уважением.
|
13 мая 2013, 14:15: Статус вопроса изменён на решённый (изменил модератор DNK): С Вадимей помощью
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|