忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3] [4]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

さてあらかじめ入力枠に値を入れる為の変数を用意する
InputValue = ""
そしてボタンが押されたら、この変数に対して
押されたボタンの値を付加する

InputValue += buttonNo
このコードを表示する直前に書けばOKでR

ここでのポイントはあらかじめ変数を用意することでR
HSPは変数を準備しておかない場合には自動でその型を用意する

例えば「InputValue = ""」をコメントにして実行してみよう

するとボタンを押した際の表示が数字を足された結果になる
1と2を押すと、本来なら「12」と表示するところが「3」になる

これはHSP内部で数値型として変数を準備してしまい、その結果
数値型の演算(足し算)を行うからだ
今回は演算する変数「buttonNo」に数値が入る為、結果も数値型と判断された

これを回避するためにあらかじめ文字型として用意する必要がある

#const Wind_main 0
#const gyo1X 10
#const gyo2X 80
#const gyo3X 150
#const hoseiY 20
#const gyo0Y 0
#const gyo1Y 10+hoseiY
#const gyo2Y 35+hoseiY
#const gyo3Y 60+hoseiY
#const gyo4Y 85+hoseiY
InputValue = ""

 screen Wind_main,300,200
 pos gyo1X,gyo3Y
 button "1" ,*_1
 pos gyo2X,gyo3Y
 button "2" ,*_2
pos gyo1X,gyo0Y   // 表示枠
 sdim siki,200
 input siki,200
 inputNo = Stat

 stop
 
*_1
buttonNo=1
goto *_hyoji

*_2
buttonNo=2
goto *_hyoji

*_hyoji
InputValue += buttonNo
 objprm inputNo,InputValue
stop

PR

「2.表示の際、数値エリアに既に数字があれば、その数値を入力した数値の前部分に足す」

前回まではボタンを押して、そのボタンに書かれている数値を表示エリアに表示した
ボタンを2つしか使用しなかったが、これを10個(0~9までを)付ければOKでR

それぞれ同じ処理なので、他のボタンの処理を付け加える前に次の機能を作成しよう

表示エリアにある数値を取得したいのだが、残念なことにobjprmでは取得はできない
ではどうするか?
他の言語であればinputボックスなどのオブジェクトから文字列を取得することは意外と
簡単なのだが、hspではその機能がない

そこであらかじめ変数を用意し、各ボタンを押された際には変数にも数値を入れて置く

これで現在の表示部分にある「値」が取得できることになる


結論からいうと、ボタンを増やして処理もその分増やす
しかし、処理の内容を考えると、数値ボタンを押した際のプログラムの動きは
実はほとんどが同じでR
数値が0~9という違いだけで、その後の処理

1.数値ボタンを押したら、表示エリアに数値を表示
2.表示の際、数値エリアに既に数字があれば、その数値を入力した数値の前部分に足す

これら2つの処理はどのボタンでも行うものなのです
ということは、0~9までの数値を変数に保持しておけば、1の処理も2の処理も
その変数を利用することで一つの処理として記載できます

前回のサブルーチンは、仕様1の表示エリアに数値を表示している部分ですが
*_1
 objprm inputNo,1
 stop
*_2
 objprm inputNo,2
 stop

objprmの第二パラメータだけ違うだけです
でこの処理を再度サブルーチンにしてしまいます
*_1
buttonNo=1
goto *_hyoji

*_2
buttonNo=2
goto *_hyoji

*_hyoji
 objprm inputNo,buttonNo
stop

一見するとプログラムが長くなってしましましたが、実はこの方が後々
ボタンが増えた際などに楽になってきます

スクリーンの番号やposでの位置情報など
それらは後々の変更に対して容易に対応するために変数(定数)に値を保持した

ではオブジェクトIDも同じ様に保持すれば何番目かを考えなくてすむ

前回のプログラム
コメントを外して全てのボタンを表示すると、inputのオブジェクドIDは14になる
コメントしたままではIDは1
これはオブジェクトが作成された順番に自動で番号が割付られるために起こるのだが

後からボタンなどと増やすと番号が変わってしまいプログラムが複雑になる

そこでstatというシステム変数から番号を取得することでオブジェクトIDがわかる
次のプログラムがこのstatを付け加えたものだ

screen Wind_main,300,200
pos gyo1X,gyo3Y
button "1" ,*_1
obNo1 = stat
pos gyo1X,gyo0Y   // 表示枠
sdim siki,200
input siki,200
obNo2 = stat
stop

*_1
 objprm  obNo1 ," これは?"
 stop

 
変数obNo1obNo2にそれぞれオブジェクトを生成した際の番号が入り
そして、ボタンを押した際にはobNo1の表示を変更しているのだ
この変更している部分をobNo2に変更するだけでinputの内容が変わる
これで途中にいくつオブジェクトが増えてもプログラムの内容を
変更することなく対応できるのでR

入力枠に対してプログラムからデータを表示する
通常は入力枠なので、当然ユーザーが入力するが

今回は電卓の機能としてボタンを押して、そのボタンの数値を表示する
昨日決めた仕様の1番
「1.数値ボタンを押したら、表示エリアに数値を表示」
これを行う

objprm命令はinputオブジェクトに対して、その内容を変更する機能がある
使い方は

objprm
p1,p2
p1=0~(0) : オブジェクトID指定
p2        : 変更するパラメータの内容

こうなる
ここで出てきた「オブジェクトID」、これは何かというとプログラムで順番に
オブジェクト(ボタンや入力枠)を配置していった際に自動で付けられる番号の
事でR

今回のプログラムでいうと
1.ボタン「1」を設置
2.入力枠を設置
している(他のボタンはコメントした)ので2つのオブジェクトが存在する

番号は0から始めるので、入力枠のオブジェクトIDは1になる

オブジェクトIDがわかれば、あとはそこに表示したいデータを指定すればOK
 objprm 1,"1"

この処理はボタンを押した際の処理に記載する

 screen Wind_main,300,200

 pos gyo1X,gyo3Y
 button "1" ,*_1

 pos gyo1X,gyo0Y   // 表示枠
 sdim siki,200
 input siki,200
stop

*_1
 objprm 1,"1"
 stop

見た目は電卓らしくなった

あとは機能をつければ電卓として動く
そこでどのような機能が必要なのかを考えてみる

1.数値ボタンを押したら、表示エリアに数値を表示
2.表示の際、数値エリアに既に数字があれば、その数値を入力した数値の前部分に足す

まずはこの二つの入力の処理を考えてましょう
そこで、わかりやすくするために、ボタン「1」と表示枠を残し、他をコメントアウトした形に
プログラムを変えてみた
コメントアウトは範囲指定する場合には/* から */(実際は半角)で囲めばOK

ボタン1を押した際の処理は「*_1」で行っている
そこでまずは1の処理をここに記載する
プログラム中での表示エリアのオブジェクトは「input」で
この表示エリアは「siki」という変数になっている
この変数にボタンを押した際の数値をいれればよい事になる
オブジェクトの中身を変更するには「objprm」命令を使用する

で、実際にどう利用するか?
それはまた明日・・・

普通の電卓は表示するスペースは上部にある
そこで表示部分を上部に配置しようと思う、
が、そこで少し考える

前回のようにpos命令に直接数値を指定している場合には
このような変更があった場合にはとても大変な作業になる

大変な作業はバグを誘発しやすい

そこで、この作業を楽にする為に、位置を変数に保持する
今回の場合はあらかじめ定まった数値であるので
定数として定義する
これには#CONST 命令を使用する

#const Wind_main 0
#const gyo1X 10
#const gyo2X 80
#const gyo3X 150
#const hoseiY 20
#const gyo0Y 0
#const gyo1Y 10+hoseiY
#const gyo2Y 35+hoseiY
#const gyo3Y 60+hoseiY
#const gyo4Y 85+hoseiY


各行における横位置(X)、と縦位置(Y)と縦の補正値を設定してみた
どうしても後で変更する際に、全部の縦位置を変更するのは計算が面倒な為に
補正値として増減分を指定した
これは定数でありながら変数の「ような」使い方でR

そして本文では

 pos gyo1X,gyo3Y

このように変更することで、いつでも位置の指定が簡単に変更できるのでR
これで前回よりも「電卓らしく」なった
dentaku.jpg

以下全ソースプログラム
#const Wind_main 0
#const gyo1X 10
#const gyo2X 80
#const gyo3X 150
#const hoseiY 20
#const gyo0Y 0
#const gyo1Y 10+hoseiY
#const gyo2Y 35+hoseiY
#const gyo3Y 60+hoseiY
#const gyo4Y 85+hoseiY

 screen Wind_main,300,200
 pos gyo1X,gyo3Y
 button "1" ,*_1
 pos gyo2X,gyo3Y
 button "2" ,*_1
 pos gyo3X,gyo3Y
 button "3" ,*_1
 pos gyo1X,gyo2Y
 button "4" ,*_1
 pos gyo2X,gyo2Y
 button "5" ,*_1
 pos gyo3X,gyo2Y
 button "6" ,*_1
 pos gyo1X,gyo1Y
 button "7" ,*_1
 pos gyo2X,gyo1Y
 button "8" ,*_1
 pos gyo3X,gyo1Y
 button "9" ,*_1
 pos gyo1X,gyo4Y
 button "0" ,*_1
 pos 220,gyo1Y
 button "+" ,*_1
 pos 220,gyo2Y
 button "-" ,*_1
 pos 220,gyo3Y
 button "*" ,*_1
 pos 220,gyo4Y
 button "/" ,*_1
 pos gyo1X,gyo0Y   // 表示枠
 sdim siki,200
 input siki,200 :a=siki

*_1
 stop








忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索