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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0722
Aoriペイントソフトにてバグ&重くなる11解決


Aori

リンク

2011/7/22(Fri) 16:10:51|NO.40095

画像を開いてから、図形(丸)を指定すると、
重くなります。
そして、色指定しても、その色になりません。


*定義 #packopt name "ペイントソフトー" #include"mod_menu.as" #define mp_ex point.0 #define mp_ey point.1 #uselib "gdi32" #func Ellipse "Ellipse" int,int,int,int,int #func SelectObject "SelectObject" int, int #cfunc GetStockObject "GetStockObject" int #func SetROP2 "SetROP2" int,int #uselib "user32" #func InvalidateRect "InvalidateRect" int,sptr,int #func SetCapture "SetCapture" int #func ReleaseCapture "ReleaseCapture" #func ScreenToClient "ScreenToClient" int,sptr *めいん hBnull=GetStockObject($00000005) dim rp,4 x=0 y=0 screen 1,120,540,8 isyoku=1 so=3 mouset=1 hu=10 cls *start randomize a=rnd(256) b=rnd(256) c=rnd(256) gsel 1 newmenu menuBar ; 「ファイル」メニュー newmenu subMenu, 1 addmenu subMenu, "&OPEN", 1 addmenu subMenu, "&Save", 2 addmenu subMenu, "&Clear", 3 addmenu subMenu, "", 0, 0x00000800;仕切りの線 addmenu subMenu, "キー操作",4,g addmenu subMenu, "マウス操作",5,h addmenu subMenu, "E&xit", 6 addmenu menuBar, "メニュー", subMenu, 0x00000010 applymenu menuBar oncmd *filecomand,WM_COMMAND *starr gsel 0 if cel=1&celflg=0:screen 0,800,1000:gsel 0,3:picload refstr:celflg=1 screen 1,120,540,8 objsize 120,22 button gosub"SAVE",*save button"クリア",*clr button"乱数色変更",*start button gosub"絵画速度(キー)",*sokudo button "色設定",*mode button gosub"キー設定",*mouseset button"太さ設定",*hutosa button"線設定",*sen button"図形",*zukei button"ステータス",*status button"説明",*setumei if mouset=1:objenable 3,0 *sta gsel 0 title "機能少ないペイントソフト" if mouset=0:gsel 0: oncmd gosub *hantei, $100 if mouset=1:gsel 0: oncmd goto*sdraw,0x0201 if marukaiga=1|sikaiga=1{ oncmd gosub *mdown,$00000201 oncmd gosub *mup,$00000202 oncmd gosub *mmov,$00000200 hBnull=GetStockObject($00000005) dim rp,4 } stop *hantei onerror*sta;エラーが起きても強制的に続行 if wparam=37|wparam=38|wparam=39|wparam=40:goto*sdraw:else:goto*sta *sdraw if mouset=1:repeat if mouset=1{ x=mousex y=mousey } if karafl=1{ a=rnd(256) b=rnd(256) c=rnd(256) }if isyoku!1{ a+=rnd(3)+30 b+=rnd(3)+30 c+=rnd(3)+30 } randomize color a,b,c gsel 0:if sikaku=0:circle x,y,x+hu,y+hu,1 if sikaku=1:boxf x,y,x+hu,y+hu if mouset=1:oncmd goto*sta,0x0202 if mouset=1:await 3:loop if mouset=0{ if so>=1{ stick kye, 255 if(kye & 1) : x = x - so if(kye & 2) : y = y - so if(kye & 4) : x = x + so if(kye & 8) : y = y + so }if so<0{ stick kye, 255 if(kye & 1) : x = x + so if(kye & 2) : y = y + so if(kye & 4) : x = x - so if(kye & 8) : y = y - so } await 9 getkey hidari,37 getkey ue,38 getkey migi,39 getkey sita,40 if nizi=1:a+=1:b+=1:c+=1 if hidari=0|ue=0|migi=0|sita=0:goto*sta *save dialog"",17 if stat:bmpsave refstr pdata=refstr exname=getpath(pdata,2) ; ファイル名の拡張子を取得 if exname="" : pdata+=".bmp" ; 拡張子がなければ.bmpを追加 bmpsave pdata notesel pdata noteadd pdata notesave "peintdata.txt" goto*starr *sokudo gsel 1 cls objsize 120,22 button"早める",*up button"遅める",*down button"戻る",*starr stop *up so+=1 goto*sokudo *down so-=1 goto*sokudo *mode gsel 1 cls objsize 120,22 button"1色指定",*da button"カラフルモード",*rka button"カラー解除",*starto button"戻る",*start stop *da dialog"色を設定",33 a=ginfo(16) b=ginfo(17) c=ginfo(18) karafl=0 isyoku=1 nizi=0 goto*mode *rka karafl=1 isyoku=0 nizi=0 goto*mode *starto karafl=0 isyoku=0 nizi=0 goto*mode *mouseset gsel 1 cls objsize 120,22 button"マウスで操作",*mou button"方向キーで操作",*ky button"戻る",*starr stop *mou mouset=1 goto*sta *ky mouset=0 goto*sta *hutosa gsel 1 cls objsize 120,22 button"太く",*hup button"細く",*hud button"戻る",*starr stop *hup hu+=1 goto*hutosa *hud hu-=1 goto*hutosa *setumei screen 3,610,250 mes"SAVE ・・・現在のペイント画面を「draw.bmp」として保存します" mes"クリア   ・・・現在の画面を保存せずに消去します" mes"乱数色変更 ・・・乱数による色のパターンを変更します" mes"絵画速度  ・・・キーボード操作モード時のみ解放され、絵画の粗さを設定します" mes"色設定   ・・・絵画の色を1色だけにするなど色の設定ができます" mes"キー設定  ・・・マウスで操作するか方向キーで操作するかを選択します" mes"太さ設定  ・・・線の太さを設定します" mes"ステータス ・・・現在の設定内容を表示します" button"OK",*minus stop *minus gsel 3,-1 goto*starr *status screen 4,500,200 sdim m if mouset=1:m="マウス":else:m="キーボード" mes"絵画速度:"+so+" キー設定:"+m+" if m="キーボード":mes"絵画速度:"+so if isyoku=1:mes"現在設定されている色:":color a,b,c:boxf 169 ,22,169+25,22+13 if isyoku=0:mes"現在設定されている色:(ランダム)" color mes"線の太さ:"+hu objsize 120,22 button"円本体表示",*en exist "draw.bmp" if strsize!-1:mes"保存データの有無:有り":button"画像データ表示",*hyozi if strsize=-1:mes"保存データの有無:無し" button"OK",*staend stop *en screen 5,hu+12,hu+12 color a,b,c circle 3,3,hu,hu color button"OK",*enend stop *enend gsel 5,-1 goto*status *hyozi screen 6,600,480 picload"draw.bmp" button"OK",*hiend stop *hiend gsel 6,-1 goto*status *staend gsel 4,-1 goto*sta *filecomand if wparam=1{ dialog "",16 if stat{ cel=1 } goto*starr } if wparam=2{ dialog "",17 if stat{ bmpsave refstr } goto*starr } if wparam=3{ cls if cel=1:screen 0:cel=0 goto*starr } if wparam=4{ mouset=0 goto*starr } if wparam=5{ mouset=1 goto*start } if wparam=6{ end } *clr if cel=1:celflg=0:cel=0 cls goto*starr *sen gsel 1 cls button"四角",*sika button"丸",*maru button"戻る",*starr stop *sika sikaku=1 stop *maru sikaku=0 stop *mdown dim point,2 point.0=ginfo(0) point.1=ginfo(1) ScreenToClient hwnd,varptr(point) mp_sx = point.0 //始点X mp_sy = point.1 //始点Y flag_click=1 SetCapture hwnd return *mup SelectObject hdc, hBnull SetROP2 hdc, $0000000D Ellipse hdc, mp_sx, mp_sy, mp_ex, mp_ey flag_click=0 dim rect,4 rp.0=mp_sx rp.1=mp_sy rp.2=mp_ex rp.3=mp_ey InvalidateRect hwnd, varptr(rp), 0 ReleaseCapture color a,b,c circle mp_sx, mp_sy, mp_ex, mp_ey,kurinuki return *mmov if flag_click=1{ if rp.0+rp.1+rp.2+rp.3!0{ if marukaiga=1{ Ellipse hdc, rp.0, rp.1, rp.2, rp.3 InvalidateRect hwnd, varptr(rp), 0 } } SetROP2 hdc, $00000006 dim point,2 point.0=ginfo(0) point.1=ginfo(1) ScreenToClient hwnd,varptr(point) rp.0=mp_sx rp.1=mp_sy rp.2=point.0 rp.3=point.1 if marukaiga=1{ SelectObject hdc, hBnull Ellipse hdc, rp.0, rp.1, rp.2, rp.3 } if sikaiga=1:boxf rp.0, rp.1, rp.2, rp.3 InvalidateRect hwnd, varptr(rp), 0 } return *zukei gsel 1 cls objsize 120,22 button"丸(塗りつぶし)",*manu button"丸(線のみ)",*mase button"四角(塗りつぶし)",*sinu button"図形モード解除",*kai button"戻る",*starr stop *manu marukaiga=1 kurinuki=1 sikaiga=0 goto*starr *mase marukaiga=1 kurinuki=0 sikaiga=0 goto*starr *sinu sikaiga=1 marukaiga=0 kurinuki=0 goto*starr *kai marukaiga=0 goto*starr
どうか分かる方、回答お願いします。



この記事に返信する


backdrop

リンク

2011/7/22(Fri) 17:03:28|NO.40098

ざっと読み返していくつか。

1.質問にあったdialog タイプ33のバグ

理由は分かりませんが、タイプ32と33のdialogを実行する場合
第1パラメータに何らかの文字列を入れているとバグるようです。

dialog "",33;最初のパラメータには何もいれない

2.正直意味不明なウィンドウ

実際に見えている画面は2つだけなのですが、実際にはウィンドウが7つも使用されています。
これはメニュー選択や描画の際に使用するものでしょうが、正直無意味です。
画像の読み込み後に重くなるのは単に、ウィンドウの作りすぎといった単純な理由です。

3.描画処理の簡略化

ウィンドウを色々クリックして描画処理をする際にoncmdを多用していますが、
これは割り込み要因をいちいち指定することによるシステムのレスポンス遅延を招くばかりです。
単純に、stickなど他の物でいいのです。だいぶすっきりします。
そのあとでキーコード判定を行い、描画処理を行いましょう。

4.他にもバグ発見

ほかのアプリケーションに切り替え後復帰すると、メニューウィンドウが消えています。



木村

リンク

2011/7/22(Fri) 17:30:05|NO.40101

 112行目のif構文の左括弧に対応する右括弧が同ラベル領域内に見当たりません。
 そのせいか、当方の環境では括弧が対応しませんというエラーが出て、コンパイル段階で弾かれてしまいます。
 backdrop様の環境下では動いているようなので、当方のやり方がおかしいだけかもしれませんが、修正した方がバグが少なくなる気がします。

 後、個人的にこの曲芸的な括弧とタブの複合表記を瞬間的に読破できるAori様やbackdrop様以下のCプログラマ皆様の眼力に敬服します。

 俺にゃプログラマ向いてねえ事がよ〜く分かったわ。一生HSPに引きこもるよ……



backdrop

リンク

2011/7/22(Fri) 17:48:12|NO.40102

HSP3.21aで動作します。見つからなきゃあきらめる主義?

>俺にゃプログラマ向いてねえ事がよ〜く分かったわ。一生HSPに引きこもるよ……
そう落ち込まないでください。いろいろ打ってるのは同じでしょう。



mamo

リンク

2011/7/22(Fri) 18:34:14|NO.40103

省電力なPCでも快適に動く、図形で丸を選んでも「重く」がわからない。
*mode の最後にgsel 0、これでとりあえず面倒なく動いたよ。

図形を選んで色指定したら、
・はじめの図形は色が変更される
・次に続けて別の図形を書こうとすると、前の図形のふちが黒になる
座標変更せずにクリックだけすれば前の図形のふちの色が変化しないんで、
塗りつぶしの処理の部分に何かあるかも(詳しく見てません;



check

リンク

2011/7/22(Fri) 20:04:04|NO.40105

とりあえずデバッグぐらい自力で何とかしろよ。
バグが発生するのに必要じゃないコードを削っていけば
最終的に残ったコードがバグの原因になっていることが多いからな。
それでも分からなかったらそのコードをこの掲示板に張って助けを求めればいい。
だれも他人が書いた長いコードを好き好んで読もうとは思わないからな。



Aori

リンク

2011/7/23(Sat) 22:33:02|NO.40134

>backstop様
ウィンドウが7つあるのは絵画に使用しているのではなく
ユーザーが説明書を開いたり・・・など全て見えるウィンドウになっています
dialogの部分は修正しました。有難うございます。
しかし、図形は、色指定してからだと重くなるわけです。
それから、どうしても[oncmd]を使わないといけないのには理由があり、
・マウスを押した&離したはおそらくonclickやstickでは無理です。
・stickやgetkey方式だと、瞬間的にしか判定せずrepeat~loopを使用しないといけないので
ボタンが反応しなくなります。
このような理由があり、oncmdを使っていましたが、いろいろ改良してみることにします。
>メニューウィンドウが消える
多分それはメニューウィンドウがツールウィンドウでできており、
タスクバーに表示されないだけで実際には消えてないんだと思います。
>木村様
>俺にゃプログラマ向いてねえ事がよ〜く分かったわ。一生HSPに引きこもるよ……
いえいえ(汗
全くそうでもないですよ(^^;
この前の質問でものすごいスクリプト載せてくれたじゃないですか!
>check様
どうもすみません。
これからは気を付けます



ORZ

リンク

2011/7/24(Sun) 02:06:25|NO.40137


stick F1



木村

リンク

2011/7/24(Sun) 03:38:52|NO.40138

 backdrop様やAori様に慰めていただいたので、調子に乗って書き込んでみます。

 多分、想定外動作の原因はoncmd命令でしょう。何故なら、oncmd命令は『一度定義すれば、半永久的に機能する命令』だからです。

 oncmd命令は『該当ハンドルに、ウィンドウメッセージが来たら以下のラベルの処理を行うように』と、指示する命令です。
 あくまでも、『ウィンドウメッセージが来たら』何かしろという“指示”を与えているだけなので、oncmd命令を発令するだけでは、HSPは指定したラベルには飛びません。
 分かりにくいとは思いますが、とりあえず例を以下に上げます。

//4回oncmd命令を行っても //ウィンドウ(C流に言えばハンドル)への指示が変わるだけで //実際に該当ラベルに飛ぶ事は無い oncmd gosub *ラベル1号, 33 oncmd gosub *ラベル2号, 33 oncmd goto *ラベル3号, 33 oncmd goto *ラベル4号, 33 //この段階ではウィンドウメッセージ0番に //対応する指示は『goto *ラベル4号』に更新されている sendmsg hwnd, 33 //sendmsg命令でHSPの0番ウィンドウに //ウィンドウメッセージ33番を送ったので //『goto *ラベル4号』が実行される stop *ラベル1号 mes "ラベル1号にgosubジャンプしたよ" return *ラベル2号 mes "ラベル2号にgosubジャンプしたよ" return *ラベル3号 mes "ラベル3号にgotoジャンプしたよ" stop *ラベル4号 mes "ラベル4号にgotoジャンプしたよ" wait 30 sendmsg hwnd, 33 // もし、仮にoncmd命令がstick命令やgetkey命令、if命令のように //命令発令時に状況を調べて値を返すなり処理を変更するのであれば //sendmsg命令が発令された所で、『goto *ラベル4号』が //実行されるはずはない。 // // が実際には、sendmeg命令の段階でまたラベル4号に飛んでいる。 // // これは、あくまでoncmd命令が該当ウィンドウ(=ハンドル)に //指示するだけの命令であることを示している。 // // oncmd命令で指示した処理(今回の場合は『goto *ラベル4号』)を //実際に引き起こす為には、何かしらの方法でウィンドウメッセージを //送る必要がある。 // // 逆を言えば、oncmd命令で指示した処理を引き起こす為に、oncmd命令を //使う必要は全くない。 // // stick命令〜if命令コンボのような感覚でoncmd命令を使っても無駄であり、 //今回のように一番最初に1回だけoncmd命令でウィンドウ(=ハンドル)に //指示を与えておけば、ウィンドウはずっとその指示通りに動いてくれる。 stop

 要するに、Aori様が意図していないタイミングで、oncmd命令によって下された指示が勝手に動いている可能性が非常に高いと言う事です。
 他の皆様方がおっしゃられるとおり、getkey命令やstick命令、あるいはEasy3DforHSP3のE3DGetKeyboardcnt命令を使って各種oncmd命令を代替してやれば、望みの実装の近付くと思われます。。
(普段なら下手なりに修正スクリプト等を載せたい所なのですが、各種グローバル変数が滅茶苦茶多い上、その各種変数が超遠距離相互作用していたり、gotoジャンプが迷路みたいに複雑だったり、oncmd命令が絶妙かつ凄まじいバランスで動いてたりする為、無能な私には修正スクリプトを作る事ができませんでした)

 後、以下にスクリプトを見て気付いた事を並べます。先に申し上げますが、暴言の嵐ですので、予めご容赦ください。御無礼をば





・rect
 345行目で定義されているだけ。はっきり言って無駄。

・a,b,c
 分かり辛いがブラシのRGBの事。グローバルなアルファベット一文字変数とか検索が大変じゃないの?

・0x202
 WM_LBUTTONUPの事。数字だけで分かるとか、本当にCユーザーのレベルは高い。

・title命令
 1回で十分。oncmd命令といい、button命令といい、1回定義しておけば済む命令を、何度も繰り返すような場所に定義している事が多い。後、[dim rp, 4]も1回で十分。
 oncmd命令やtitle命令程度ならCPUに負荷を強いるだけだが、重複したbutton命令はメモリを喰らってHSPを圧迫する可能性が高い。

・恐ろし過ぎるonerror命令
 せっかくHSPがエラーを吐いてくれているのに、そのエラーを無視して動作させるなんて大問題。エラーを無視し続けると、HSPどころかWindowsの方まで不安定になり、大変な事になりかねない。
 特に、他人に配布するソフトにonerror命令を入れる場合、そのソフトのエラーの蓄積でソフトを使っているユーザーさんのパソコンを壊す事になりかねない。まあ、他人のパソコン破壊してでもエラーを防ぎたいと言うなら問題無いが。

・objenable 3, 0について
 仮に『絵画速度(キー)』ボタンの前に新たなボタンを作ったら、この書き方だと望んでもいないボタンが使用禁止になる。なので、ボタンを作った段階で変数にオブジェクトIDを放り込んで、そのIDを禁止するように。

・奇妙な繰り返し処理
 [if mouset=1:repeat][ifmouset=1:await3:loop]の部分がそれ。oncmd命令によるgotoジャンプでもlooplevは蓄積される為、32回目にここの繰り返しを訪れると、ネスト深過ぎエラーが生じてしまう。
 ちなみに、button命令によるgotoジャンプの際には、looplevが初期化される。このスクリプトはボタンが多い為(onerror命令の恩恵である可能性は怖くて考えたくない)、エラーが生じなかったと思われる。

・無意味で危ないif構文
 133行目[if hidari=0|ue=0|migi=0|sita=0:goto*sta]がそれ。各変数はgetkey命令で取得した十字キーの状態を表す。つまり、『十字キー全てが押されていなければ、全て*staへ飛ぶ』という意味。
 じゃあ十字キー全て押すとどうなるかというと、実は画像の保存処理に入る。何故かと言うと、この行の直後に*saveという画像保存の処理部分があるからだ。
 133行目は、普通に処理していれば無意味だし、有意義になるとバグになる部分。十字キー全部を押すとセーブ画面に移ると言う仕様にしたいとも思えないので、素直に[goto *starr]に変更すべき。

・どっちに転んでも同じなダイアログ
 135行目以下。ダイアログでどっちを選んでも結局、保存される。危険過ぎるので修正。
 それと、『peint』ではなく『paint』では?

・絶対値はabs関数
 112行目以下。soが負の場合、正負を逆転させたsoを加えると言う代物。これ要するに絶対値の事。abs関数を使えば、[if so>=1]云々の処理は無用となる。
 仮に[if so>=1]をいれるにしても、[stick kye, 255]は両if構文から抽出してif構文の前におけるはず。
 ちなみに、メモリをほんのちょっと消費する事を許せるのなら、そもそも[if mouset=0]内の全if構文を消し去る事ができる。

・毎回新規描画する
 *setumei、*status、*en、*hyoziの各ラベルの処理部分の事。個々の処理はそんなに重くないものの、呼び出す度に新規描画していては、CPUに負荷が掛かる。
 どうぜウィンドウを7枚用意するのなら、初期段階で全部描画してしまえばCPUも少しは休まるはず。

・超遠距離運用されるrefstr
 278行目の*filecommandラベル処理領域で呼び出されたrefstr。これの利用場所は何と*starrラベルの54行目。一時システム変数のrefstrがこんな長距離を旅しているのは危ないし、別の変数に移し替えていたとしても、呼び出し元と運用先をわざわざ引き離す理由が分からない。
 そもそも、refstrはdialog命令の読み込み時ばかりではなく、保存時にも更新される。celとcelflgという2つのフラグ変数によって54行目の処理の可否を決めているようだが、281行目のif構文の中に読み込み処理を放り込めば、2種のフラグを用いる必要さえなくなる。
 後、picload命令は勝手にウィンドウのサイズを調整してくれるので、54行目のscreen命令も無意味。


 最後に重ねて、重ね重ねの暴言についてお詫びいたします。御無礼をば



Aori

リンク

2011/7/24(Sun) 12:04:54|NO.40139

難しいですね・・・。
しかし、たくさんの修正点があることが分かりました。ありがとうございます
あと、どうしても[oncmd]しか使えないんです・・。
できるだけ[repeat~loop]は使用したくないんです。
ボタンが反応しなくなるからです。
なにもできない無能な僕でなんかすみませんorz



Aori

リンク

2011/7/24(Sun) 13:14:10|NO.40140

↑すみません。
ボタンが反応しないことはありませんでした。
これからは[stick]か[getkey]を使ってみようと思います。



Aori

リンク

2011/7/26(Tue) 16:26:57|NO.40215

重くはなくなったのでバグだけ修正しようかと思います。
皆様のご協力ありがとうございました!

あと、僕はCなんかまったくやってませんが(汗



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