HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0809
たろこ表を作成し、表の延長線上にある値を取得したい12解決


たろこ

リンク

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つ思いつきました。

配列等に入れて格納しておき座標とリンクさせて保持しておく

他に良い方法はありますでしょうか?
このやり方ではマズイとかありますでしょうか?

以上、よろしくお願いいたします。



KA

リンク

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様
>いわゆる、スケジュール表や工程表のような感じでしょうか?

そうです!そんなイメージです。
ガントチャートみたいな感じですね。


スペース様
>「配列等に入れて格納しておき座標とリンクさせて保持しておく」で問題ないと思います。
>自分がやるとしたら、まったく同じ方法を使います。

そうするしかないですよね!
うーん、それ以前の問題で、クリック中に四角形を描画する方法が分かりません…
調べてみます



MillkeyStars

リンク

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

>>掘木さん
半分くらいしか読んでませんが、概ね同意。
ラベル・変数に日本語が使えるので、ガンガン使っていったほうがわかりやすくていいですよ。



KA

リンク

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

作るのには凄く時間がかかるので、一旦解決済みとします。



ONION software Copyright 1997-2023(c) All rights reserved.