undo/redo в Word

Программирование на Visual Basic for Applications
Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

undo/redo в Word

Сообщение Talker » 07.05.2006 (Вс) 21:36

Делаю на VBA под Word программку по оформлению текста (удаление лишних пробелов, знаков, расстановка отступов и т.п.). Различные виды оформления доступны через специально созданную панель инструментов.
После применения к тексту какого-нибудь оформления в списке Undo появляется 5-6 строчек с командами VBA, нажимать 5-6 раз кнопку для отмены оформления не гумано. Что здесь можно сделать?
Первое, что мне пришло в голову - сделать свою кнопку Отмена и хранить где-нибудь (хотя бы в Parameter этой кнопки) последовательность колиичества операция по каждому примененного оформлению (из набора типа 5 6 10 5 выбираем последнее число и делаем откат на это число пераций). Но такая штука работает если все операции выполняются через мои макросы, а если просто вводится или правится текст, то в список Undo добавляются записи, которые в моем списке не учитываются.
Кто-нибудь занимался этим вопросом? Что с этим добром делать? Можно как-то перенастроить стандартный Undo (вообще в каком объекте он хранится?) или перехватывать все действия пользователя?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 3:21

Перехватывать все действия пользователя - это слишком непростая задача в свете VBA...

Есть мысль форматировать текст целиком в памяти, и потом одной командой вставлять его в документ... но это для простого текста и именно в плане правки самого текста. В плане оформления придётся тогда использовать временный документ, в нём форматировать и потом всё разом копировать обратно, тогда будет одна команда в Undo, но это криво и смотрится неприятно... Возможно, поможет application.sreenupdating, а возможно нет. Создавать из макроса новый объект word менее криво в визуальном плане, но более криво в плане скорости...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 9:47

GSerg
Как всё просто :D Спасибо!

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 14:44

Ещё один глупый вопрос - как скопировать текст с оформлением из временного документа в исходный? :?
Сделал это через Буфер обмена, работает, но как-то криво смотрится и в буфере обмена остается текст.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 15:16

Я ж говорю, и так криво, и так криво, только кривизна в разную сторону.
Ворд умеет так копировать, когда ctrl+мышью, но в объектной модели похоже нет этих методов. И при записи макроса мышь отключается.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 15:21

Удалить последнюю строчку из Буфера обмена нильзя?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 15:26

Можна.


ЗЫ. Вот яркий пример выдачи той информации, которая была запрошена, а не той, которая на самом деле нужна.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 15:41

Каким образом? :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 15:59

Это сложный вопрос!

Примерно http://bbs.vbstreets.ru/viewtopic.php?p=99963#99963
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 16:58

Прежде чем спрашивать я воспользовался поиском, нашел эту тему и попытался использовать EmptyClipboard - вообще ничего не произошло. Или я не туда смотрю?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 17:00

Там перечислены три функции, и надо использовать все три, в порядке их приведения...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 17:30

Мда, туплю :?
Последний вопрос - что передать в качестве параметра OpenClipboard?

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 17:33

Т.е. что передать я понял, а где мне это значение взять? :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 17:39

Пользуемся кнопкой Правка для добавления неожиданно пришедших мыслей.


Потом читаем справку и передаём 0.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 17:48

Clipboard очищается, но буфер обмена остается нетронутым. Или так задумано? :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2006 (Пн) 17:51

Перечитай приведённую выше ссылку... я в основном имел в виду приводимые там рассуждения, а не код...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 08.05.2006 (Пн) 17:59

Т.е. рабочего кода для этой задачи не существует? :D

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 09.05.2006 (Вт) 12:19

Ещё одна трабла. Текст в памяти формировал в новой копии класса ThisDocument, а в 97 и 2000 такого класса нет :( Просто Document открывает новый документ, что не есть good. Что тут можно сделать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.05.2006 (Вт) 12:25

Thisdocument всегда есть. И всегда ссылается на документ, в котором расположен выполняемый код.
Просто document - правильно, я же говорил, смотрится неприятно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 09.05.2006 (Вт) 14:00

Тьфу, опять я замудрил :) Работает эта фишка и в 97, и в 2000, и в 2003. Жалко что с буфером ничего нельзя сделать :(

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 09.05.2006 (Вт) 16:25

В продолжение темы о буфере обмена. Эффект, аналогичный использованию библиотечных функций дает код

Код: Выделить всё
Dim MyData As DataObject
Set MyData = New DataObject
MyData.SetText ""
MyData.PutInClipboard


Жаль, что мою задачу этот код не решает :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.05.2006 (Вт) 22:09

У офиса XP/2003 свой собственный буфер, с ним надо работать через методы офиса.
Lasciate ogni speranza, voi ch'entrate.

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 09.05.2006 (Вт) 22:17

alibek
Какие именно, если не секрет?

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 10.05.2006 (Ср) 21:13

GSerg
Не знаете, какой более простой класс можно использовать вместо ThisDocument? А то на больши строках тормоза заметные получаются :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.05.2006 (Чт) 15:58

Вопрос неясен.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 12.05.2006 (Пт) 11:25

В начале процедуры я перекидываю значение из текущего параграфа в ThisDocument

Код: Выделить всё
Set S = Selection.Paragraphs.First.Range
Set d = ThisDocument

S.Copy
d.Paragraphs.First.Range.Select
d.Paragraphs.First.Range.Paste

далее делаю обработку d.Paragraphs.First.Range и в конце перекидываю всё обратно

Код: Выделить всё
d.Paragraphs.First.Range.Select
d.Paragraphs.First.Range.Cut
S.Select
S.Paste

Полагаю, что немного перемудрил, потому что из-за обращения к ThisDocument происходят заметные тормоза. Что здесь можно улучшить? В какой объект кроме ThisDocument и Document можно таким вот образом передать текст (с оформлением) на обработку?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.05.2006 (Пт) 13:49

Ни в какой, разумеется.
Только select не надо делать.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 12.05.2006 (Пт) 13:53

GSerg писал(а):Только select не надо делать.

А как без этого делать замену текста? :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.05.2006 (Пт) 14:11

Методами range (то есть так, как это делаешь ты сейчас).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Talker
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 07.05.2006 (Вс) 21:17

Сообщение Talker » 12.05.2006 (Пт) 14:16

Спасибо :D


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

    TopList