|
|
2016/8/9(Tue) 18:04:21|NO.76570
お世話になります。
表を作成し、ドラッグした部分に線と値を入力したいという内容で
質問させて頂きましたが、
内容が薄すぎたため再度質問させて頂きました。
Excelをイメージしたほうがわかりやすいので、それを元に説明いたします。
1) 0行目(見出し)に「1日,2日,3日,4日,5日」等、日付を置きます。
2) 0列目(見出し)に、「A,B,C,D」等、文字列を置きます。
3) A3をクリックし、A5までドラックします
4) A3からA5までに直線が引かれ、○月○日〜○月○日 のように
0行目の見出しの値が入力されます
(1)は日付データ、(2)はユーザー入力データです。
(1)の日付データはスクロール動作により変わります。
(2)の見出しも、ユーザー入力のため可変です。
上記動作をさせたいと思っているのですが
参考になるサイトはありますでしょうか。
画面上の文字列の取得方法は特に載っていなかったと思います。
お手数をおかけしますが、よろしくお願いいたします。
|
|
2016/8/9(Tue) 18:18:59|NO.76571
やり方を1つ思いつきました。
配列等に入れて格納しておき座標とリンクさせて保持しておく
他に良い方法はありますでしょうか?
このやり方ではマズイとかありますでしょうか?
以上、よろしくお願いいたします。
|
|
2016/8/9(Tue) 18:21:21|NO.76573
いわゆる、スケジュール表や工程表のような感じでしょうか?
数学の宿題 1〜7
化学の宿題 8〜14
国語の宿題 15〜21
社会の宿題 22〜28
|
|
2016/8/9(Tue) 18:23:07|NO.76574
「配列等に入れて格納しておき座標とリンクさせて保持しておく」で問題ないと思います。
自分がやるとしたら、まったく同じ方法を使います。
|
|
2016/8/10(Wed) 11:02:20|NO.76578
KA様
>いわゆる、スケジュール表や工程表のような感じでしょうか?
そうです!そんなイメージです。
ガントチャートみたいな感じですね。
スペース様
>「配列等に入れて格納しておき座標とリンクさせて保持しておく」で問題ないと思います。
>自分がやるとしたら、まったく同じ方法を使います。
そうするしかないですよね!
うーん、それ以前の問題で、クリック中に四角形を描画する方法が分かりません…
調べてみます
|
|
2016/8/10(Wed) 14:12:24|NO.76579
セル表示部分クリックでセルの番号を取り出すサンプル
screen 0,360,200,0
box_x = 50 //セルの横サイズ
box_y = 20 //セルの縦サイズ
Column = 7 //列
Row = 9 //行
CurPX = 5 //表を表示する左上X座標
CurPY = 5 //表を表示する左上Y座標
//ボックス作成
repeat (Column * Row)
rx = cnt \ Column //余り
ry = cnt / Column //割る
//四角の枠作りカレント座標を最初に指定して、line でぐるっと一周させる
pos CurPX + (box_x * rx),CurPY + (box_y * ry) //カレント座標変更
line CurPX + (box_x * rx) + box_x,CurPY + (box_y * ry) //横線上
line CurPX + (box_x * rx) + box_x,CurPY + (box_y * ry) + box_y //縦線右
line CurPX + (box_x * rx),CurPY + (box_y * ry) + box_y //横線下
line CurPX + (box_x * rx),CurPY + (box_y * ry) //縦線左
loop
*main
mx = mousex
my = mousey
Box_ID = -1
//セル上にマウスが存在する場合、セルの背景の色を変える
repeat (Column * Row)
rx = cnt \ Column
ry = cnt / Column
Left = CurPX + (box_x * rx)
Top = CurPY + (box_y * ry)
Right = CurPX + (box_x * rx) + box_x
Bottom = CurPY + (box_y * ry) + box_y
if (mx > Left)&(my > Top)&(mx < Right)&(my < Bottom){
color 149,230,255
boxf Left + 1,Top + 1,Right - 1,Bottom - 1
Box_ID = rx + (ry * Column) //←このBox_ID が配列変数などで使用するセルの番号
} else {
color 255,255,255
boxf Left + 1,Top + 1,Right - 1,Bottom - 1
}
loop
stick ki
if (ki = 256)&(Box_ID >= 0) : dialog "セルID : ["+Box_ID+"] がクリックされました"
wait 10
goto *main
| |
|
2016/8/10(Wed) 14:51:34|NO.76580
MillkeyStars様
おおおおおお、サンプルすごいです!
まさにExcelのような見た目!そしてセルのデータまで取ってくるとは
なんとすごいサンプルなのでしょう(泣
高度すぎて理解するのに時間がかかりそうですが、
1行ずつ読み込んでいきたいと思います!ありがとうございます^^
|
|
2016/8/10(Wed) 15:26:40|NO.76581
あまりよくない書き方ですが、現段階でここまでできてます。
// ボタンの設置
; 表示位置
screen 0
oncmd gosub *down, 0x0201;マウスの左ボタンが押された
oncmd gosub *up, 0x0202;マウスの左ボタンが離された
startx=0
starty=0
endx=0
endy=0
title "業目管理ツール"
pos 0, 0
; 表示サイズ (指定がない場合の大きさは64x24)
objsize 100, 40
x=100
y=40
; 設置
button "押して!", *jump_a
pos 20,55
font "MSゴシック",15,1
mes "TEST1"
pos 20,75
font "MSゴシック",15,1
mes "TEST2"
s1x=0
s1y=0
pos 200,30
font "MSゴシック",15,1
mes "1"
s1x=0
s1y=0
pos 220,30
font "MSゴシック",15,1
mes "20"
s1x=0
s1y=0
gosub *linewrite
onexit *exit
*MainLoop
getkey LeftClick, 1
if( LeftClick and startx!mousex ) {
line mousex,starty+10
} else {
pos mousex, mousey
}
wait 1
goto *MainLoop
*jump_a
dialog "押したーヨ。", , "オブジェクトID : "+stat
screen 1,500,500
title "TEST"
gsel 1
pos 0,0
objsize 100, 40
s1x=s1x+1
s1y=s1y+5
button "いえす!" + s1x + "_" + s1y, *jump_d
pos 100,0
button "のー!", *jump_e
onexit *exit
stop
*jump_d
s1x=s1x+1
s1y=s1y+5
dialog "いえす!" + s1x + "_" + s1y , , "オブジェクトID : "+stat
stop
*jump_e
dialog "のー!", , "オブジェクトID : "+stat
stop
*down;マウスボタンを押したとき
startx=mousex
hanteiy=(mousey-35)/20
switch hanteiy
case 1 : starty=50 : swbreak
case 2 : starty=70 : swbreak
case 3 : starty=90 : swbreak
case 4 : starty=110 : swbreak
case 5 : starty=130 : swbreak
case 6 : starty=150 : swbreak
case 7 : starty=170 : swbreak
case 8 : starty=190 : swbreak
case 9 : starty=210 : swbreak
case 10 : starty=230 : swbreak
case 11 : starty=250 : swbreak
case 12 : starty=270 : swbreak
case 13 : starty=290 : swbreak
case 14 : starty=310 : swbreak
case 15 : starty=330 : swbreak
case 16 : starty=350 : swbreak
case 17 : starty=370 : swbreak
case 18 : starty=390 : swbreak
case 19 : starty=410 : swbreak
case 20 : starty=430 : swbreak
case 21 : starty=450 : swbreak
case 22 : starty=470 : swbreak
case 23 : starty=490 : swbreak
swend
return
*up;マウスボタンを離したとき
endx=mousex
endy=starty+20
pos startx,starty
boxf startx,starty,endx,endy
startx=0
starty=0
endx=0
endy=0
return
*linewrite
xstart=10
xend=1000
ystart=50
yend=50
repeat 20
line xstart,ystart,xend,ystart
ystart=ystart+20
loop
xstart=200
xend=200
ystart=50
yend=1000
repeat 20
line xstart,ystart,xstart,ystart
xstart=xstart+20
loop
return
; ウィンドウIDの違いによる終了処理 [HSP3]
*exit
if wparam = 1{
; dialog "ウィンドウID "+wparam+"なのでそのウィンドウを非表示に"
gsel wparam, -1
stop
}
dialog "終了します"
end
2個目のウィンドウとかもそのうち使う予定です。
現在勉強中のため、文字入力も「TEST」として入力しています。
MillkeyStars様のコードを元に、修正を加えて
よりバージョンアップさせます!
| |
|
2016/8/11(Thu) 14:59:50|NO.76599
このコードに対して何の回答がほしいのかよくわからないので、
適当に中身を読んで気づいたことをだらだらと。
// ボタンの設置 /* ここからボタン設置らしいけど */
/* 設置(button命令)までなんでこんなに遠いの? */
; 表示位置 /* どこまでが表示位置のコード? */
/* まずすぐ下表示位置と関係なくないか。 */
screen 0 /* これはウィンドウの初期化。ボタンと表示位置と何の関係が? */
oncmd gosub *down, 0x0201 /* ラベル名や定数マクロ(WM_LBUTTONDOWN)などを利用すれば、 */
oncmd gosub *up, 0x0202 /* コメントがなくとも意図がわかる。ぜひ。 */
startx=0 /* これって何の変数です?始まりxってなにさ。 */
starty=0
endx=0 /* なんか対になってそうな変数だけどやっぱり何かわからない。 */
endy=0 /* [コメントをつけるか変数名を明確にする。] */
title "業目管理ツール" /* これはウィンドウの初期化の一部でしょうな。 */
pos 0, 0 /* ここに表示位置らしきのがあるが、いままでの処理は何者だ? */
; 表示サイズ (指定がない場合の大きさは64x24) /* 読解のテンポを上げるのにコメントの打ち方を工夫。*/
objsize 100, 40 /* これは単一命令の補足だから、命令の右に書くとか。 */
x=100 /* 使われていない変数、しかも何の変数か理解できないぞ…。 */
y=40 /* xと同じく。 */
; 設置 /* 上と同じく。大きなエリアを説明するのか直下の1行を説明しているのか*/ */
button "押して!", *jump_a /* jump_a という名前から何の処理するラベルか憶測できるかい? */
/* gotoなのでメインループから抜け出すになるのでしょう。 */
pos 20,55 /* ここから、行の見出しの文字列の描画だ。 */
font "MSゴシック",15,1 /* [msgothic]という定数があるゾ。 */
mes "TEST1"
pos 20,75
font "MSゴシック",15,1 /* なんか似たような処理だなあ。これ増やす際コピーペーストは勘弁。 */
mes "TEST2" /* 似たような処理はなるべく纏める方法を考える。 */
s1x=0 /* 正直何の変数か一番わからないのがコイツ。 */
s1y=0 /* 意図がコード上から全く掴めない。 */
pos 200,30 /* ここから列の見出しの文字列の描画だ。 */
font "MSゴシック",15,1
mes "1"
s1x=0 /* あれ、さっきも0入れたよな? */
s1y=0
pos 220,30
font "MSゴシック",15,1
mes "20"
s1x=0 /* また0入れるのかよぉぉ・・・ */
s1y=0
gosub *linewrite /* 何の線引いているか明確にすると更に読みやすい。 */
/* 実際に描画されているのは行間線ですな。 */
onexit *exit
*MainLoop
/* メインループ内のやりたいことは何だろうか */
getkey LeftClick, 1
if( LeftClick and startx!mousex ) {
line mousex,starty+10 /* この10とは何者ぞ? */
} else {
pos mousex, mousey
}
wait 1
goto *MainLoop
*jump_a
/* このラベルでの処理を要約するコメントが必要だろう。 */
/* どうもサブウィンドウの表示をしたいらしいことは分かるが、 */
/* 「サブウィンドウ」という呼び方がまず良くないと気づくだろう。 */
dialog "押したーヨ。", , "オブジェクトID : "+stat
screen 1,500,500 /* ここからサブウィンドウの初期化のようだ */
/* このウィンドウ番号"1"を定数で表現する丁寧さがあってもよい。 */
title "TEST"
gsel 1 /* これは必要か? */
pos 0,0 /* ここからサブウィンドウの初期表示内容設定のようだ */
objsize 100, 40
s1x=s1x+1 /* この加算の意図は何だろうか。1と5は何を表す値ですかね */
s1y=s1y+5
button "いえす!" + s1x + "_" + s1y, *jump_d /* jump_aに対する_d…dってなんの略?Disposeか? */
pos 100,0
button "のー!", *jump_e /* eとは。eventとかexceptionとかじゃない…何だろう? */
onexit *exit /* はて、ここでもonexit? */
/* 処理の末端のstopやreturnはインデントをしない流儀なのかな。 */
stop
/* サブウィンドウを開いている間、メインウィンドウの操作を担う */
/* メインループは停止する意図があるようだが、復帰回路はどこだ? */
*jump_d
/* 動作テスト用と思われるもの。これは"完成しているもの"なのか? */
s1x=s1x+1 /* この加算の意図は何だろうか。 */
s1y=s1y+5
dialog "いえす!" + s1x + "_" + s1y , , "オブジェクトID : "+stat
stop
/* ここのstopはインデントされているな。。。 */
*jump_e
/* 動作テスト用と思われるもの。これは"完成しているもの"なのか? */
dialog "のー!", , "オブジェクトID : "+stat
stop
/* ここのstopもインデントされているな。。。 */
*down;マウスボタンを押したとき /* ラベル名を工夫すればこんなコメントいらない。 */
startx=mousex
hanteiy=(mousey-35)/20 /* 20と35は何を表す値ですか? */
/* 配列変数でhanteiyとstartyの対応表を作る。 */
/* そんでもって、配列範囲確認をして対応表から値を取るほうが */
/* 単純に書き並べるより便利だと思うけどナ。 */
/* ちなみに、現状、このswitch文と以下の処理と同等だ。 */
/* if (( 1 <= hanteiy ) && ( hanteiy <= 23 )){ */
/* starty = hanteiy * 20 + 30 */
/* } */
/* 23の根拠がわからない。20の根拠もわからない。30も何かわからない */
switch hanteiy
case 1 : starty=50 : swbreak
case 2 : starty=70 : swbreak
case 3 : starty=90 : swbreak
case 4 : starty=110 : swbreak
case 5 : starty=130 : swbreak
case 6 : starty=150 : swbreak
case 7 : starty=170 : swbreak
case 8 : starty=190 : swbreak
case 9 : starty=210 : swbreak
case 10 : starty=230 : swbreak
case 11 : starty=250 : swbreak
case 12 : starty=270 : swbreak
case 13 : starty=290 : swbreak
case 14 : starty=310 : swbreak
case 15 : starty=330 : swbreak
case 16 : starty=350 : swbreak
case 17 : starty=370 : swbreak
case 18 : starty=390 : swbreak
case 19 : starty=410 : swbreak
case 20 : starty=430 : swbreak
case 21 : starty=450 : swbreak
case 22 : starty=470 : swbreak
case 23 : starty=490 : swbreak
swend
return
/* ここのreturnはインデントなしですか。。。 */
*up;マウスボタンを離したとき
/* ラベル名をdown-upにしている以上、これはイベントの種類で */
/* ラベルを命名しているのでしょう。では何をしたいのか、 */
/* コメントを打つなりしておこう。 */
endx=mousex
endy=starty+20
pos startx,starty /* このposの必要性は? */
boxf startx,starty,endx,endy
startx=0
starty=0
endx=0
endy=0
return
*linewrite
/* 表の枠線を描画します。 */
/* でも実際は行の境界線を描画のみで列の境界線は描画できていない。 */
/* と推測。 */
xstart=10 /* 表の描画基準水平位置を指す値。TableDraw_CaptionBasePos_Horizon */
xend=1000
ystart=50 /* 表の描画基準垂直位置を指す値。TableDraw_CaptionBasePos_Vertical */
yend=50 /* TableDraw_BasePos_Vertical */
repeat 20 /* 経験上、repeat-loopの間はインデントしたほうが読みやすい。 */
line xstart,ystart,xend,ystart /* 始点x,y、終点x,yに対して変数を定義しているようだが、 */
/* その定義に反した使い方をしている。変数名を改めるか、 */
/* 下記のystartと同じ値をyendにも入れるような処理があるべき */
ystart=ystart+20 /* この20は行の高さを表す値だ。ほかにも各所にあるが、 */
/* なにか定数を与えておいたほうがいい。TableDraw_Row_Height */
loop
xstart=200 /* ではこの200は何を指している値だろう? */
/* 表の内容の描画基準水平位置でしょうね。 */
xend=200
ystart=50 /* TableDraw_BasePos_Vertical */
yend=1000
repeat 20 /* 経験上、repeat-loopの間はインデントしたほうが読みやすい。 */
line xstart,ystart,xstart,ystart /* 始点と終点が同じなline命令に何の意図が? */
xstart=xstart+20 /* この20は列の幅を表す値だ。TableDraw_Column_Width */
loop
return
/* ここのreturnはインデントされている…? */
; ウィンドウIDの違いによる終了処理 [HSP3] /* うん、サンプルコピペだからなんなんだ。 */
*exit
/* サブウィンドウを閉じようとすると非表示にする。 */
/* メインウィンドウを閉じようとすると確認を出し終了する。 */
if wparam = 1{
; dialog "ウィンドウID "+wparam+"なのでそのウィンドウを非表示に"
/* この手の動作説明のテストコードを残すなら、 */
/* それに相当する動作内容のコメントを残すべき。 */
gsel wparam, -1
stop /* メインループに戻らないのかな。 */
}
dialog "終了します"
end
思ったことを横にズラズラと書きなぐってみました。うるせえ馬鹿野郎みたいなノリで無視してもらって構いませんよ。
1.#defineや#constを使って数値に意図を持たせましょう。俗にいうマジックナンバーが乱立してます。
(20とコード内に書いてあるより、TABLEROW_HEIGHTと書いてあるほうが意味が分かる。)
WM_LBUTTONDOWN(0x0201)とかの値も数値で持ち出さずに定義ごと持ってきて使いましょう。
2.短い変数名は打ちやすい反面、意図が不明確になります。
特にプログラムの全体で扱う値(startxとか)は競合しない、
中身の意味に誤解が出ない名前を採用するほうがいいでしょう。
3.やりたいことが分かるエリア単位コメント等を追加する癖をつけてみましょう。
エリア分割を行うことで、雑味(変なものが紛れている状態)に敏感になれます。
上手く動かないとき、どこが原因かのアタリを付ける参考にもなります。
以上、よきプログラミングライフを。
| |
|
2016/8/11(Thu) 16:28:59|NO.76600
>>掘木さん
半分くらいしか読んでませんが、概ね同意。
ラベル・変数に日本語が使えるので、ガンガン使っていったほうがわかりやすくていいですよ。
|
|
2016/8/12(Fri) 11:08:02|NO.76601
確かに何のために貼ったのか分からない。
が、酷評するほど意味が分からないでも無い。
>>xstart=10 /* 表の描画基準水平位置を指す値。TableDraw_CaptionBasePos_Horizon */
こんな長い変数を使わせては、逆に可読性が悪くなるような。
(英単語の勉強には良いけど)
>>hanteiy=(mousey-35)/20 /* 20と35は何を表す値ですか? */
20ピッチで丸めたいのであろう。
>>button "のー!", *jump_e /* eとは。eventとかexceptionとかじゃない…何だろう?*/
aから順番に付けていって、途中を消したので歯抜けなのでは。
でもまあ、指摘内容はもっともです。
|
|
2016/8/24(Wed) 17:20:21|NO.76711
皆様回答頂きありがとうございます。
正直、returnとstopの違いすらあまり良く分かっておりません…。
とりあえず、何処まで出来ているのか書いておいたほうが良いかな、
と思ったので載せました。クソコードなので載せる必要なかったですが…。
基本的には、KAさんの読みどおりです。
>>hanteiy=(mousey-35)/20 /* 20と35は何を表す値ですか? */
列の幅を仮に20と設定しておいて、それを元に考えました。
変数に当てはめたほうが良いというのも確かですね。
今、プログラムをほぼ1から考え直しています。
いきなり上級レベルを作ろうとしすぎました。
1.画面上に表形式でデータ表示(文字サイズと、線を引く幅を考えないといけない)
2.座標ごとにデータを配列にて保持させる
3.線(boxf)が引かれる座標を指定する
→将来的には,boxfよりボタンに変更。クリック・右クリック処理を追加
4.クリックした座標を取得し、指定幅以上だったらボタンを作成する
(1マス以下の場合は、作成しない)
5.ドラッグした幅を取得し、その幅でボタンを作成する
6.クリックしたままウィンドウ外、範囲外に出た場合の対処
既にバーを作成済みの場合は削除してから作成する
うーん、中々に難しいですね。
とりあえずじっくり考えます。
|
|
2016/9/1(Thu) 17:30:53|NO.76759
作るのには凄く時間がかかるので、一旦解決済みとします。
|
|