|
|
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
|
|
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

| |
|
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
|
|