Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

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

Dron (статус: Студент), 14 марта 2009, 15:22 [#5]:

Учёный, о чём вы вообще говорите? Таких функций в природе не существует. Есть только методы с такими названиями у некоторых компонент, например у TEdit. Поясните, что именно за способ предлагаете.
С уважением.

13 мая 2013, 14:15: Статус вопроса изменён на решённый (изменил модератор DNK): С Вадимей помощью

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.