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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0122
Asメッセージボックス内での文字列検索→選択10解決


As

リンク

2007/1/22(Mon) 13:50:09|NO.5004

要はメモ帳の検索機能を実装したいのですが、メッセージボックスを選択する場合は
文字インデックスを指定しなければならなかったりとバイト取得のstrlenとは仕様が
異なる部分もあるため、それらしいものができても若干のバグができてしまいます。

そこで、この検索→選択はどうやって実装することができるのかご教示お願いいたします。><



この記事に返信する


通りすがり

リンク

2007/1/22(Mon) 15:12:41|NO.5011

>メッセージボックスを選択する場合は
>文字インデックスを指定しなければならなかったりとバイト取得のstrlenとは仕様が異なる

意味がよく分からないけど、とりあえずinstrでstrlen(検索する文字列)の分をエディットコントロール関連の命令で選択すれば
できるのでは。命令がなければモジュールとかで。



kz3

リンク

2007/1/22(Mon) 22:53:19|NO.5023

多分OSによってエディットメッセージがバイト単位だったり文字単位だったりっていう問題のことを言っているのだと思います。(HSP HELP CENTER参照)
その点の対処方法は分かりません。
その問題を無視して「検索」機能は次のような感じで実装してみました。

pos 0, 0 button "find", *find pos 64, 0 findstr = "" input findstr, ginfo_winx - 64,,0 pos 0, 24 notesel editstr: noteload "hsptmp" mesbox editstr, ginfo_winx, ginfo_winy - 24, 5, 0 iEdit = stat hEdit = objinfo( iEdit, 2 ) stop *find sendmsg hEdit, 0x00B0, 0, varptr(rsel) ; EM_GETSEL p = instr( editstr, rsel, findstr ) if p = -1{ dialog "Not Found \"" + findstr + "\" .",,"Result } else{ objsel iEdit sendmsg hEdit, 0x00B1, rsel+p, rsel+p+strlen(findstr) ; EM_SETSEL } stop
ちなみに私の環境は Windows XP SP2 です。



ゆちボン

リンク

2007/1/23(Tue) 16:07:48|NO.5033

XPやらでstrlenとmesboxの文字列を数える単位が違います。(これで自分もやられました)

sendmsgを送ればいいみたいです。
SendMessage で検索してみてください。



kz3

リンク

2007/1/23(Tue) 16:52:43|NO.5035

>XPやらでstrlenとmesboxの文字列を数える単位が違います。(これで自分もやられました)
単位が違うのはちょこっと言いましたが、検索してみるとこんなものを見つけました。
http://www.activebasic.com/forum/viewtopic.php?t=1716&sid=a6115833fb983a26d9e5592bc15cc9b9



通りすがり

リンク

2007/1/23(Tue) 17:18:48|NO.5036

>XPやらでstrlenとmesboxの文字列を数える単位が違います。(これで自分もやられました)
mesboxでサイズの取得はできないよ。言ってる意味がよくわからん。



As

リンク

2007/1/23(Tue) 17:43:38|NO.5039

回答ありがとうございます><
>>kz3さん

editstr(検索対象文字列)に2byte文字をいれてみてください。

ずれます。


やはり、instrなどの検索結果をインデックス文字数に直すような
2byte処理などのモジュールを作らなくてはならないのでしょうか・・。



As

リンク

2007/1/23(Tue) 21:08:53|NO.5050

//指定した変数のバイト位置を文字インデックスに変換
//p1: 文字インデックス値を取得する文字列型変数
//p2: 変換したいバイト位置
#defcfunc ByteToStrIndex var p1, int p2
sdim s1,strlen(p1)
memcpy s1,p1,p2,0,0 //指定した位置までの文字数を取得

s2=0
s4=-2
repeat p2
if s4!cnt-1{
s3=peek(s1,cnt)
if ((s3>=0x81)&(s3<=0x9f) )|( (s3>=0xe0)&(s3<=0xfc))=1{
s4=cnt
}
s2+
}
loop
return s2




//指定した変数の文字インデックスをバイト位置に変換
//p1: 文字インデックス値を取得する文字列型変数
//p2: 変換したい文字インデックス値
#defcfunc StrIndexToByte var p1, int p2
sdim s1,strlen(p1)
memcpy s1,p1,p2,0,0 //指定した位置までの文字数を取得

s2=0
s4=-2
repeat p2

s3=peek(s1,cnt)
if ((s3>=0x81)&(s3<=0x9f) )|( (s3>=0xe0)&(s3<=0xfc))=1{
s2+2

}else{
s2+
}

loop
return s2


こんなの作ってみましたがどうもうまくいかないようです。
フルソースはこちらです↓
http://asjp.dynalias.com/hsp_sorce/search.txt



As

リンク

2007/1/23(Tue) 21:45:59|NO.5051

自己解決しました^^;
ありがとうございました<(_ _)>



↓一応ソース提示
http://asjp.dynalias.com/hsp_sorce/findselect.txt



kz3

リンク

2007/1/24(Wed) 17:10:23|NO.5083

## ひとりごと

>ずれます。

意図的に半角英数のみのソースにしたに決まってます^^;

HSP HELP CENTER によれば、

┃         │  │SP1 │SP2 │     内 容          ┃ ┣━━━━━━━━━┿━━┿━━┿━━┿━━━━━━━━━━━━━━━━━━┫ ┃ EM_GETSEL |$B0 | ☆ | ★ |選択開始位置と終了位置の取得 ┃ ┃ EM_SETSEL |$B1 | ☆ | ★ |選択開始位置と終了位置の設定 ┃ ☆ バイト数単位   ★ 文字数単位
ということらしいですが、よく考えてみれば、SP1のバイト数単位の取得・設定というのはおかしいですね。
それが可能だと、「あ」などで、左半分・右半分で選択できるのか、みたいな話になってしまいますね...。



As

リンク

2007/1/24(Wed) 18:08:23|NO.5087

>>kz3さん
今確認してみましたが、
どうやら本当にSP1の環境の人はByteになっているようです^^;



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