| 
| 
 | Вопрос # 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): С Вадимей помощью Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |