goo

設定(INI)ファイルの使用

一覧リスト:HSP Ver2.61ブログ関連その他 ・・・ 人気blogランキング

設定(INI)ファイルの使用
設定ファイルにウィンドウのサイズやユーザー設定データなどを
読込、保存することができます。
また、「onexit」命令を使用することで、
プログラム終了前に処理が可能です。
保存ファイル例)
[window]
x=100
[player]
age=20
[ ]の部分をセクションと呼びその下の部分のキーに
保存したい値を保存します。
セクションはキーのタイトルみたいなものです。

◆設定ファイル使用例
  1. 「llmod.as」をインクルードする。
    (APIを使用するため)
  2. 「dllproc」命令を使って、
    「GetPrivateProfileStringA」「GetPrivateProfileIntA」関数で
    ファイルを読み込み、
    「WritePrivateProfileStringA」関数で
    ファイルを保存します。
◆機能
文字列をファイルから読み込みます。
dllproc "GetPrivateProfileStringA",prm,6,D_KERNEL
パラメータ 6
prm.0=セクション名(文字列のポインタ)
prm.1=キーの名前(文字列のポインタ)
prm.2=ファイルにキーが見つからなかった時の
    デフォルト文字列(文字列のポインタ)
prm.3=キーのデータを格納する変数(ポインタ)
prm.4=prm.3のサイズ
prm.5=読み込むファイル名(文字列のポインタ)

◆機能
数値をファイルから読み込みます。
dllproc "GetPrivateProfileIntA",prm,4,D_KERNEL
パラメータ 4
prm.0=セクション名(文字列のポインタ)
prm.1=キーの名前(文字列のポインタ)
prm.2=ファイルにキーが見つからなかった時の
    デフォルト数値
prm.3=読み込むファイル名
戻り値にキーの数値が入っています。

◆機能
文字列をファイルに保存します。
dllproc "WritePrivateProfileStringA",prm,4,D_KERNEL
パラメータ 4
prm.0=セクション名(文字列のポインタ)
prm.1=キーの名前(文字列のポインタ)
prm.2=保存したい文字列(文字列のポインタ)
prm.3=保存するファイル名(文字列のポインタ)
※数値を保存する関数はありません。

設定ファイルを使用したサンプル
※一度EXEファイルを作成してから実行してください。
また、そのフォルダにinitest.iniファイルが作成されます。
作成されるのは一度起動して終了してからです。
2回起動しないとダイアログは表示されません。
#include "llmod.as"
#define INIFILE exedir+"initest.ini"
    screen 0,160,25
    title "どちらですか?"
    objsize winx/2,25
    pos        0 , 0 : button "男性",*men
    pos winx/2 , 0 : button "女性",*women

    //INIファイルの読込
    sdim section,8
    sdim key,8
    sdim sex,8
    sdim filename,1024
    section="USER" : getptr prm.0,section
    key="sex" : getptr prm.1,key
    prm.2=0
    sex="" : getptr prm.3,sex
    prm.4=8
    filename=INIFILE : getptr prm.5,filename
    dllproc "GetPrivateProfileStringA",prm,6,D_KERNEL

    if sex!=""{
        dialog "あなたは"+sex+"ですね?"
    }
    //終了処理でINIファイルに保存します。
    onexit *endapli
stop

*men
sex="男性"
stop

*women
sex="女性"
stop

//終了処理
*endapli
    section="USER" : getptr prm.0,section
    key="sex" : getptr prm.1,key
    getptr prm.2,sex
    filename=INIFILE : getptr prm.3,filename
    dllproc "WritePrivateProfileStringA",prm,4,D_KERNEL
end
コメント ( 0 ) | Trackback ( 0 )

テキスト検索ソフト(仮) - 8

一覧リスト:HSP Ver2.61ブログ関連その他 ・・・ 人気blogランキング

テキスト検索ソフト(仮) - 8
EDITBOXの作成とファイルの保存


  1. 「mesbox」から自作のEDITBOXに変更。
    フォーカスが消えないEDITの作成参照)
    mesboxへの命令を変更。
  2. ファイルの保存と設定のボタンを追加。
    設定ボタンは未完成。
  3. 画像ファイルが無くてもエラーがでないようにした。

☆実行画面



☆ソースコード
ソフト名:未定
HSP Ver:2.61
内容:任意のテキストを検索
btnimg01.JPG(60×20)
    #include "llmod.as"
    #include "misc.as"

    #define BUTTONIMG "btnimg01.JPG"

    exist BUTTONIMG
    if strsize!=-1{
        btnflag=1
        buffer 2 : picload BUTTONIMG
    }
    else{
        btnflag=-1
    }

    screen 0,dispx,dispy
    width 200,340
    title "テスト"

    mref bmscr,67
    prm = bmscr.13 , -16
    dllproc "GetWindowLongA", prm, 2, D_USER    
    prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000
    dllproc "SetWindowLongA", prm, 3, D_USER

    wndx=winx : wndy=winy
    //クライアントエリアをグレーに塗りつぶし
    color 192,192,192 : boxf
    objsize 20,20
    pos 0,0 : button "開",*fileopen  //ID:0
    if btnflag=1 : btnimg 0,2,0,0,20,20
    pos 40,0 : button "選",*textselect  //ID:1
    if btnflag=1 : btnimg 1,2,20,0,20,20
    sdim ftext,64 : pos 60,0 : input ftext,100,20,64 //ID:2
    pos 160,0 : button "調",*find  //ID:3
    if btnflag=1 : btnimg 3,2,40,0,20,20
    listno=-1 : listno2=-1
    sdim listdata,1024
    listx=winx-3
    objsize listx,320
    pos 0,20 : listbox listno,0,listdata  //ID:4
    sdim str1,1024
    sdim str2,1024
    sdim editdata,65536
    sdim editdata2,65536
    
    //EDITBOX作成
    prm=0x0200
    str1="EDIT" : getptr prm.1,str1
    prm.2=0,0x503001c4,winx,0,0,0,bmscr.13
    prm.9=3000,bmscr.14,0
    dllproc "CreateWindowExA",prm,12,D_USER
    heditbox=dllret
    //EDITの状態変数
    mbflag=0
    objsize 20,20
    pos 20,0 : button "書",*filesave  //ID:5
    if btnflag=1 : btnimg 5,2,60,0,20,20
    pos 180,0 : button "設",*setting  //ID:6
    if btnflag=1 : btnimg 6,2,80,0,20,20
    onclick *clk

*main
    if (winx!=wndx) | (winy!=wndy){
        _hspobjhandle 2
        prm=stat,60,0,winx-100,20,1
        dllproc "MoveWindow",prm,6,D_USER
        _hspobjhandle 3
        prm=stat,winx-40,0,20,20,1
        dllproc "MoveWindow",prm,6,D_USER

        _hspobjhandle 6
        prm=stat,winx-20,0,20,20,1
        dllproc "MoveWindow",prm,6,D_USER

        listx+=winx-wndx
        _hspobjhandle 4
        if listx>0{
            prm=stat,0,20,listx,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            prm=heditbox,listx+4,20,winx-(listx+4),winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        else{
            prm=stat,0,20,0,0,1
            dllproc "MoveWindow",prm,6,D_USER
            prm=heditbox,4,20,winx-4,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        wndx=winx : wndy=winy
    }
    if listno2!=listno{
        notesel listdata : noteget str1,listno
        getstr str1,str1,1,']':int str1 : str1--
        notesel editdata : noteget str2,str1
        instr tmp.0,str2,ftext,0
        strlen tmp.1,ftext
        prm=hedit,0xBB,str1,0
        dllproc "SendMessageA",prm,4,D_USER
        tmp.0+=dllret : tmp.1+=tmp.0
        prm=hedit,0xB1,tmp.0,tmp.1
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xB7,0,0
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xCE,0,0
        dllproc "SendMessageA",prm,4,D_USER
        str1=(str1-dllret)/2
        prm=hedit,0xB6,0,str1
        dllproc "SendMessageA",prm,4,D_USER

        str str1
        listno2=listno
    }
        wait 10
goto *main

/////////////////////////////////////////////////////////
// クリックが押された時(onclick)
*clk
    //左クリックされたとき
    if wparam=1{
        ginfo 0 : x=prmx
        repeat
            //ボタンを押していない時はループを抜けます
            stick st,256
            if st!=256 : break

            ginfo 0
            if prmx!=x{
                tmp=listx+prmx-x
                //クライアント領域が残るようにする
                if (tmp>=0) & (tmp < (winx-3)){
                    listx=tmp
                    _hspobjhandle 4
                    prm=stat,0,20,listx,winy-20,1
                    dllproc "MoveWindow",prm,6,D_USER
                    prm=heditbox,listx+4,20,winx-(listx+4),winy-20,1
                    dllproc "MoveWindow",prm,6,D_USER
                    x=prmx
                }
            }
            wait 1
        loop
    }
goto *main

*fileopen
    dialog "*",16,""
    if stat=1{
        exist refstr
        if strsize < 0:goto *main
        if strsize > 65536:goto *main
        _hspobjhandle 5:hedit=stat
        //mesbox,listboxを移動
        if mbflag=0{
            _hspobjhandle 4
            listx=winx/2
            prm=stat,0,20,listx,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            prm=heditbox,listx+4,20,winx-(listx+4),winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            mbflag=1 : hedit=heditbox
        }
        notesel editdata:noteload refstr
        prm=heditbox,0x000C,0
        getptr prm.3,editdata
        dllproc "SendMessageA",prm,4,D_USER
    }
    gosub *findlist
goto *main


*filesave
        dialog "",17,""
        if stat!=0{
            prm=heditbox,0x000D,65536
            getptr prm.3,editdata
            dllproc "SendMessageA",prm,4,D_USER
            notesel editdata : notesave refstr
        }
goto *main

*setting
    dialog "未完成"
goto *main

*textselect
    gsel 0,-1
    screen 3,400,225 : title "テキストを左クリックして下さい"
    gsel 3,2
    cls 1
    pos 2,3 : mes "取得テキスト:"
    pos 0,25 : mesbox editdata2,400,200
    objsize 60,25
    pos 260,0 : button "決定",*wnd3ok
    pos 330,0 : button "取消",*wnd3cancel
    mref bmscr,67

    *wnd3loop
        stick st,0,0
        prm=0 : dllproc "GetForegroundWindow",prm,0,D_USER
        if st=256 &(bmscr.13!=dllret){
            ginfo 0
            prm=prmx,prmy
            dllproc "WindowFromPoint",prm,2,D_USER
            hedit=dllret
            if dllret!=0{
                prm=hedit,0x000D,65536
                getptr prm.3,editdata2
                dllproc "SendMessageA",prm,4,D_USER
                objprm 0,editdata2
            }
        }
        wait 10
    goto *wnd3loop

*wnd3ok
    //mbflagが1の時はmesboxを隠す
    if mbflag=1{
        gsel 0 : width listx+4 : objprm 5,""
        mbflag=0
    }
    editdata=editdata2
    gosub *findlist

*wnd3cancel
    gsel 3,-1 : gsel 0,1
goto *main

*find
    gosub *findlist
goto *main

*findlist
    notesel editdata : notemax tmp
    listdata=""
    repeat tmp
        notesel editdata : noteget str1,cnt
        instr tmp,str1,ftext,0
        if tmp!=-1{
            getstr str1,str1,tmp,''
            tmp=cnt+1
            notesel listdata : noteadd "["+tmp+"] "+str1,-1
        }
    loop
    objprm 4,listdata
return
コメント ( 0 ) | Trackback ( 0 )

システム変数

一覧リスト:HSP Ver2.61ブログ関連その他 ・・・ 人気blogランキング

システム変数
プログラムが実行された時に用意されている変数です。
通常、この変数は変更できません。
読み取り専用です。(※モジュール内では変更可能)
システム変数
一般
stat色々な命令のステータスなど
コマンド
cmdlineコマンドラインに渡された引数の文字列
エラー
errエラーコード
画面
dispxディスプレイの X 方向解像度
dispyディスプレイの Y 方向解像度
winy現在のウィンドウ描画エリア Y サイズ
winx現在のウィンドウ描画エリア X サイズ
位置
csrxカレントポジションの X 座標
csryカレントポジションの Y 座標
prmxginfo 命令で取得される X 値
prmyginfo 命令で取得される Y 値
rvalRGB カラーの R (赤) 輝度情報
gvalRGB カラーの G (緑) 輝度情報
bvalRGB カラーの B (青) 輝度情報
paluseWindows がパレットモードかどうか
マウス
mousexマウスカーソルの X 座標
mouseyマウスカーソルの Y 座標
ファイル
exedir起動した EXE ファイルのあるディレクトリ
windirWindows がインストールされているディレクトリ
curdirカレントディレクトリパス
refstrファイル選択ダイアログで選択されたファイル名
変数
strsizegetstr 命令で読み出したバイト数
ループ
looplevrepeat~loop のネストレベル
cntrepeat~loop ループのカウンター
ネスト
sublevサブルーチンのネストレベル
割込
iparam割り込み要因を示す値
lparam割り込み時の lParam
wparam割り込み時の wParam
情報
hspstatHSP ランタイムの情報を取得する
以下の情報がすべて合計された値になります。
( デバッグモード = 1 )
( IMEが有効 = 2 )
( Macintosh版HSP = $80 )
( IMEをサポートしないOS = $100 )
hspverHSP のバージョン番号
バージョンコード + マイナーバージョンコード
の値になります。
(2.61は$0261になる)
コメント ( 0 ) | Trackback ( 0 )

「mes」は簡単?

一覧リスト:HSP Ver2.61ブログ関連その他 ・・・ 人気blogランキング

「mes」
昔のプログラム入門の最初は、
「Hello World」と出力させることが有名(?)でした。

HSPでは簡単です。mes "Hello World":stop
わずか22文字。
そこで、いろいろな方法で「mes」命令を実行してみます。

◆「mes」使用時の注意点
  1. 「mes」の最初に数字または、整数変数を指定すると
    次に文字列を連結できません。
    その場合は空白の""を前につけます。(整数と文字列を混合する場合)

    例)
    ×a=100 : mes a+"円"     → 100
    ○a=200 : mes ""+ a+"円"   → 200円
    mes 100+200           → 300
    mes ""+100+200        → 100200
  2. 「font」命令を使用して色々な文字、サイズを表示可能です。
    ◆書式
    font "fontname",p1,p2
    p1=1~99(12) : フォントの大きさ
    p2=0~(0) : 以下スタイルの和
    スタイル 1 太文字
    スタイル 2 イタリック体
    スタイル 4 下線
    スタイル 8 打ち消し線
    スタイル16 アンチエイリアス
    フォントの大きさ99までとHSPヘルプにはありますが・・・
    10000を指定しても表示されました。
  3. 「pos」命令で表示位置を指定できます。
    ◆書式
    pos p1,p2
    p1,p2 : カレントポジションのX,Y座標
    p1,p2にはマイナスも指定可能です。
    ※フォントサイズ10000もマイナス指定で端だけ表示してみました。
    「mes」を使用したときに自動的に改行された値が
    カレントポジションに代入されます。
  4. 「color」命令で文字の色を指定できます。
    ◆書式
    color p1,p2,p3
    p1,p2,p3=0~255(0) : 色コード(R,G,Bの輝度)
    color のみは引数が0,0,0となり黒を意味します。
  5. 「text」でmesのテキスト表示のスピードを変更することができます。
    ◆書式
    text p1
    p1=0~(0) : メッセージ表示スピード
  6. 表示メッセージとは関係ありませんが、
    「boxf」命令はクライアントエリアを「color」で指定した色で
    矩形(四角形)で塗りつぶします。
    「mes」の背景色として使います。
    ◆書式
    boxf p1,p2,p3,p4
    p1,p2 : 矩形の左上X,Y座標
    p3,p4 : 矩形の右下X,Y座標
    boxfのみはクライアントエリア全てを塗りつぶします。
    boxfで塗りつぶしてからmesで表示した時、colorの指定を忘れると
    boxfと同じ色でmesが表示される為に文字が見えません。
2、3、4、5は一度設定すれば同じウィンドウに限りずっと有効になります。
以前何色に変えたっけ?フォントなんだっけ?などの場合は
mesの度に指定してあげるのも良いかと思います。


サンプル1は背景黒、文字色白で「mes」表示しています。

サンプル2は文字をずらして2回表示させることで
立体的?に見せています。

サンプル3の落書きのような物も「mes」で
フォントのサイズ変更などして描いたものです。

サンプル4は一度「buffer」に
サンプル2と同じように出力させて
「gzoom」で変換しています。

実行結果
サンプル 一覧
//////////////////////////////////
//サンプル1
    screen 0,160,60
    title "mes サンプル 1"
    font "MS ゴシック",12
    color 0,0,0 : boxf
    color 255,255,255 : pos 10,10
    mes "位置 10,10"
    mes "MS ゴシック 12"
    mes "color 255,255,255"
stop

//////////////////////////////////
//サンプル2
    screen 0,160,60
    title "mes サンプル 2"
    font "MS 明朝",30,3
    color 230,230,230: boxf
    color 128,128,128: boxf 2,2,winx,winy
    color 192,192,192: boxf 2,2,winx-2,winy-2
    color 0,0,80 : pos 18,16
    mes "立体的?"
    color 0,0,255 : pos 17,15
    mes "立体的?"
stop

//////////////////////////////////
//サンプル3
    screen 0,160,60
    title "mes サンプル 3"
    color 0,255,255
    boxf 0,0,160,35
    font "MS ゴシック",16
    pos 40,8 :color 128,0,0
    mes "1"
    font "MS ゴシック",8
    pos 48,8 :color 128,255,255
    mes "●"
    font "MS ゴシック",10
    pos 50,6 :color 128,255,255
    mes "●"
    font "MS ゴシック",14
    pos 55,4 :color 128,255,255
    mes "●"
    font "MS ゴシック",18
    pos 62,0 :color 128,255,255
    mes "●"
    font "MS ゴシック",16
    pos 35,18 :color 128,0,0
    mes "■"
    font "MS ゴシック",40
    pos 20,20 : color 255,32,32
    mes "▼"
    color 32,32,255
    boxf 0,35,160,60
    font "MS ゴシック",160
    pos 90,10 : color 0,255,64
    mes "●"
    font "MS ゴシック",240
    pos 60,25 : color 128,128,0
    mes "●"
stop

//////////////////////////////////
//サンプル4
    buffer 2,260,80
    color : boxf
    font "MS ゴシック",64,1
    color 128,128,0 : pos 7,16
    mes "遠近法!"
    color 255,255,0 : pos 3,12
    mes "遠近法!"
    screen 0,160,60
    color : boxf
    repeat 260
        pos cnt+20,5
        gzoom 1,60-(cnt/3),2,cnt*2,0,1,80
    loop
    title "mes サンプル 4"
stop
コメント ( 0 ) | Trackback ( 0 )