- ベストアンサー
.net 次のプロシージャ 前のプロシージャ
VB6の時、Ctrl+↑ または Ctrl+↓ でプロシージャ間の移動が出来ましたが、.netだとどうすればよいですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1のtodo36さんが言われるように無いと思います。 本題から外れるかもしれませんが、作る事はできます。 私も.NETを利用するようになって、大変不便さを覚え、マクロを作成しました。 ※マクロ関連のウィンドウ表示方法説明 ALT+F11:マクロIDE ALT+F8:マクロエクスプローラ でマクロ関連のウィンドウ操作ができます。 マクロエクスプローラでは、右クリックなども併用します。 ※マクロのキー割り当て ツール⇒オプション⇒環境⇒キーボード でマクロを割り当てればいいです。 私の場合は、「ALT+↑」/「ALT+↓」に割り当てています。 バグがあるとは思いますが、無いよりはマシだと思うので、個人ツールですが公開いたします。 Option Compare Binary Option Explicit On Option Strict On Imports EnvDTE Imports System.Diagnostics Public Module Module1 #Region "属性" #Region "属性_PUBLIC" #End Region #Region "属性_PPRIVATE" Private Enum プロシージャ移動 移動_PREV 移動_NEXT End Enum #End Region #End Region #Region "メソッド" #Region "メソッド_PUBLIC" Public Sub PrevOfFunction() Call 内部マクロ_モジュール移動(プロシージャ移動.移動_PREV) End Sub Public Sub NextOfFunction() Call 内部マクロ_モジュール移動(プロシージャ移動.移動_NEXT) End Sub #End Region #Region "メソッド_PRIVATE" #Region "内部マクロ_モジュール移動" Private Sub 内部マクロ_モジュール移動(ByVal p_プロシージャ移動 As プロシージャ移動) Dim l_col要素 As Collection Dim l_ceコード要素 As CodeElement Dim l_docドキュメント As Document Dim l_tpt移動先 As TextPoint Dim l_Index As Integer If Not 内部マクロ_取得_コード要素(l_docドキュメント, l_col要素) Then Exit Sub End If Dim l_ts選択テキスト As TextSelection = CType(l_docドキュメント.Selection, TextSelection) Select Case p_プロシージャ移動 Case プロシージャ移動.移動_PREV For l_Index = l_col要素.Count To 1 Step -1 l_ceコード要素 = CType(l_col要素.Item(l_Index), CodeElement) If (l_ceコード要素.StartPoint.Line < l_ts選択テキスト.ActivePoint.Line) Then l_tpt移動先 = l_ceコード要素.StartPoint Exit For End If Next If (l_tpt移動先 Is Nothing) Then l_tpt移動先 = l_ts選択テキスト.Parent.StartPoint End If Case プロシージャ移動.移動_NEXT For l_Index = 1 To l_col要素.Count Step 1 l_ceコード要素 = CType(l_col要素.Item(l_Index), CodeElement) If (l_ceコード要素.StartPoint.Line > l_ts選択テキスト.ActivePoint.Line) Then l_tpt移動先 = l_ceコード要素.StartPoint Exit For End If Next If (l_tpt移動先 Is Nothing) Then l_tpt移動先 = l_ts選択テキスト.Parent.EndPoint End If End Select l_ts選択テキスト.MoveToPoint(l_tpt移動先) End Sub #End Region #Region "内部マクロ_取得_コード要素" Private Function 内部マクロ_取得_コード要素( _ ByRef p_docドキュメント As Document _ , ByRef p_col要素 As Collection _ ) As Boolean Dim l_blnRet As Boolean = False Dim l_ces構成体 As CodeElements = Nothing Dim l_ce構成体要素 As CodeElement = Nothing Dim l_cdtpコード As CodeType = Nothing Dim l_ceコード要素 As CodeElement = Nothing Dim l_col要素 As Collection = New Collection() If Not 内部マクロ_取得_コード構成体(p_docドキュメント, l_ces構成体) Then GoTo PGMEND End If For Each l_ce構成体要素 In l_ces構成体 l_cdtpコード = CType(l_ce構成体要素, CodeType) For Each l_ceコード要素 In l_cdtpコード.Members l_col要素.Add(l_ceコード要素) Next Next p_col要素 = l_col要素 l_blnRet = True PGMEND: Return l_blnRet End Function #End Region #Region "内部マクロ_取得_コード構成体" Private Function 内部マクロ_取得_コード構成体( _ ByRef p_docドキュメント As Document _ , ByRef p_ces構成体 As CodeElements _ ) As Boolean Dim l_fcmソース As FileCodeModel p_ces構成体 = Nothing p_docドキュメント = DTE.ActiveDocument If (p_docドキュメント Is Nothing) Then GoTo PGMEND End If If (p_docドキュメント.ProjectItem.FileCodeModel Is Nothing) Then GoTo PGMEND End If p_ces構成体 = p_docドキュメント.ProjectItem.FileCodeModel.CodeElements PGMEND: Return Not (p_ces構成体 Is Nothing) End Function #End Region #End Region #End Region End Module ※ちなみに .NET標準のマクロの中に Samples.VSEditor.BeginningOfFunction というサンプルマクロがあります。 私のサンプルは、遅い処理なので、このままサンプルを利用するという手もあります。 もし改造する場合は、下のURLが参考になるかもしれません。 http://www.codeproject.com/macro/findfunction.asp?df=100&forumid=3991&exp=0&select=548105
その他の回答 (1)
- todo36
- ベストアンサー率58% (728/1234)
お礼
マクロという手があったんですね。 ありがとうございました。とても助かりました。