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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0506
つれづれねこ代入文字列の改行方法について8未解決


つれづれねこ

リンク

2012/5/6(Sun) 14:47:29|NO.46487

文字列を指定文字数、
ここでは13文字で分割して取り出す

方法は以下のスクリプトで
合っているでしょうか。

あと、これで分割された
文字列に改行コードを

挿入するにはどうすれば
いいのでしょうか。

ご指導よろしくお願いします。



onkey goto *inkey pos 2,378 data="" mes strmid(data, 0,13) sdim buf1 sdim buf2 index = 0 cut = 13 cnvstow buf1, data memcpy buf2, buf1, cut * 2, , index * 2 i = cnvwtos(buf2) mesbox i,636,100,5,2500 objprm 0,i



この記事に返信する


玄冬

リンク

2012/5/6(Sun) 15:36:26|NO.46489

>文字列を指定文字数、ここでは13文字で分割して取り出す方法は以下のスクリプトで合っているでしょうか。
*inkeyで何してるのかがわからないのでわかりません。↓こういうことがしたいのでしょうか?

#const split_n 13 ;1行あたりの文字数 button "改行", *split_row v_str="" v_rstr = "" input v_str,300,20 mesbox v_rstr,636,100,5,2500 v_id = stat stop *split_row sdim a_row,split_n*2,0 repeat strlen(v_str)/split_n+(0<(strlen(v_str)\split_n)) a_row(cnt) = strmid(v_str,cnt*split_n,split_n) loop v_rstr = "" foreach a_row v_rstr += a_row(cnt) + "\n" loop v_rstr = cnvwtos(v_rstr) ;なぜ入力がunicode想定? objprm v_id, v_rstr



つれづれねこ

リンク

2012/5/6(Sun) 16:11:07|NO.46491

申し訳ないです。*inkey部分はこうなっています。
>なぜ入力がunicode想定?
文字列に半角と全角の文字が
混ざってるときのための対策です。



*ao stop *inkey if iparam=229 : goto *ao if iparam=13 : goto *ok goto *ao *ok color 255,255,255:boxf 30,60,370,238 color 0,0,0:pos 30,60 font "MS ゴシック" , 24 , 1 mes i await 50 goto *hyouji



つれづれねこ

リンク

2012/5/7(Mon) 12:20:52|NO.46497

提示されたスクリプトでは文字化けするので
自分なりにやってみましたが
これでいいのでしょうか?

自動改行がうまくいってないようですけど・・・
入力はEnterで、改行がカーソルの
左右になっているようで変です。


screen 0 , 640 , 480 , 0 , 0 , 0 , 640 , 480 celload "skin_m.bmp" , 1 , 0 redraw 0 color 0,0,0 boxf gmode 2 pos 0,0 celput 1 redraw 1 ; メイン画像の配置 dialog "bmp;*.jpg", 16, "ガゾウファイル" buffer 2 picload refstr gsel 0 pos 457,195 celput 2 ; 吹き出し画像の配置 celload "hukidashi.gif", 3 gmode 2 pos 4,33 celput 3 ; メッセージBOXの配置 onkey goto *inkey sdim data , 30000 , 4 pos 2,378:data="" a = strmid( data , 0 , 15) b = strmid( data , 13 , 15) mesbox a , 636,100 , 5 , 28+"\n" *hyouji objprm 0,a+"\n" objprm 0,b+"\n" stop *ao stop *inkey if iparam=229 : goto *ao if iparam=13 : goto *ok goto *ao *ok color 255,255,255:boxf 30,60,370,238 color 0,0,0:pos 30,60 font "MS ゴシック" , 24 , 1 mes a await 50 goto *hyouji



TMKL

リンク

2012/5/7(Mon) 20:28:01|NO.46504

手持ちにあった
「一文字ずつ表示する命令」に、
「13文字目なら改行」を足して、
「mes13」と名付けただけのサンプル

一応動きますが、無駄が多いです
どうしても自分で出来なかったら、改造して使ってください


#module #deffunc mes13 str p1 string=p1;文字列 string_index=0;切り出し線の位置 string_length=strlen(string);文字列の長さ sdim temp,string_length+100;書置きスペースを文字列の長さ+100文字分確保 k=0 y=ginfo(23);カレントポジションのy座標 repeat code=peek(string,string_index);文字コードゲット ;半角なら1、全角なら2をstepに代入 step=((code >= 129 & code <= 159) | (code >= 224 & code <= 252))+1 if (cnt\13=0) & (cnt!0):temp+="\n":k+=2;もし13文字なら改行追加 ;半角なら1文字、全角なら2文字切り取って、 ;書置きに入力 poke temp,string_index+k,strmid(string,string_index,step) ;切り出し線を半角なら1文字、全角なら2文字移動 string_index+=step ;切り出し線が文字列の最後まで来たら終了 if string_index >= string_length:break loop pos ,y:mes temp;書置きの文字を表示 return #global mes13 "あいうえおかきくけこさしすせそたちつてとなにぬねのまみむめもabcdefghijklmnop" stop



暇人

リンク

2012/5/7(Mon) 21:41:14|NO.46508

質問は指定文字数に改行を入れるだけど
入力に応じてmesboxにもその改行した文字列を使うなら
色々面倒(改行がどんどん増えたりobjprm使うとカーソルが開始位置に戻ったり)


mesboxの方に改行位置設定、改行命令送って
mesboxと同じ見た目になる文字列を受け取る
って方法



#uselib "user32" #func GetWindowText "GetWindowTextA" int, var, int mb_margin=3 //メッセージボックス文字表示マージン(左端からのドット数) mb_fsiz=20 //メッセージボックスフォントサイズ mb_sizx=636 //メッセージボックスXサイズ mb_sizy=100 //メッセージボックスYサイズ cut = 13 //改行文字数(全角1文字で1 半角2文字で1) pos 2,378 objmode 2 //オブジェクトフォント変更準備 font "MS ゴシック" , mb_fsiz , 0 data="" mesbox data,mb_sizx,mb_sizy,1,2500 mb_id=stat sendmsg objinfo(mb_id,2), $D3, 1, mb_margin //メッセージボックス文字表示マージン設定(左) //改行位置(文字サイズとmesboxの幅、マージンから位置計算)//<<16は上位ワードに設定する必要があるから sendmsg objinfo(mb_id,2), $D3, 2, (mb_sizx-mb_margin-((mb_fsiz+mb_fsiz\2+1)*(cut)+cut))<<16 //メッセージボックス文字表示マージン設定(右) onkey goto *inkey stop *hyouji objprm mb_id,"" //mesboxの内容がdata変数含めて変更される *ao stop *inkey if iparam=229 : goto *ao if iparam=13 : goto *ok goto *ao *ok color 255,255,255:boxf 30,60,370,238 color 0,0,0:pos 30,60 font "MS ゴシック" , 24 , 0 sendmsg objinfo(mb_id,2), $00C8, 1,0 //ソフト改行を入れる(data内は変化しない) sdim buf1,strlen(data)*2//ソフト改行が追加されたテキストを取得するから多めに確保(GetWindowTextLengthの代わり) GetWindowText objinfo(mb_id,2),buf1,strlen(data)*2 //ソフト改行が追加されたテキストを取得 sendmsg objinfo(mb_id,2), $00C8, 0,0 //ソフト改行を削除 index=0 repeat i=instr(buf1,index,"\r\n") //ソフト改行(CR CR LF)を検索 if i>0{//ソフト改行あり poke buf1,index+i,' '//先頭のCR部分をスペースと置き換え }else{//ソフト改行なし break } index+i+3 //フト改行までのインデックスとコード分の3バイトを進ませる loop mes buf1 await 50 goto *hyouji



GENKI

リンク

2012/5/7(Mon) 23:28:10|NO.46512

> >なぜ入力がunicode想定?
> 文字列に半角と全角の文字が
> 混ざってるときのための対策です。

Shift_jisのままでも_mbsbtype関数ってのがありますよ。

スレをろくすっぽ読まずに資料をペタリ。
http://hspdev-wiki.net/?String%2F%B2%FE%B9%D4
改行コード挿入モジュールはこれでよかったのかな。



ヂオン

リンク

2012/5/9(Wed) 19:45:04|NO.46552


#module // 改行を見つけた場合 // 指定数の文字をカウントした場合 // ヌル文字を見つけた場合に 文字列を分割して改行を追加します。 // tx_ 分割する文字列変数 // n_ 分割する文字数 //[戻り値] // コンバートされた文字列 #define ctype IsWchar(%1) ((%1>=129 & %1<=159) or (%1>=224 & %1<=252)) #defcfunc nsplit var tx_ , int n_ , local tgt_ , local count_ _rt ="" _len =strlen(tx_) memexpand tx_,_len+2 // バッファオーバーフロー回避 repeat _len+1 // NULL文字を読み込み w=wpeek(tx_,cnt) // ワイド文字読み込み c=w&0xff // そのlobyte を読み込み is_linebreak = (w==0x0a0d) // 改行判定 _size = (IsWchar(c) or is_linebreak)+1 // 文字のサイズを算出 if(is_linebreak){ // 改行である場合 gosub *add:tgt_=cnt+_size }else{ // そうでない場合 if(count_==n_)or(c==0){gosub*add:tgt_=cnt} count_++ } continue _size+cnt loop return _rt *add _rt+=strmid(tx_,tgt_,cnt-tgt_)+"\n" count_=0 return #global tx={" 123 1231231 23 1231 23 11223 3gogogoggoごごごごごごg ts1 ts2 ts3"} mes nsplit(tx,3)



ヂオン

リンク

2012/5/9(Wed) 19:58:32|NO.46554

文字列をhsp ウィンドウ上に描画したいだけでしたら DrawText 関数を使用するという方法もあります。


tx={"もしかしたら DrawText 関数を使用する事で、解決できるかもしません。 DrawText関数とは user32.dll に登録されている 関数で 文字通り 文字を 描画します。 hsp では user32.as を インクルードする事で使用できます。 指定した四角形内で自動的に改行してくれるほか、禁則処理等も自動で行ってくれるので、文字列を成形して表示したい場合などに便利です。"} #include "user32.as" rc = 20,20,250,ginfo_winy-20 color 200,200,255 boxf rc,rc.1,rc.2-1,rc.3-1 color font MSGOTHIC,16 DrawText hdc,varptr(tx),-1,varptr(rc),0x10/*DT_WORDBREAK*/ redraw



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