- 01: 名前:ど素人投稿日:2004/10/08(金) 18:28
- シェイプのデリートイベントを拾って、特定の処理を行っています。
イベントは、AddAdviseメソッドを使って追加しました。
途中でシェイプをデリートしたくない場合があったため、EventSink
クラスのVisEventProcメソッドの戻り値をfalseにしました。
ですが、シェイプはそのまま削除されてしまいます。
デリートのクエリをキャンセルする方法はないでしょうか?
宜しくお願いしまっす・・・;;
- 03: 名前:ど素人投稿日:2004/10/08(金) 22:19
- レスありがとうございます!
BeforeShapeDeleteのイベントを拾って、
VisEventProcの中で処理を行っています。
シェイプを回復する手段としてUndo()メソッドを使用したのですが、
例外が発生してしまいました。
[図面1 - Microsoft Visio]
Message :
例外が発生しました。
at Microsoft.Office.Interop.Visio.IVApplication.Undo()
VisEventProcの中でUndo()メソッドを実行するのはうまくいかないのでしょうか?
ちなみに、コードは以下のようにかきました。C#ですが・・・
※applicationは、VisioのApplicationオブジェクトへの参照です。
// イベントが発生しないようにする
application.EventsEnabled = (short)0;
// Undoコマンド実行
application.Undo();
// イベントの発生を元に戻す
application.EventsEnabled = (short)1;
↑Undo()でAddShapeのイベントが走ると思い、
EventsEnabledを上下にはさみました。
っていうか、シェイプのデリートが完了されないのに、
Undoしても意味ないような気がしてきました・・・
BeforeShapeDeleteはシェイプが削除される前ですよねぇ・・・
yodaさんのおっしゃる「シェイプを回復する」方法には
どのようなものがあるでしょうか?
新しくシェイプをドロップするしかないでしょうか〜
なぜUndo()が実行できないのかも謎です・・・
- 04: 名前:yoda投稿日:2004/10/08(金) 22:48
- なるほど、undoとは考えましたね、
わたしは、
before deleteの時点で、
activewindow.selection.....で、
消去前のシェイプの座標を取得し、
コピーを作っておき、
消去しないなら、
元の場所に貼り付ければ、
よいのかなと、思っていました。
- 05: 名前:yoda投稿日:2004/10/09(土) 02:45
- そういえば、昔ここで、
undo redoの使い方を
教わりました。
過去ログが見つからない
し、使い方も覚えていない
のですが、以下の通りです。
Option Explicit
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Sub ExecUndo()
Dim hWnd As Long
hWnd = Visio.Application.WindowHandle32
Call PostMessage(hWnd, &H111, &H3F9, hWnd)
End Sub
Public Sub ExecRedo()
Dim hWnd As Long
hWnd = Visio.Application.WindowHandle32
Call PostMessage(hWnd, &H111, &H3FA, hWnd)
End Sub
- 06: 名前:あひゃ投稿日:2004/10/13(水) 01:35
- 返事が遅れてすいません。
貴重な情報をありがとうございます!
まだ試してないのですが、今週中には試してみようと思います。^^
しかし、Undoするだけでこんなややこしいとわ・・・
- 07: 名前:名無しさん投稿日:2004/10/26(火) 13:26
- >BeforeShapeDeleteはシェイプが削除される前ですよねぇ・・・
>yodaさんのおっしゃる「シェイプを回復する」方法には
>どのようなものがあるでしょうか?
BeforeShapeDeleteのCase分の中で、図面を保存してしまえば、
Shapeをdeleteする前の状態を確保できます。
そしてこの図面を、再びopenすれば、deleteする前の
状態が、回復できると思います。
- 08: 名前:名無しさん投稿日:2004/10/26(火) 13:58
- 図面を保存するには、ThisDocumentに、
以下のようにしておけば、よいと思います。
Private WithEvents pge As Visio.Page
Private Sub Document_DocumentOpened(ByVal doc As IVDocument)
Set pge = ActivePage
End Sub
Private Sub pge_BeforeShapeDelete(ByVal Shape As IVShape)
MsgBox Shape & "が削除されます!"
ThisDocument.Save
End Sub
- 09: 名前:yoda投稿日:2004/10/26(火) 21:04
- undo, beginundoscope,endundoscope
を使って、deleteしたシェイプを回復する
マクロのサンプルを作りましたので、
アップロードしました。解凍して、
ファイルを開き、シェイプを消すと、
回復します。ここです。
http://www.mster.co.jp/visiosquare/cgi-bin/upload/image/096.lzh [source] [check]
- 10: 名前:yoda投稿日:2004/10/27(水) 09:45
- 096.lzhは、複数のシェイプを削除したときの表示が
悪かったので、改善しました。
http://www.mster.co.jp/visiosquare/cgi-bin/upload/image/097.lzh [source] [check]
- 11: 名前:yoda投稿日:2005/05/18(水) 06:26
- 簡単な方法を教えてもらいました。
MS の "Discussions in visio.developer.vba"の"Cancel Delete"(5/16/2005)
で、urlは、
http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.visio.developer.vba&lang=en&cr=US [source] [check]
マクロはこんなに簡単です。これです。
Private Function Document_QueryCancelSelectionDelete(ByVal Selection As IVSelection) As Boolean
Document_QueryCancelSelectionDelete = True
End Function
■トップに戻る リロード 全レスを表示
|