HSP3 プログラミングの基礎X
前へ 目次へ 次へ 

(3) スクリーンセーバー 3

◎ 設定(コンフィグ)

 スクリーンセーバーの動作に関する設定などを行う。例えば、表示する文字列を「SCREEN SAVER」から別の文字列に、表示する個数を設定できる、などである。
 ただし、設定のウィンドウは[設定(T)]ボタンをクリックすると"ssaver /c"で起動されて、設定が終了するとプログラムも終了してしまうので、設定したデータはどこにも残らない。設定したデータはディスクやレジストリなどに保存しておかなければならない。
 ここでは、メモリノートパッドを利用して設定したデータをファイルとして保存する方法でプログラムを作成していくことにする。

 ここまでのサンプルでは、文字列や個数のデータを変更できるようにはなっていない。まずは、データを変更できるようにする。


サンプル(ssaver05.hsp)
 表示個数(回数)と表示メッセージが変更できるようにする。

;ssaver05.hsp
#packopt name "screensaver"     ;実行ファイル名
#packopt type 2                 ;スクリーンセーバー
    randomize
    para = dir_cmdline          ;パラメータ取得
    para = strmid(para, 0, 2)
    if para = "/p" | para = "/P" : goto *preview    ;プレビュー
    if para = "/s" | para = "/S" : goto *ssaver         ;フルスクリーン
    if para = "/c" | para = "/C" : goto *config         ;コンフィグ
    dialog "無効なオプションです。" + "[" + para + "]"
    end
*config
    mes "CONFIG"
    stop
*preview
    win_x = ginfo_winx          ;ウィンドウサイズ(幅)
    win_y = ginfo_winy          ;ウィンドウサイズ(高さ)
    font "MS ゴシック", 12
    goto *ssmain
    stop
*ssaver
    win_x = ginfo_dispx         ;ディスプレイサイズ(幅)
    win_y = ginfo_dispy         ;ディスプレイサイズ(高さ)
    bgscr 1, win_x, win_y   ;枠なしのウィンドウ
*ssmain
    notesel cfg         ;メモリノートパッド設定
    exist "screensaver.dat"     ;設定データファイル
    if strsize = -1 {       ;ファイルなし
        kaisu = 20
        moji = "SCREEN SAVER"
    } else {        ;ファイルあり
        noteload "screensaver.dat"
        noteget dd, 0   ;回数(文字型)
        noteget moji, 1 ;文字列
        kaisu = 0 + dd  ;数値変換
    }
*ssmain2
    color 0, 0, 0       ;黒色
    boxf    ;画面消去(四角塗りつぶし)
    repeat kaisu
        color rnd(255), rnd(255), rnd(255)      ;文字色
        pos rnd(win_x), rnd(win_y)
        mes moji
        stick key       ;test
        if key = 128 : end      ;test
        await 500
    loop
    goto *ssmain2
    end

実行起動オプションに"/s"を設定してから実行する。これまでと変わらず「SCREEN SAVER」と表示される。

 プログラムは、ラベル*ssmain以降がスクリーンセーバー本体の処理である。前のサンプルとは、それ以外の部分に変更はない。

 exist命令はファイルのサイズを調べる命令である。結果はシステム変数strsizeに格納される。ファイルが存在しなければシステム変数strsizeに-1が格納される。
 サンプルでは、設定データファイルscreensaver.datがなければ、変数kaisuを20、変数mojiを"SCREEN SAVER"にして動作し、ファイルがあれば読み込んで変数kaisuとmojiにデータを設定して動作するようにしている。

試してみようメモ帳などで設定データファイルscreensaver.datを作成する。1行目に数字(回数)、2行目に表示するメッセージを入力して、サンプルと同じフォルダに保存してから実行する。メッセージと表示個数が変わればOKである。



 設定画面では、表示回数と表示メッセージを設定するだけである。
 設定画面作成中は起動オプションに"/c"を設定して実行するとよい。


サンプル(ssaver06.hsp)
 表示個数(回数)と表示メッセージが変更できるようにする。

;ssaver06.hsp
#packopt name "screensaver"     ;実行ファイル名
#packopt type 2                 ;スクリーンセーバー
#packopt xsize 320
#packopt ysize 120
    randomize
    para = dir_cmdline          ;パラメータ取得
    para = strmid(para, 0, 2)
    if para = "/p" | para = "/P" : goto *preview    ;プレビュー
    if para = "/s" | para = "/S" : goto *ssaver         ;フルスクリーン
    if para = "/c" | para = "/C" : goto *config         ;コンフィグ
    dialog "無効なオプションです。" + "[" + para + "]"
    end
;設定画面 -----
*config
    title "スクリーンセーバー"
    notesel cfg
    exist "screensaver.dat"     ;設定データファイル
    if strsize = -1 {       ;ファイルなし
        skaisu = "20"
        moji = "SCREEN SAVER"
    } else {                ;ファイルあり
        noteload "screensaver.dat"
        noteget skaisu, 0   ;回数(文字型)
        noteget moji, 1     ;文字列
    }
    pos 10, 8 : mes "表示回数"  ;設定画面作成
    pos 100, 8 : input skaisu
    pos 10, 40 : mes "メッセージ"
    pos 100, 40 :input moji, 200
    pos 240, 80 : button "OK", *settei
    stop
*settei
    noteadd skaisu, 0, 1
    noteadd moji, 1, 1
    notesave "screensaver.dat"      ;設定データファイル書き込み
    end
;プレビュー画面 -----
*preview
    win_x = ginfo_winx          ;ウィンドウサイズ(幅)
    win_y = ginfo_winy          ;ウィンドウサイズ(高さ)
    font "MS ゴシック", 12
    goto *ssmain
    stop
;スクリーンセーバー本体 -----
*ssaver
    win_x = ginfo_dispx         ;ディスプレイサイズ(幅)
    win_y = ginfo_dispy         ;ディスプレイサイズ(高さ)
    bgscr 1, win_x, win_y   ;枠なしのウィンドウ
*ssmain
    notesel cfg         ;メモリノートパッド設定
    exist "screensaver.dat"     ;設定データファイル
    if strsize = -1 {       ;ファイルなし
        kaisu = 20
        moji = "SCREEN SAVER"
    } else {            ;ファイルあり
        noteload "screensaver.dat"
        noteget dd, 0   ;回数(文字型)
        noteget moji, 1 ;文字列
        kaisu = 0 + dd  ;数値変換
    }
*ssmain2
    color 0, 0, 0       ;黒色
    boxf    ;画面消去(四角塗りつぶし)
    repeat kaisu
        color rnd(255), rnd(255), rnd(255)      ;文字色
        pos rnd(win_x), rnd(win_y)
        mes moji
        ;stick key       ;test
        ;if key = 128 : end      ;test
        await 500
    loop
    goto *ssmain2
    end

 一応、完成である。
 実行ファイルを作成して、画面のプロパティ のダイアログから動作を確認する。

 プログラムは、ラベル*config以降*previewjまでが設定賭面の処理である。前のサンプルとは、それ以外の部分に変更はない。

 ラベル*config以降が追加した処理である。まず、設定データファイルがあればそれを読み込んで変数kaisuとmojiに格納している。スクリーンセーバー本体とほぼ同じ処理である。
 次に、画面を作成している。これば実行しながらpos命令で位置を調整した。最初は640×480ドットの画面だが配置が完了した時点で大きすぎるので320×120ドットにした。ウィンドウサイズはscreen命令でも設定できるが、ここでは#packoptでウィンドウサイズを320×120ドットに設定している。


【参考】 設定データファイル読み込みの処理をサブルーチンにする。

 このように、スクリーンセーバ本体はプレビュー画面と関係しており、さらに、これらと設定画面が関係しているので、プログラムを作成するときはこの関係を頭の片隅に入れて考える必要がある。しかし、単純にスクリーンセーバーだけをプログラムするのであればスクリーンセーバー本体の部分だけを考えればよい。まずは、できるところからやってみよう。ただし、スクリーンセーバーのプログラムであるから同じ場所に同じものが長時間表示されるようなものではスクリーンセーバーの意味がなくなるので注意すること。


前へ 目次へ 次へ 
2007  © Hiroshi Masuda 

 

 

inserted by FC2 system