hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
mesbox内での検索実装 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

検索選択

メモ帳の検索と同じ動作。

ソース

filefindselect.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
|
!
 
 
 
 
 
 
 
 
 
-
|
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
-
|
-
|
!
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
-
|
!
 
 
-
|
|
!
 
 
 
-
|
-
|
|
|
!
|
-
|
|
|
|
-
|
!
|
-
|
|
-
|
|
-
|
|
!
|
|
|
|
|
|
|
-
|
|
-
|
!
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
!
 
#uselib "user32.dll"
#func global CharLowerA "CharLowerA" sptr
#define global CreateWindowEx CreateWindowExA
#func global CreateWindowExA "CreateWindowExA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func global DestroyWindow "DestroyWindow" sptr
 
 
 
 
 
//=========================================================================================================
// モジュール
//=========================================================================================================
#module
//指定した変数のバイト位置を文字インデックスに変換
//p1: 文字インデックス値を取得する文字列型変数
//p2: 変換したいバイト位置
#defcfunc ByteToStrIndex var p1, int p2
s2=0
repeat p2
        s1=peek(p1,cnt)
        if ((s1>=$81)&(s1<=$9f))|((s1>=$e0)&(s1<=$fc))=1{
            s2+
            continue cnt+2
        }else{
            s2+
            
        }
loop
return s2
//指定した変数の文字インデックスをバイト位置に変換
//p1: 文字インデックス値を取得する文字列型変数
//p2: 変換したい文字インデックス値
#defcfunc StrIndexToByte var p1, int p2
s2=0                    //byteカウント
repeat p2
    s1=peek(p1,s2)
    if ((s1>=$81)&(s1<=$9f))|((s1>=$e0)&(s1<=$fc)){
        s2+2
    }else{
        s2+
    }
loop
return s2
#global
 
 
#module
 
//テキストボックスから文字列を検索し、見つかった場合選択する。 Ver.1.3 by As.
//p1: テキストボックスのオブジェクトID
//p2: テキストボックスのデータが入った文字列型変数
//p3: 検索する文字列
//p4: 1を指定すると大文字と小文字を区別するようになる
//p5: 1を指定すると終端まで検索した場合先頭へ戻らなくなる
//<戻り値>
//文章に検索する文字列があった場合1を返す。なかった場合は0を返す。例外エラーの場合は-1を返す。
#deffunc findselect int p1, str p2, str p3, int p4, int p5
 
//文字インデックス取得かバイト取得か調べる
if findselectflag=0{
    //ウィンドウの作成
    CreateWindowEx 0, "Edit" ,"12345",$40000000 | $10000000 | $00800000 | $00000004 , 20, 50, 150, 50, hwnd, 0, hinstance, NULL
    s1=stat
 
    //テキストを選択し文字量を取得(環境のよって取得される値が異なる)
    sendmsg s1, $b1, 0,-1
    sendmsg s1, $b0, 0, varptr(s2)
    switch s2
        case 10
            findselectflag=1        //バイトで文字が取得されている
        swbreak
 
        case 5
            findselectflag=2        //文字インデックスで文字が取得されている
        swbreak
 
    swend
    
    //ウィンドウの破棄
    DestroyWindow s1
}
 
 
// デバッグ用  ///////////////////////////////////////////////////////////////////////
    if findselectflag=2{
        title "環境:【 文字インデックス 】 による取得が行われています"
    }else{
        title "環境:【 バイトサイズ 】 による取得が行われています"
    }
//////////////////////////////////////////////////////////////////////////////////////
 
    if findselectflag=0:return -1    //例外エラー
 
    //変数初期化&Objhnd取得
    s1=p3 : s2=objinfo(p1,2) :     s3=p2
 
    sendmsg s2, $b0, varptr(s7), varptr(s5)     //現在のキャレット位置を取得
 
    //初期位置を記憶
    if nohit=0{
        c1=s7
        c2=s5
    }
 
    //文字インデックスなら実行
    if findselectflag=2{
        s5=StrIndexToByte(s3,s5)            //キャレット位置までのByteサイズを代入
    }
 
    //p4が0の場合大文字小文字関係なく検索
    if p4=0{
        CharLowerA varptr(s3)
        CharLowerA varptr(s1)
    }
 
    //検索
    s4 = instr( s3, s5, s1 )
    if s4 = -1{
        //2次元
        if nohit=1{
            nohit=0
            sendmsg s2, $b1, c1,c2            //初期位置に戻す
            return 0                        //一件も見つからない(2次元return)
        }
        
        if p5=0{
            nohit=1                                //ヒット無しフラグ
            sendmsg s2, $b1, 0,0                //選択位置を先頭に移動
            findselect p1,p2,p3,p4,p5            //もう一度この命令を実行
            return stat                            //戻り値を継承してreturn
        }else{
            return 2                            //終端の場合2を返す
        }
 
    }else{
        
        //文字インデックスなら実行
        if findselectflag=2{
            s4=ByteToStrIndex(s3,s4+s5)            //オフセットを加算し文字列インデックスに変換
            s6=ByteToStrIndex(s1,strlen(p3))    //検索文字列の文字数を代入
        }else{
            s4+=s5                                //オフセットを加算
            s6=strlen(p3)                        //検索文字列のByteサイズを代入
        }
        
 
        sendmsg s2, $b1, s4, s4+s6        //選択範囲を設定
        sendmsg s2, $b7                    //キャレットを画面内に持ってくる
        objsel p1                        //フォーカス指定
 
        //戻り値の分岐
        if nohit=1{
            nohit=0
            return 2                    //先頭に戻った場合2を返す
        }else{
            return 1                    //通常ヒットの場合1を返す
        }
                        
    }
 
 
 
#global
 
//=========================================================================================================
// サンプル
//=========================================================================================================
    
    title "[F3]で次を検索"
 
 
    
    onkey gosub *enter
    findstr="hello"
    pos 0, 0:    input findstr, ginfo_winx,,0
 
    editstr={"
	HSPでWindowsの世界が広がります。
	hspdewindowsnosekaigahirogarimasu.
	
	ハローワールド!
	hello! world!
 
	ハローワールド!
	hello! world!
 
	ハローワールド!
	hello! world!
 
	ハローワールド!
	hello! world!
 
	ハローワールド!
	hello! world!
	
	こんにちは
	konnitiwa
	
	さようなら
	sayounara
	"}
 
    pos 0, 24: mesbox editstr, ginfo_winx, ginfo_winy - 24, 5, 0
    iEdit = stat
    stop
 
 
 
*enter
 
    if wparam=114{
        //検索選択 findselect メッセージボックスのID, 文字列の入った変数, 検索文字列, 
        //大文字小文字を区別しない, 終端まで検索したらSTOP
        findselect iEdit,editstr,findstr,0,1
        if stat=0:dialog "一件も見つかりませんでした"
        if stat=2:dialog "終わりまで検索しました"
        objsel iEdit
    }
    return

コメント

  • 元のページ名だと意味が広いと思ったのでズバリな名称にリネームしました。 -- kz3 2007-01-24 (水) 17:49:52
  • 有難うございます。 -- As 2007-01-27 (土) 11:30:03

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filefindselect.hsp
350件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:38:23 (2436d)