HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0207
リアジフォーカスの位置の取得が変5解決


リアジ

リンク

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になるようです
なぜでしょうか?どこか間違っていたら教えてほしいです



この記事に返信する


Irisawa

リンク

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だとうまくいくのですが他の場合だと変な数字になってしまいます;
なにかいい方法ないでしょうか



KIMU

リンク

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行でかけるんで便利ですね 知りませんでした
いろいろ教えてくれてありがとうございますー!



ONION software Copyright 1997-2023(c) All rights reserved.