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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1217
科学太郎mesbox命令のバグでしょうか?仕様でしょうか?7解決


科学太郎

リンク

2015/12/17(Thu) 08:55:05|NO.73634

mesbox命令の第5引数に 32767 以上の数値を
指定しても 32767 以上の文字列を取得できない。

●mesboxに2.8MB程度の文字をコピペして全文保存したい
http://hsp.tv/play/pforum.php?mode=all&num=71466

この方も同じ質問をしてます。

;記号定数 #const EM_SETLIMITTEXT $000000C5;wParam=容量 lParam=なし ;確保 size=1024*1024 sdim strBuff,size ;ダミー wide=75 memset strBuff,'@',size,0 poke strBuff,(size-1) repeat(size/wide) poke strBuff,(cnt*wide+wide-2),$0D;CR \r poke strBuff,(cnt*wide+wide-1),$0A;LF \n loop ;生成 mesbox strBuff,ginfo_winX,ginfo_winY,5,-1;ここを「0」や「size」にしても同じ現象 sendmsg objinfo_hwnd(stat),EM_SETLIMITTEXT,size,0 ;確認 repeat n=strlen(strBuff) f=double(n)/1024 title strf("strBuff=%7.3f KB(%dバイト)",f,n) await 100 loop stop

これを実行して最下行で1文字入力しようとすると「32766」バイトになります。
この現象はHSPのバグと見るべきか、仕様と見るべきか?
どちらでしょうか?

また、mesbox命令で「32766」バイト以上の入力は可能ですが、
文字列型の変数は「32767」バイトしか取得できません。
そのためHSPのバグと見るべきかな〜と。思ってますが…。
どうなのでしょうか?



この記事に返信する


スペース

リンク

2015/12/17(Thu) 10:34:35|NO.73635

このページとか参考になりませんか?
http://www.hsp.tv/play/pforum.php?mode=pastwch&num=36451



科学太郎

リンク

2015/12/17(Thu) 14:24:25|NO.73636

> このページとか参考になりませんか?
WM_GETTEXTLENGTH、WM_GETTEXT、WM_SETTEXT を使うと取得できたり、設定できることは知ってます。
つまり、回避方法は次のようにすれば良いわけです。

;記号定数 #const EM_SETLIMITTEXT $000000C5;wParam=容量 lParam=なし #const EM_EXLIMITTEXT $00000435;wParam=なし lParam=容量 #const WM_GETTEXT $0000000D #const WM_GETTEXTLENGTH $0000000E ;列挙定数 #enum EID_EDIT01=0 #enum EID_EDIT02 #enum BID_EDITCOPY1 #enum BID_EDITCOPY2 #enum BID_ADDNUMLINE ;メイン *Init ;編集前/編集後 dim nEditSize:nEditSize=1024*1024 sdim sEditIn1,nEditSize sdim sEditIn2,nEditSize sdim sEditOut,nEditSize *Main h=30 x=ginfo_winX/2 y=ginfo_winY-h-h pos 0,0:mesbox sEditIn1,x,y,5,-1 pos x,0:mesbox sEditIn2,x,y,5,-1 objsize x*1,h:pos 0,y+0:button gosub "編集前→編集後", *PushEditCopy1 objsize x*1,h:pos x,y+0:button gosub "編集前←編集後", *PushEditCopy2 objsize x*2,h:pos 0,y+h:button gosub "行番号の追加", *PushAddNumLine stop ;編集前から編集後にコピー *PushEditCopy1 sendmsg objinfo_hwnd(EID_EDIT01),WM_GETTEXT,nEditSize,varptr(sEditIn1) objprm EID_EDIT02,sEditIn1 return ;編集後から編集前にコピー *PushEditCopy2 sendmsg objinfo_hwnd(EID_EDIT02),WM_GETTEXT,nEditSize,varptr(sEditIn2) objprm EID_EDIT01,sEditIn2 return ;行番号の追加 *PushAddNumLine sdim sEditOut,nEditSize sendmsg objinfo_hwnd(EID_EDIT01),WM_GETTEXT,nEditSize,varptr(sEditIn1) notesel sEditIn1 repeat notemax noteget getLine,cnt sEditOut+=strf("%05d: ",cnt+1) sEditOut+=getLine sEditOut+="\n" loop noteunsel objprm EID_EDIT02,sEditOut return
notesel命令の前で WM_GETTEXTLENGTH、WM_GETTEXT を使って文字列を取得します。
HSP Ver.3.3.2 では objprm で 32767 バイトを超えても設定できてます。
そのため WM_SETTEXT は使ってません。



スペース

リンク

2015/12/17(Thu) 15:10:32|NO.73637

すみません質問文をよく読んでいませんでした・・・
「32767 以上の文字列を取得できない。」でしたか。
トンチンカンな回答をしてしまい申し訳ない(´・ω・`)



ue_dai

リンク

2015/12/17(Thu) 19:15:50|NO.73638

バグというか仕様というか、
0x7fff バイトで切り詰めるようになっています
(WM_GETTEXTLENGTH で長さをとるようにすれば直りました)

http://dev.onionsoft.net/trac/openhsp/browser/trunk/hsp3/win32gui/hspwnd_obj.cpp#L191



科学太郎

リンク

2015/12/17(Thu) 20:15:41|NO.73639

> バグというか仕様というか、
> 0x7fff バイトで切り詰めるようになっています
どうやら 0x7FFF(32767) までしか想定していないようですね。

> 190:cid = GetDlgCtrlID( info->hCld );
> 191:val = GetDlgItemText( hwnd, cid, minp, 0x7fff );
ここを HSP の文字列型のサイズに合わせてくれたら良かったのにな〜ぁ。
うーん。仕様と見るべきなのかね。これは。



toto

リンク

2015/12/18(Fri) 02:53:58|NO.73647

古い話ですがWindows95系のOSでは32kまでしかEditコントロールには入力できませんでした。
それらのOSがメジャーだったころ、それらのOSの仕様に合わせてそうなっていたのが現在まで
残ってるんじゃないかと思います。
今はOSの制限はなくなりましたが、mesboxに一文字入力するごとに変数に文字列をコピーします
のであまり大きいサイズだと入力時の処理が重くなるのでこれでいい気もします。



科学太郎

リンク

2015/12/18(Fri) 19:48:00|NO.73668

> 古い話ですがWindows95系のOSでは32kまでしかEditコントロールには入力できませんでした。
こちらも MS-DOS 時代からパソコンを使ってるので 32767 バイトが上限=16ビットの名残かな?!
と思いました。

> それらのOSがメジャーだったころ、それらのOSの仕様に合わせてそうなっていたのが現在まで
> 残ってるんじゃないかと思います。
同感。

> 今はOSの制限はなくなりましたが、mesboxに一文字入力するごとに変数に文字列をコピーします
> のであまり大きいサイズだと入力時の処理が重くなるのでこれでいい気もします。
Editコントロールからフォーカスが外れたら変数に文字列をコピーするように改良して欲しいものですね。



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