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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1231
UNGAmesbox の字数制限について教えてください6解決


UNGA

リンク

2010/12/31(Fri) 16:40:49|NO.36451

始めまして、UNGAと申します。

mesboxでエディターを作っているのですが、59kbのテキストファイルをbloadで
読み込ませ、編集した後bsaveでセーブすると32kbに切られてしまいます。
notesave,noteloadも使ってみましたが同じでした。扱える文字数の上限は64kb
に拡張されているはずではないのでしょうか。ちなみにmesboxの最後のパラメータ
は0でも省略でも同じ結果でした。なお、開発環境はWinXP(sp3)、HSP3.2です。
ご教授いただければ幸いです。



この記事に返信する


hexa.hemi

リンク

2010/12/31(Fri) 16:55:16|NO.36452

mesboxの変数のサイズが十分に確保されていないと切れてしまいます。

sdim mb1, 100// 100Byteまでしか入力できない sdim mb2, 200// 200Byte入力できる mesbox mb1, ginfo(12), ginfo(13) / 2, 1, -1 mesbox mb2, ginfo(12), ginfo(13) / 2, 1, -1
そのため、existを使用して事前にファイルサイズを調べ
変数のバッファを十分に確保してからnoteloadなどの命令を使用したら直ると思います。



inovia

リンク

2010/12/31(Fri) 18:34:48|NO.36454

32KBがらみだとこちらが怪しいです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=29606



UNGA

リンク

2011/1/2(Sun) 22:28:21|NO.36506

早速のお返事ありがとうございます。
御二方のアドバイスを参考に、色々と試行錯誤を重ねていますが、
結論から言うと、今のところうまくいっていません。

一つ不思議な現象が確認できました。
59KBほどのテキストをbloadで読み込んだ後、mesbox内で編集していると
どのタイミングかわからないタイミングで32766bで切れてしまう。
さらにbsaveしたわけでもないのに、再起動後の読込みの際には32766bで
切れてしまう・・・というより、ファイルサイズは元のまま(59KB)な
のに32766bまでしか読み込めない。試しにメモ帳で開いてみるとちゃんと
最後まで読み込める。
ちなみに読込み用変数はsdimで64000b確保、mesboxの末尾パラメータは
−1です。



inovia

リンク

2011/1/3(Mon) 00:13:15|NO.36512

過去ログを見たらわかると思ったのですが。
32767bytesで切れてしまうのはHSPのmesboxの問題なので、
回避するモジュールを書いてみました。
使い方がだいぶ違いますので命令一覧を読んでください。



#module mb2 // HSPのオブジェクトIDを保存(直近のみ) id = 0 #deffunc mesbox2 int x,int y,int s,int p ; バッファの再確保を防ぐため(速度低下防止)大きめに確保 sdim dummy,32768 ; ダミー変数 mesbox dummy,x,y,s,p : id = stat return objinfo(stat,2) #deffunc gettxt int h,var buf ; WM_GETTEXTLENGTH sendmsg h,0x000E,0,0 size = stat ; バッファ確保 sdim buf,size+1 ; WM_GETTEXT sendmsg h,0x000D,size+1,varptr(buf) return stat #defcfunc getsize int h ; WM_GETTEXTLENGTH sendmsg h,0x000E,0,0 return stat #deffunc settxt int h,var buf ; WM_SETTEXT sendmsg h,0x000C,0,varptr(buf) return stat #global /* 命令一覧 ----------------------------------------------------- メッセージボックス表示 mesbox2 p1,p2,p3,p4 p1,p2 : メッセージボックスのサイズ(ドット単位) p3=0〜(1) : メッセージボックスのスタイル p4=0〜(-1) : 入力できる最大文字数 通常のmesboxの第1パラメータを削除した命令になっています。 通常版との違いは stat に メッセージボックスのハンドルが返ります。 後で必要になりますので適当な数値型変数に保存して置いてください。 HSPのオブジェクトID が必要な場合は、 変数 id@mb2 に格納されています。(直近のみ) ----------------------------------------------------- メッセージボックスの内容を反映 settxt p1,p2 p1 : mesbox2 で得られたハンドル p2 : メッセージボックスに反映したいテキストが格納されている変数 ----------------------------------------------------- メッセージボックスの内容を読み取り gettxt p1,p2 p1 : mesbox2 で得られたハンドル p2 : メッセージボックスの内容を格納する変数 ----------------------------------------------------- メッセージボックスの現在のテキストサイズ取得(関数) getsize(p1) p1 : mesbox2 で得られたハンドル ----------------------------------------------------- */ // サンプル開始 txt = "隣の客はよく柿食う客だ" mes " "+txt +" のテキストサイズは "+strlen(txt)+" bytes" // 長いテキストの作成 ; 100KB ほど確保しておく sdim buf,100000 repeat 3000 buf+=""+txt+""+cnt+"\n" loop mes " 3000 回ループすると テキストサイズは "+strlen(buf)+" bytes" ; メッセージボックスの作成 mesbox2 640,420,1,0 h1 = stat // ハンドルを保存 ; objid1 = id@mb2 // オブジェクトID が必要な場合 ; メッセージボックスに先ほどの長いテキストを反映 settxt h1,buf mes " ↑追記してもサイズは反映されます" ; メッセージボックスのテキストをbuf2に格納 ;gettxt h1,buf2 repeat title "メッセージボックスの現在のテキストサイズ "+getsize(h1)+" bytes" wait 12 loop



UNGA

リンク

2011/1/7(Fri) 23:22:19|NO.36561

 解決しました!なるほど、WM_GETTEXTLENGTH WM_GETTEXT WM_SETTEXTを使えば
よかったんですね。EM_で始まるメッセージばかり探していたので気づきません
でした。大変ありがとうございました。
 ところで、迷惑ついでにもう一つ教えてください。mesboxの第1パラメータの
変数というのは、内部ではどのように扱われているんでしょうか。WM_SETTEXTで
変数のポインタを渡すのとどう違うのでしょう。



UNGA

リンク

2011/1/23(Sun) 15:19:25|NO.36714

ありがとうございました。



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