|
|
2007/2/7(Wed) 13:43:16|NO.5494
フォーカスの位置を取得するのに
sdim naiyo,256
mesbox naiyo,ginfo_winx,200,1
repeat
sendmsg objinfo(0,2),$b0,0,0
yo=stat
a=wpeek(yo,0) ;フォーカス選択の左
b=wpeek(yo,2) ;フォーカス選択の右
color 255,255,255:boxf
pos 000,300
color 0,0,0:mes "フォーカスの位置"+a
wait 1
loop
としたのですが、ぼくはうまく取得できたのに友達がやると日本語の文字でも1文字と判定されるみたいで
「あいうえお」と打つとぼくは10なのに友達は5になるようです
なぜでしょうか?どこか間違っていたら教えてほしいです
|
|
2007/2/7(Wed) 15:00:23|NO.5498
WinXPではmanifestファイルをリソースに組み込むと自動で内部の文字コード処理が
Unicodeになってしまいます。
現在のHSPではランタイムに初めからmanifestがリソースに組み込まれているのでXPで
動作させると正常に動作しません。
これはWinXP側の仕様です。
|
|
2007/2/7(Wed) 15:37:16|NO.5501
仕様なんですか
ちゃんとフォーカスの位置を取得するにはどうすればいいのでしょうか?
|
|
2007/2/7(Wed) 16:28:07|NO.5503
開発wikiに2バイトか1バイトか調べるものがあったのでやってみました
#module
;文字コード判定関数
; MbsbType( p1, p2)
; Shift-JISの2バイト文字かを判定します。
; p1 : 内容をチェックする文字列変数
; p2 : バッファのインデックス(Byte単位)
;
; 次の値を返します。
; 0:シングルバイト(1バイト文字)
; 1:マルチバイトの先行バイト(2バイト文字の1バイト目)
; 2:マルチバイト文字の後続バイト(2バイト文字の2バイト目)
;
; msvcrt.dllの_mbsbtype関数と同等の動作をします。
;---
; MbsbTypeByte( p1 )
; Shift-JISのマルチバイトの先行バイトかどうか判定します。
; p1 : peekで取得した値を入れる。
; 返り値:
; 0:シングルバイトまたはマルチバイトの後続バイト
; 1:マルチバイトの先行バイトまたはマルチバイトの後続バイト
#defcfunc MbsbTypeByte int byt
return ((byt>=0x81)&(byt<=0x9f) )|( (byt>=0xe0)&(byt<=0xfc))
#defcfunc MbsbType var p1, int p2
bcnt = p2
repeat p2
if MbsbTypeByte(peek(p1, p2-cnt-1)) = 0 : bcnt = cnt : break
loop
if bcnt\2 {
;マルチバイトの後続バイト
return 2
} else {
;マルチバイトの先行バイトかシングルバイト
return MbsbTypeByte(peek(p1, p2))
}
#global
;----------------------------------------------------------
sdim naiyo,256
mesbox naiyo,ginfo_winx,200,1
repeat
sendmsg objinfo(0,2),$b0,0,0
yo=stat
a=wpeek(yo,0) ;フォーカス選択の左
b=wpeek(yo,2) ;フォーカス選択の右
color 255,255,255:boxf
pos 0,300
focus=0
repeat a
if MbsbType(naiyo, focus)==0 : focus+=1
if MbsbType(naiyo, focus)==1 : focus+=2
if MbsbType(naiyo, focus)==2 : focus+=0 : dialog "arienai"
loop
color 0,0,0:mes "フォーカスの位置"+focus
wait 1
loop
XPだとうまくいくのですが他の場合だと変な数字になってしまいます;
なにかいい方法ないでしょうか

| |
|
2007/2/8(Thu) 01:56:43|NO.5509
全角が1文字として数えられる環境しかないので、合ってるかは分からない
//NO.5503のモジュールを使うのが前提
sdim naiyo,256
naiyo=" " ;全角スペース
mesbox naiyo,ginfo_winx,200,1
sendmsg objinfo(0,2), $b1,0,-1 ;全選択
sendmsg objinfo(0,2),$b0,0,varptr(e) ;e=1(全角が1文字として) e=2(全角が2文字として)
naiyo=""
;notesel naiyo
;noteload dir_exe+"\\readme.txt",-1
objprm 0,naiyo
repeat
sendmsg objinfo(0,2),$b0,varptr(a),varptr(b)
if e=1 {
focus=0
repeat a
if MbsbType(naiyo, focus)==0 {
focus+=1
}else{
focus+=2
}
loop
}else{
focus=a
}
color 255,255,255:boxf
pos 0,300
color 0,0,0:mes "フォーカスの位置 "+focus
color 100,100,255:mes "キャレット右側の文字 "+strmid(naiyo,focus,MbsbType(naiyo,focus)+1)
redraw 1 :wait 1 :redraw 0
loop
ここのサイト検索で、検索選択 で検索すれば
Asさんが同じような事やってるので、見てみるのもいいかも
|
|
2007/2/8(Thu) 17:55:47|NO.5525
おーできました!
最初に文字単位かバイト単位かを調べればいいんですね
頭いいです
sendmsg objinfo(0,2),$b0,varptr(a),varptr(b)
っていうやり方も1行でかけるんで便利ですね 知りませんでした
いろいろ教えてくれてありがとうございますー!
|
|