Удаление фигуры в PowerPoint программно и отмена приводит к потере формы

(Кажется, в основном это проблема, связанная с PowerPoint 2007, которую я не могу легко воспроизвести в PPT 2010)

Простой способ воспроизвести локально:

1) Insert a shape into blank slide
2) Run command: ActivePresentation.Slides(1).Shapes(1).Delete in immediate window in Visual Studio. (You can alternatively delete through C#)
3) Undo the deletion in the PowerPoint presentation (do this non-programatically)

По какой-то причине вы не можете снова получить доступ к фигуре, используя такие вызовы:

ActivePresentation.Slides(1).Shapes(1) //Does not allow any methods/properties to work

Единственное, что я получил удаленно, это то, что через Selection.ShapeRange вы можете получить ссылку на элемент, но большинство свойств/методов выдают ComExceptions при попытке использовать этот объект.

Кто-нибудь знает, как я могу восстановить форму или как-то обновить презентацию, чтобы получить чистые объекты Com?


person Shark    schedule 30.04.2012    source источник
comment
У меня сейчас нет под рукой 2007 для тестирования, но первоначальный релиз был беспорядок с точки зрения автоматизации. Серия пакетов обновления исправила одни проблемы и добавила другие. SP3 кажется лучшим выбором; если бы вы не применили это, я бы сделал это и рассмотрю возможность отказа от поддержки какой-либо версии PPT 2007, к которой не был применен хотя бы SP1.   -  person Steve Rindsberg    schedule 01.05.2012
comment
Хм, я не уверен, что такой отказ возможен. Я имею дело с разнообразной пользовательской базой, у которой могут быть разные версии ОС, разные офисные версии и т. д. Попытка применить SP для некоторых пользователей, вероятно, невозможна.   -  person Shark    schedule 02.05.2012
comment
На ваше усмотрение, конечно, но пред-SP1 PPT 2007 это просто беда.   -  person Steve Rindsberg    schedule 03.05.2012
comment
Я только что проверил, и эта проблема также возникает на PPT 2007 SP3, который стоит на моей машине.   -  person Shark    schedule 08.05.2012
comment
Я не уверен, что это приведет к обходному пути, но что, если вы сохраните, а затем снова откроете презентацию, прежде чем пытаться получить ссылку на ранее удаленную/восстановленную фигуру? Или (возможно, более полезно) скопировать все на слайде, удалить, а затем вставить обратно. Заметьте, я ничего не сказал о том, что это красиво. ;-)   -  person Steve Rindsberg    schedule 08.05.2012
comment
Я только что столкнулся с похожей проблемой в PPT 2010 (14.0.7015.1000, 32-разрядная версия). У меня было несколько ссылок на форму, которую я удалил программно. После отмены удаления все мои ссылки на (не)удаленный объект показали множество недопустимых свойств (как и в случае с OP). Однако установка всех этих ссылок на ничто при (сразу после) удаления объекта решила проблему. Теперь я могу отменить, и объект и все его свойства доступны.   -  person Skovly    schedule 12.04.2015


Ответы (3)


Я могу подтвердить в Ppt2007 SP3. Попробуйте в качестве обходного пути .cut и .paste. После этого я смог получить доступ к другим методам/свойствам. - ура, www.MSO-dlx.com

ActivePresentation.Slides(1).Shapes(1).Delete
Application.CommandBars.ExecuteMso "Undo" 'or manually Undo
ActiveWindow.Selection.SlideRange(1).Shapes(1).Cut 
ActiveWindow.Selection.SlideRange(1).Shapes.Paste
ActiveWindow.Selection.SlideRange(1).Shapes(1).TextFrame.TextRange.Text = "ABC"
person www.MSO-dlx.com    schedule 24.10.2013

Итак, я могу подтвердить, что это проблема; даже в 2010 году и нашел "более дешевую" альтернативу:

Public Sub arf()

Dim arf As Slide
Dim shape As shape
Dim shapes As shapes

Set shapes = ActivePresentation.Slides(1).shapes
Set shape = shapes(2)
shape.Select

shape.Delete
Application.CommandBars.ExecuteMso "Undo"
MsgBox ("shape: " & shape.Name & ",Type: " & shape.Type)

Set shapes = ActivePresentation.Slides(1).shapes
Set shape = Nothing
Set shape = shapes(2)

' Cut and paste makes this work, but not required...
'shape.Select
'shape.Cut
'shapes.Paste

'Set shape = Nothing
'Set shape = shapes(2)

Set arf = shape.Parent
MsgBox ("slide: " & arf.Name)

End Sub
person sharkTwo    schedule 16.01.2014

Только что я успешно решил проблему, поделитесь веб-страницей, которая очень помогла: https://www.add-in-express.com/creating-addins-blog/2014/06/24/exception-hresult-0x800a01a8/

Критической точкой является освобождение объекта после его удаления, что точно так же, как это сделали Skovly и sharkTwo. Однако я не знаю, как это сделать с помощью C #, и ссылка дала мне ответ.

Marshal.ReleaseComObject(titleShape); titleShape = null;

Именно так.

person Sucre Lau    schedule 24.07.2016