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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1014
puw2notegetで32767bytes以上の行データを取得8解決


puw2

リンク

2012/10/14(Sun) 00:55:17|NO.49981

2011/1/3(Mon) 00:13:15NO.36512
過去ログを見たらわかると思ったのですが。
32767bytesで切れてしまうのはHSPのmesboxの問題なので、
回避するモジュールを書いてみました。
------------------------------------
過去の掲示版より参照
このモジュールで
指定行を読み込み
noteget p1,p2  
相当の命令を教えてください。
作成したい事は最大1行30文字で5000行以上のテキストから1行づつインデックスで
取出したいのですが



この記事に返信する


暇人

リンク

2012/10/14(Sun) 01:34:45|NO.49982

ん?
問題なのは標準のmesboxで
note系命令には関係ないよ?

; メッセージボックスのテキストをbuf2に格納 gettxt h1,buf2 notesel buf2 noteget a,3000



puw2

リンク

2012/10/14(Sun) 01:43:40|NO.49983

メッセージボックスの制約なのか解りませんが
noteget a,3000を実行しても空行です。noteget a,1でも空行です。
回避するモジュールには対応していないと思います。



暇人

リンク

2012/10/14(Sun) 01:54:51|NO.49984

notegetの使い方が間違ってるとしか思えない
こっちでは5000行にしても問題なくnoteget出来てる

noteselで指定したバッファにテキストが入ってるか確認
モジュールどうこうは関係ない
note系で扱うのはテキストバッファでメッセージボックスは無関係



puw2

リンク

2012/10/14(Sun) 21:24:43|NO.49996

;動作確認スクリプトです。 
#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
mesbox2 640,320,1,0
h1 = stat // ハンドルを保存
; objid1 = id@mb2 // オブジェクトID が必要な場合

; メッセージボックスに先ほどの長いテキストを反映
settxt h1,buf

mes " ↑追記してもサイズは反映されます"

; メッセージボックスのテキストをbuf2に格納
;gettxt h1,buf2
/*
repeat
title "メッセージボックスの現在のテキストサイズ "+getsize(h1)+" bytes"
wait 12
loop
*/
notesel buf
index=notemax
noteget buf1, index ;1行取出し
mes "index="+index
mes "buf1="+buf1

;loopより後へ追加



暇人

リンク

2012/10/14(Sun) 21:37:18|NO.49997

あぁ、3000行目(実際には3001行目)は改行になってて見えないだけ
299行目とりだしてみ
自分は5千行に変えてやってたから3000行目も見れてた



puw2

リンク

2012/10/14(Sun) 21:46:22|NO.49998

再確認です。index=notemaxを使用した時は空行です。index=1に代入した時はOKです。
notesel buf
index=notemax
noteget buf1, index ;1行取出し NG
// noteget buf1, 1 ;1行取出し OK
mes "index="+index
mes "buf1="+buf1

noteget buf1, 5999 ;1行取出し OK
mes "buf1="+buf1



puw2

リンク

2012/10/14(Sun) 21:50:07|NO.49999

notemax-1 解りました。これで1歩前進出来ます。有難うございました



暇人

リンク

2012/10/14(Sun) 22:04:48|NO.50000

ちょっと間違った
notegetのインンデックスは0からなので
一行目を取り出すのは0を指定するが
notemaxは全体の行数になるので
インデックス的にはnotemax-1が最終行



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