2009-05-12 2 views

ответ

0

В Word это может быть достигнуто путем добавления закладки в документ в начале макроса, который затем удаляется, когда макрос выполняется. При вызове Отмена проверяется наличие такой специальной закладки, и операция отмены повторяется до тех пор, пока специальная закладка не будет удалена из документа.

Я предполагаю, что аналогичный подход будет работать и с OpenOffice.org.

Для получения более подробной информации см. Can I create an undo transaction in Word or Excel? (VSTO).

+0

Спасибо, но это не работает :-( – cadrian

+0

В чем проблема? Я не уверен, было ли это ясно из моего ответа, но пример кода в соответствующем сообщении был для Microsoft Word. Основная идея должна работать в OOo, а также я предположим, хотя вам может потребоваться создать пользовательскую кнопку отмены, и, возможно, вам придется использовать какую-то другую функцию, кроме закладки, например, текст в специальной позиции в документе. –

+0

Проблема в том, что она не компилируется (неизвестный объект). Я попытался заменить приложение либо ThisDocument, либо StarDesktop, но он не был компилятором (неизвестная функция или свойство). – cadrian

0

Вы можете поговорить с UndoManager, вызвав enterUndoContext() в самом начале вашего макроса, а затем leaveUndoContext() в конце. Например:

Dim undo As Object 
undo = ThisComponent.UndoManager 
undo.enterUndoContext("MyAtomicTest") 
... 
[YOUR COMPLEX OPERATIONS HERE] 
... 
undo.leaveUndoContext 

Это создает атомную операцию отмены, которая представляется пользователю как «MyAtomicTest».

1

для тех из нас, кто предпочитает JavaScript, чтобы писать OOo макросы, здесь минимальный фрагмент кода, который должен работы (он проверял, но я выделил этот код из большего контекста):

importClass(Packages.com.sun.star.document.XUndoManager); 
importClass(Packages.com.sun.star.document.XUndoManagerSupplier); 
var doc   = XSCRIPTCONTEXT.getDocument(); 
var undo_manager = UnoRuntime.queryInterface(XUndoManagerSupplier, doc).getUndoManager(); 
undo_manager.enterUndoContext('your descriptive title here'); 
// get stuff done 
undo_manager.leaveUndoContext();