2017年05月 / 04月≪ 12345678910111213141516171819202122232425262728293031≫06月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2008.05.13 (Tue)

参照されていないメソッドを探すマクロその2

前回の「参照されていないメソッドを探すマクロ」の検索結果表示方法を変更しただけのもの。
今回は検索して見つかったメソッド名を再度検索処理して「検索結果1」ウィンドウに無理やり出力させてます。

Sub SearchAllFunctionReference()
Dim textSelection As EnvDTE.TextSelection
Dim codeElement As EnvDTE.CodeElement
Dim codeElements As EnvDTE.CodeElements
Dim classElement As EnvDTE.CodeElement
Dim codeModel As EnvDTE.FileCodeModel = DTE.ActiveDocument.ProjectItem.FileCodeModel
Dim i, j, k As Integer
Dim existcount As Integer
Dim namelist(0) As String

existcount = 0

For i = 1 To codeModel.CodeElements.Count
codeElement = codeModel.CodeElements.Item(i)
If codeElement.Kind = vsCMElement.vsCMElementNamespace Then
'クラスを取得
Dim classElements = codeElement.Children()

For j = 1 To codeElement.Children().Count
If codeElement.Children().Item(j).Kind = vsCMElement.vsCMElementClass Then
classElement = codeElement.Children().Item(j)
For k = 1 To classElement.Children.Count
If classElement.Children().Item(k).Kind = vsCMElement.vsCMElementFunction Then
'参照の検索
Dim cnt As Integer
cnt = SearchReference(classElement.Children().Item(k))
If cnt <= 1 Then
ReDim Preserve namelist(existcount)
namelist(existcount) = classElement.Children().Item(k).Name
existcount += 1
End If
End If
Next
End If
Next
End If
Next

If existcount > 1 Then
MsgBox(String.Format("参照されていないメソッドが {0}個見つかりました", existcount))

'検索結果1ウィンドウに出力
Dim find1win As Window
Dim sel As TextSelection

find1win = DTE.Windows.Item(Constants.vsWindowKindFindResults1)
sel = find1win.Selection

DTE.Find.FindWhat = "(" & Join(namelist, "|") & ")"
DTE.Find.MatchCase = True '大文字小文字一致
DTE.Find.MatchWholeWord = True '完全に一致する単語
DTE.Find.MatchInHiddenText = True '非表示のも
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr '正規表現
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1 '検索結果表示ウィンドウ?
DTE.Find.Action = vsFindAction.vsFindActionFindAll 'すべて検索
Else
MsgBox("参照されていないメソッドは見つかりませんでした。")
End If

End Sub
Function SearchReference(ByVal codeElement As EnvDTE.CodeElement) As Integer
Dim textSelection As EnvDTE.TextSelection
Dim resultcount As Integer
Dim rescaption As String

Dim regex As New System.Text.RegularExpressions.Regex(" - [0-9]+")

textSelection = DTE.ActiveDocument.Selection
Try
If Not (codeElement Is Nothing) Then
textSelection.MoveToPoint(codeElement.GetStartPoint(vsCMPart.vsCMPartHeader))
'エレメント名選択
textSelection.FindText(codeElement.Name, vsFindOptions.vsFindOptionsMatchCase)
'すべての参照の検索を実行
DTE.ActiveDocument.Activate()
DTE.ExecuteCommand("Edit.FindAllReferences")
rescaption = DTE.Windows.Item(Constants.vsWindowKindFindSymbolResults).Caption

'検索結果ウィンドウのタイトルから件数を取得
resultcount = CType(regex.Match(rescaption).Value.Substring(3), Integer)

Return resultcount

End If
Catch ex As Exception
End Try

End Function


出力部分を変えただけなので相変わらずごっちゃのままですがとりあえず使えます。
VBだと配列の宣言時に指定するのは要素数じゃなくて最大インデックス値なのな。
スポンサーサイト


 |  11:29  |  プログラム全般  |  トラックバック(0)  |  コメント(0)  |  Top↑

2008.04.16 (Wed)

参照されていないメソッドを探すマクロ

VisualStudio2005のC#.NETでコードを書いてるとき、
「どこからも参照されない変数」の場合はエラーなり警告で表示されてわかりやすい。
しかし「どこからも参照されないメソッド」は特に何も出ない。
設定で警告にしたり出来るんじゃないかと思ったけど出来ず、仕方がないので
VisualStudioマクロで探すことにしました。


Sub SearchAllFunctionReference()
    Dim textSelection As EnvDTE.TextSelection
    Dim codeElement As EnvDTE.CodeElement
    Dim codeElements As EnvDTE.CodeElements
    Dim classElement As EnvDTE.CodeElement
    Dim codeModel As EnvDTE.FileCodeModel = DTE.ActiveDocument.ProjectItem.FileCodeModel
    Dim i, j, k As Integer

    For i = 1 To codeModel.CodeElements.Count
        codeElement = codeModel.CodeElements.Item(i)
        If codeElement.Kind = vsCMElement.vsCMElementNamespace Then
            'クラスを取得
            Dim classElements = codeElement.Children()

            For j = 1 To codeElement.Children().Count
                If codeElement.Children().Item(j).Kind = vsCMElement.vsCMElementClass Then
                    classElement = codeElement.Children().Item(j)
                    For k = 1 To classElement.Children.Count
                        If classElement.Children().Item(k).Kind = vsCMElement.vsCMElementFunction Then
                            '参照の検索
                            Dim cnt As Integer
                            cnt = SearchReference(classElement.Children().Item(k))
                            If cnt <= 1 Then MsgBox(classElement.Children().Item(k).Name)
                        End If
                    Next
                End If
            Next
        End If
    Next

End Sub
Function SearchReference(ByVal codeElement As EnvDTE.CodeElement) As Integer
    Dim textSelection As EnvDTE.TextSelection
    Dim resultcount As Integer
    Dim rescaption As String

    Dim regex As New System.Text.RegularExpressions.Regex(" - [0-9]+")

    textSelection = DTE.ActiveDocument.Selection
    Try
        If Not (codeElement Is Nothing) Then
            textSelection.MoveToPoint(codeElement.GetStartPoint(vsCMPart.vsCMPartHeader))
            'エレメント名選択
            textSelection.FindText(codeElement.Name, vsFindOptions.vsFindOptionsMatchCase)
            'すべての参照の検索を実行
            DTE.ActiveDocument.Activate()
            DTE.ExecuteCommand("Edit.FindAllReferences")
            rescaption = DTE.Windows.Item(Constants.vsWindowKindFindSymbolResults).Caption

            '検索結果ウィンドウのタイトルから件数を取得
            resultcount = CType(regex.Match(rescaption).Value.Substring(3), Integer)

            Return resultcount

        End If
    Catch ex As Exception
    End Try

End Function

SearchAllFunctionReferenceを実行すると、アクティブなドキュメント(ソースファイル)内のメソッドを探し、全てのメソッドに対して「すべての参照を検索」を実行し参照数を取得、
参照数が1以下(どこからも参照されていない)の場合はダイアログでその関数名が表示される。

ほんとはシンボルの検索結果みたいに表示させたいけどよくわからないので・・・。
とりあえず今使いたくて調べつつ作ったマクロなのでちょっとややこしいです。

ほんとは参照されないゴミメソッドなんて出ないようなきれいな書き方すればいいんだけどね。
どうも何かとメソッドに分けたがるタイプなのでよくゴミが出る・・・


 |  17:46  |  プログラム全般  |  トラックバック(0)  |  コメント(0)  |  Top↑

2008.02.22 (Fri)

ソースコードをブログ用に変換する秀丸マクロ

ただ単に<を&lt;に置き換えるとか、それだけのマクロ。
すでにもっとちゃんとしたマクロがありそうだけど。

replaceall "&" , "&amp;";
if( ! result )  beep;
setcompatiblemode 15;
replaceall "<" , "&lt;";
if( ! result )  beep;
replaceall ">" , "&gt;";
if( ! result )  beep;
replaceall "\"" , "&quot;";
if( ! result )  beep;
replaceall " " , "&nbsp;";
if( ! result )  beep;
replaceall "\t" , "&nbsp;&nbsp;";
if( ! result )  beep;

自動改行onにして投稿してるんで改行の置換はしてません。


 |  16:19  |  パソコン  |  トラックバック(0)  |  コメント(0)  |  Top↑

2008.02.13 (Wed)

流石めーるを自動化 - UWSC

「流石めーる」というリードメールのサイトに登録してます。
リードメールとは、送られてきたメールのURLをクリックし、広告を閲覧してポイントを貯めてキャッシュバックが出来るサイトです。

UWSCがあるとやってみたくなるんですよね、自動化を。
ということでやってみました。

流石メールにログイン→受信箱のメールを順次開く→開いたメールのURLを開く
→ポイントが加算されるまで待つ→次のメールへ

という流れを自動で行うスクリプトです。
画像認証は手動で認証する必要があります。

注)開かれる広告はちゃんと見ましょう・・・

↓の"userid"と"pass"の中身は自分のアカウントのユーザーIDとパスワードを設定します。

USER_ID = "userid" // ユーザーID
USER_PASS = "pass" // パスワード

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = true;
IE.Navigate("http://sasuga.biz/pages/index.php");
REPEAT
SLEEP(1)
UNTIL !IE.busy AND IE.readystate=4

ret = IELINK(IE, "ログイン")

REPEAT
SLEEP(1)
UNTIL !IE.busy AND IE.readystate=4

// ログインフォームがあったらログイン
ifb IE.document.getElementsByName("username").length > 0 then
IE.document.getElementsByName("username").Item(0).value = USER_ID
IE.document.getElementsByName("password").Item(0).value = USER_PASS
IE.document.getElementsByName("submit").Item(0).click
REPEAT
SLEEP(1)
UNTIL !IE.busy AND IE.readystate=4
endif

// 受信箱へ
ret = IELINK(IE, "受信箱")

REPEAT
SLEEP(1)
UNTIL !IE.busy AND IE.readystate=4

// 広告を表示するウィンドウ
IESub = CreateOLEObj("InternetExplorer.Application")
IESub.Visible = true;

// メールがあるとformが存在する
ifb IE.document.forms.length > 0
// フォーム内のリンクを全部取得
for i = 0 to IE.document.forms[0].getElementsByTagName("a").length - 1
IM_Link = IE.document.forms[0].getElementsByTagName("a").Item(i)
IM_Link.focus // とりあえずフォーカス当てる

// リンクを開く
IESub.Navigate(IM_Link.href);
REPEAT
SLEEP(1)
UNTIL !IESub.busy AND IESub.readystate=4
// 待ち秒
// ランダムで1~3秒待ち
SLEEP(RANDOM(3))

// エラー有無
errflg = false

// メール内のリンクを全取得
for j = 0 to IESub.document.getElementsByTagName("a").length - 1
TRY
// http://sasuga.biz/scripts/runner.php?EA=のリンクなら
ifb POS("http://sasuga.biz/scripts/runner.php?EA=", IESub.document.getElementsByTagName("a").Item(j).href) > 0
// IESubウィンドウで開く
IESub.Navigate(IESub.document.getElementsByTagName("a").Item(j).href);
REPEAT
SLEEP(1)
UNTIL !IESub.busy AND IESub.readystate=4

// 画像認証画面になったらクリック待ちループ
while true
ifb POS("画像に表示されたものと同じ数字をクリックして下さい", IESub.document.body.InnerText) = 0
break
endif
sleep(1)
wend

// この広告は閲覧済みなら次へ
ifb POS("この広告は閲覧済みです", IESub.document.body.InnerText) > 0
sleep(1)
break
endif

// 期限切れなら次へ
ifb POS("この広告は既定のクリック数に達したか、期限切れです", IESub.document.body.InnerText) > 0
sleep(1)
break
endif

// 「報酬は加算されました」と表示されるまで待つループ
while true
REPEAT
SLEEP(1)
UNTIL !IESub.busy AND IESub.readystate=4
// リンク先が開けたら
ifb POS("報酬は加算されました。", IESub.document.frames[0].document.body.InnerText) > 0
break
endif
sleep(2)
wend

sleep(3)
endif
EXCEPT
errflg = true
ENDTRY
next
next
endif

IESub.quit

↓ダウンロードして使用する場合は、拡張子をuwsに変更して使用してください。
sasuga.txt


 |  18:42  |  UWSC  |  トラックバック(0)  |  コメント(0)  |  Top↑

2008.02.07 (Thu)

ウィンドウタイトル以外の条件でウィンドウを取得 - UWSC

GETID以外で、特定のIEのオブジェクトを取得する方法。
すでに開いているウィンドウから取得できる。



flg = 0
Obj_Shell = CreateOleObj("Shell.Application")
// すべてのウィンドウ分ループ
for i = 0 to Obj_Shell.Windows.Count - 1
  Obj = Obj_Shell.Windows.Item(i)

  // IEのウィンドウ?(Obj.Fullnameにはアプリケーションのパスが入る)
  ifb Obj > 0 and pos("iexplore.exe",Obj.Fullname) > 0
    //Windows.Item(i)がそのままIEオブジェクトとして使用できる
    objIE = Obj
    // IEがサイトを読み込み中なら読み込み終わるまで待つ
    WHILE objIE.busy or objIE.readystate <> 4
     SLEEP(1)
    WEND
    
    // 画面に"対象のウィンドウ"という文字が表示されているなら
    ifb POS("対象のウィンドウ", objIE.document.body.innerHTML) > 0
      // 閉じる
      objIE.quit
      // 見つかったフラグ
      flg = 1
      // IDを取得する場合はHNDTOIDで取得できる
      ID = HNDTOID(objIE.HWND)
      // 終了
      EXIT
    endif
    
  endif
next

if flg = 0 then msgbox("対象のウィンドウは見つかりませんでした")



こんな感じで全ウィンドウループして探せば同じタイトルのウィンドウも条件により分けて取得できる。


 |  13:48  |  UWSC  |  トラックバック(0)  |  コメント(0)  |  Top↑
 | BLOGTOP |  NEXT
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。