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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0317
kerupani inputについて (文字列型変数使いました)5未解決


kerupani

リンク

2011/3/17(Thu) 13:02:06|NO.37643

■1
inputで、sendmsgで指定した個所を選択したり全部選択したりするサンプルは
検索で見つけたのですが、選択した場所を取得するサンプルは、全角も一文字として
認識されちゃうものしか見つかりませんでした…。全角は2として認識される
やり方はないでしょうか?

■2
また、文字列型変数を使ったときに、inputの中を何回かクリックしたりとか、下らへんや、
ずっと右をクリックしたりすると勝手に全部選択されるんですが、この機能を消すことは
できないでしょうか?



この記事に返信する


Cookies (元ひよこ)

リンク

2011/3/17(Thu) 19:52:26|NO.37650

1について
 「全角も一文字として認識されちゃうもの」というのは、具体的にどういう方法でしょうか。
 
 こちらで調べましたところ、選択位置取得には
 EM_GETSEL($00B0)メッセージを送るという方法があるようです。
 ほかの方法なんてほとんどないだろうし、sendmsgをつかっているということから、
 あなたの「全角も一文字として認識されちゃうもの」はこれを指しているという前提で以下を書きます。
 
 僕も試してみたところkerupaniさんの言うように、バイト数ではなく文字数単位で取得されました。
 しかしその後、mesboxだとバイト数になることを発見しました。
 同じエディットボックスコントロールなはずなのに。
 ということで、CreateWindow関数を使ってウィンドウを自作したところ、うまくいきました。
 なにかinputのスタイルに問題でもあったのでしょうか。

サンプル?
#uselib "USER32.DLL"
#func CreateWindowEx "CreateWindowExA" int,int,int,int,int,int,int,int,int,int,int,int #define WS_CHILD $40000000 #define WS_VISIBLE $10000000 #define WS_BORDER $00800000 #define EM_GETSEL $00B0 ClassName = "Edit" //クラス名(エディットコントロール) WindowName= "TESTてすと" //内容 px=0 : py=0 //pos sx=200 : sy=24 //size winStyle=WS_CHILD | WS_VISIBLE | WS_BORDER //ウィンドウスタイル CreateWindowEx 0, varptr(ClassName), varptr(WindowName), winStyle, px, py, sx, sy, hwnd, 0, 0, 0 hedit = stat //コントロールのウィンドウハンドル pos ,py+sy objsize 128 button "選択位置取得",*getpos mes "選択位置(最初:最後)" stop *getpos dim Position,2 sendmsg hedit,EM_GETSEL,varptr(Position.0),varptr(Position.1) //EM_GETSELを送る mes "" + Position.0 + ":" + Position.1 //Position.0に選択範囲の最初、.1に最後の位置がバイト単位で入ります。 stop
inputと見た目がだいぶ違いますが、ご勘弁を。
ウィンドウスタイルをいじってみてください。

スクリプトが分かりにくい? すいません。



Gold

リンク

2011/3/17(Thu) 20:25:18|NO.37652

■1
取得した後に調節すればいいんでないか

■2
ボックス内を選択させないなら killfocus
範囲選択のみ使用しないなら、ちょっと分からん
調べてる

sdim a, 30 objmode 1, 0 input a : id = objinfo(0 ,2) sendmsg id, $8, -1 button goto "get - str", *get stop *get color 255, 255, 255 : boxf sdim p, 30 : wpoke p, , 30 objsel 0 sendmsg id, $C9, -1 sendmsg id, $C4, stat, varptr(p) sendmsg id, $8, -1 color 0 ,0 ,0 : pos 0 ,50 mes p a = "" objprm 0 ,a stop



kerupani

リンク

2011/3/18(Fri) 11:11:36|NO.37665

>Cookiesさん
回答ありがとうごいます。ところが、なぜかあなたのサンプルえdもだめでした…。
PCのせいなのでしょうか…。
↓は私が見つけたサンプルです。mesboxなんですが、これをinputに書き換えたものでも
↓のでもどっちも、私のところでは文字数で取得されてしまいます…。

;***** エディットコントロールの現在選択項目の位置を取得 (sndobj38.hsp) ***** #define EM_GETSEL $000000B0 sdim buf,1000 buf = {"今日の天気は晴れです。 HSP (Hot soup processer Ver3.0) 益々、絶好調! 何にもないけど、お茶でもどうぞ! 初心者、歓迎・・・・ 質問はBBSでどうぞ。"} pos 10,20 : mesbox buf,600,300,1 objsize 60,26 : pos 10,340 : button "Check",*go01 stop *go01 sendmsg objinfo(0,2), EM_GETSEL, varptr(s),varptr(e) s=(stat & $ffff) dialog ""+s+" "+e,0 stop
http://hspnext.com/hspkura/hspkura12.htm#contents39 より

HSPのバージョンは3.21でOSはWindows7です。

>Goldさん
>1
え〜と…調節するということは全角と半角を判定するということですよね?
でも、そうなると、最初に1byteづつ判定していって、やらないといけないので…
多少時間がかかっちゃいますよね…。どうしても方法がないならそれにします。
>2
わざわざサンプルを書いてくれてありがとうございます。しかし、選択を不可能にしたいわけではなく、
あるクリックによって、自動的に全部選択されることだけ、無効にしたいんです…。
わざわざサンプルを書いてもらって、もうしわけないんですが、そういうことでお願いします…。
>範囲選択のみ使用しない
え〜と…調べているところだったらすいません…。選択(全部のも一部のも含めて)を不可能に
したいのではなく、自動でなるのをならないようにしたいんです…。すいません。



Cookies (元ひよこ)

リンク

2011/3/19(Sat) 15:31:45|NO.37706




Cookies (元ひよこ)

リンク

2011/3/19(Sat) 16:39:33|NO.37707

2について
 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200111/01110091.txt
 http://yokohama.cool.ne.jp/chokuto/urawaza/mcn/subclass.html
 こんなではないでしょうか。
 サブクラス化し、ダブルクリックメッセージを捕まえて、
 普通の処理(=全選択)をさせないようにすれば。

>ずっと右をクリックしたりすると
 よくわからないのですが…

リンク乗っけるばっかりですいません。。



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