XREA.COM Logo XREA.COM Ad

管理人の雑記

13管理人 ★:06/06/18 06:38 ID:???
ClassNNの誤認識の件は仕様ということになっているらしい。
確かに、TEditor1とTEditコントロールのような場合なら見分けが付くが、
SysListView321とSysListViewコントロールの場合、「1番目のSysListView32」を指定したのか
「321番目のSysListView」を指定したのかを見分けることができない。
根本的に間違った設計のClassNNのことは綺麗さっぱり忘れて、
コントロールのウィンドウハンドルを使う形式を使うようにした方が良いだろう。

いちいち文字列の比較が行われるClassNNよりもウィンドウハンドル指定の方が早そうだと思い、ベンチマークスクリプトを作ってみた。
MouseGetPosで得たコントロールのスタイル情報を取得する処理と、
WinGetでControlListを取得する処理の2つをそれぞれClassNN利用とウィンドウハンドル利用で作成。


SetBatchLines,-1

;ClassNN
tc=%A_TickCount%
Loop,100000{
    MouseGetPos,,,hwnd,ctrl
    ControlGet,st,Style,,%ctrl%,ahk_id %hwnd%
}
MsgBox,% A_TickCount - tc
;2700ms

;Control's HWND
tc=%A_TickCount%
Loop,100000{
    MouseGetPos,,,,ctrl,2
    ControlGet,st,Style,,,ahk_id %ctrl%
}
MsgBox,% A_TickCount - tc
;1500ms

;ClassNN
tc=%A_TickCount%
IfWinExist,A
{
    Loop,10000{
        WinGet,lst,ControlList
        Loop,Parse,lst,`n
        {
            ControlGet,st,Style,,%A_LoopField%
        }
    }
}
MsgBox,% A_TickCount - tc
;690ms

;Control's HWND
tc=%A_TickCount%
IfWinExist,A
{
    Loop,10000{
        WinGet,lst,ControlListHWND
        Loop,Parse,lst,`n
        {
            ControlGet,st,Style,,,ahk_id %A_LoopField%
        }
    }
}
MsgBox,% A_TickCount - tc
;350ms

どうやら、ウィンドウハンドルの方が2倍弱も高速になるようだ。

日本語版リファレンスは、まだこの機能の追加を反映していないので、さっさと書き足しておかなければ。
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08