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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0720
HSP初級者いくつものモジュール(スクリプト)の連携について8解決


HSP初級者

リンク

2006/7/20(Thu) 17:15:58|NO.1454

現在、モジュールについて勉強中でいろいろとネットで探したのですがすが、
行き詰まってしまったのでどなたか教えて頂けないですか?

やりたいこと↓(モジュールという表現がただしいかどうか?)
----------------------------------------------------------
データーを表示するモジュール1(スクリプト1)と
データーを編集するモジュール2(スクリプト2)を作成し、
モジュール1で選択したデーターをモジュール2で編集後、
再度モジュール1へ処理を返す といったことをしたい。
(変数、ラベルはかなり重複している)
-----------------------------------------------------------

そこで、下記でテストしてみたのですが、どうしてもうまくいきません。

『(mod1.hsp)と(mod2.hsp)を別につくりメインモジュールからこれらを呼び出して
処理をさせてメインに戻る』ってことなのですが、
メッセージの表示のみならうまくいくのですが、入力とボタンの機能を追加し実行すると

 ”サブルーチン外のreturnは無効です" のエラー出ます。

ここの掲示板(562 別スクリプトファイル間の・・・)の内容とほぼ同じで、
”あんすこえむ”さんの返答を読みましたが
「インクルードされる側でのgoto命令はgosubに直し・・・」とあり、これに該当するみたいと理解しました。

そこで、呼ばれる側(ここでは、mod1.hsp)で複雑な処理(いくつものサブルーチンとgoto命令)をし
メインに復帰させることは無理なのでしょうか?

それと、データーを印刷(きれいな罫線付きで)するようなことはHSPで出来るのでしょうか?
(将来的に、業務用ソフトの開発をやりたいと思っているもので)

 HSP Ver3.0です。以上、よろしくお願いします。


(mod1.hsp) #module #deffunc mod1 screen 1,300,300 title "module1" mes "モジュール1です" ←ここで、データーの入力や制御など複雑な処理をする input a,100,24,5       button "Ent!!",*L1 ←ここにgusubをいれるとエラーにはならないがメインに戻らない stop *L1 return #global (mod2.hsp) #module #deffunc mod2 screen 2,600,300 title "module2"      ←ここは、別の処理(データーファイル関連または印刷)の mes "モジュール2です"    処理をする予定 return #global (メイン モジュール) #include "mod1.hsp" #include "mod2.hsp" screen 0,250,400 title "module3" mes "モジュール3です"  ←ここでも複雑な処理をする mod1 mod2 gsel 0,1 stop



この記事に返信する


hiro

リンク

2006/7/21(Fri) 00:18:12|NO.1456

mod1.hspにて(buttonの下の)stopがあるのでそれ以降は、
メッセージを処理しない限り止まったままだと思います。
stopを、returnにしてはいかがでしょうか?

returnに変更した時、「mod1」「mod2」が実行され、
「main」のstopで処理は止まりました。
そして、ボタン「Ent!!」を押した時は、
処理が*L1に行くのを確認しました。

ただ、mod1.hspのbuttonでgotoを使うかgosubを使うかで
その後の動作が変わります。
goto の場合は、mod1.hspの*L1のstopで止まります。
returnの場合は、メインモジュールでストップされてた場所に
戻りました。

質問に対する返答がおかしいかもしれませんが、
すいません(^^;

#スクリプト内でコメントされたほうがいいですよ



HSP初級者

リンク

2006/7/21(Fri) 09:28:31|NO.1459

hiroさん。返答ありがとうどざいます。

(mod1.hsp)の
button gosub "Ent!!",*L1 ←gotoをgosubに変更すると、
確かに(メイン)→(mod1)→(mod2)→(メイン)と処理は移りますが、
mod1の画面でinputボックスに入力後”ent”を押すと
(mod1)で処理されたことがメインの画面に表示され
 ”サブルーチン外のreturnは無効です" のエラー出ました。
        ↑   
これはmod1の*L1ラベルのreturnでかかると思う。

説明不足でしたが、メインモジュールとmod1、mod2は完全に独立したモジュールで、
mod1内を完全に処理し終わったら次にmod2へ移り
次にmod2内で処理を行い、そしてメインモジュールへ帰ってくる 
そんなことがしたいのですが。

  <処理の流れ>
 (メインモジュール)
  *main
      ・ 
    ・ メインモジュールでの処理(データー表示)
    ・
    ・ ←修正データーを選択
    ・ーーーーーーーーーーーーー> (mod1)プログラム行数 約500行
                      ・ 
                      ・ |
                      ・ |データー修正(inputboxが40項目)
                      ・ | (その他inkey、oncmdなどの制御)
                      ・ |
    <------------------------------  ・  ”データー修正”キー入力
    ・
    ・ メインモジュールの処理
    ・
    ・ -----------------> (mod2へ)これから作成予定
                    ・ |
                   ・ | データー印刷またはファイル更新
                   ・ |
     <----------------------  ・ 
    ・
    goto *main

こんな感じのことがしたいのですが、どうでしょうか?



K

リンク

2006/7/21(Fri) 20:23:08|NO.1476

とりあえず、これで目的は果たせてると思うけど
本当の解決になっているかは、分からない



;(mod1.hsp) #module #deffunc mod1 screen 1,300,300 title "module1" mes "モジュール1です" ; ←ここで、データーの入力や制御など複雑な処理をする input a,100,24,5 //gosubにしないとネストが初期化される button gosub "Ent!!",*L1; ←ここにgusubをいれるとエラーにはならないがメインに戻らない //やっている事は *@ :wait 1:if f=0 :goto *@b:else:return stopsub@ mod1endf *L1 //stopsubを抜けるフラグ mod1endf=1 return #global ;(mod2.hsp) #module #deffunc mod2 screen 2,600,300 title "module2";      ←ここは、別の処理(データーファイル関連または印刷)の mes "モジュール2です";    処理をする予定 return #global screen 0,250,400 title "module3"; mes "モジュール3です";  ←ここでも複雑な処理をする mod1 mod2 gsel 0,1 stop

このまま実行可能


#コメントのスペルミスを修正して再掲載
#コピペミス(汗



HSP初級者

リンク

2006/7/22(Sat) 00:41:16|NO.1485

Kさん。ご返答有り難うございます。

*@ :wait 1:if f=0 :goto *@b:else:return

↑     
 ・・mod1endf=0 : goto ・・
でよろしいんですね?
なるほど、button命令が実行されたかどうかをフラグで判断する訳ですね!
上手く動きました。
あと、
stopsub@ mod1endf
は何をしているのでしょうか?
stopsub@ 
で”文法が間違ってます”のエラーがでるので注釈で無視すれば動きました。
ちなみに buttonが3個あった場合には3個のフラグで判断し、すべてが1(処理された)時に
returnするようにすれば、なんとか希望する処理の手順となりました。
#module
#deffunc mod1 screen 1,300,300 title "module1" mes "モジュール1です" ; ←ここで、データーの入力や制御など複雑な処理をする input a,100,24,5 //gosubにしないとネストが初期化される button gosub "Ent!!",*L1; ←ここにgusubをいれるとエラーにはならないがメインに戻らない //やっている事は button gosub "ENT2",*L2 button gosub "ENT3",*L3 *@ wait 1 if mod1endf1=1 and mod1endf2=1 and mod1endf3=1 : return goto *@b ;stopsub@ mod1endf *L1 mes "ENT!!が押されました" mod1endf1=1 return *L2 mes "ENT2が押されました" mod1endf2=1 return *L3 mes "ENT3が押されました" mod1endf3=1 return #global

と言うことは、「onkey」や「oncmd」、「ontime」などの割り込み命令もすべて
gosubに変えなくてはいけないのか・・・(泣

もうひとつ、表にデーターを出力して印刷したいのですが可能なのでしょうか?
(プリンターに印刷するような命令を見かけないし、ネットでプラグイン関係も見かけないから)

このHSPは業務用ソフトの開発には不向きなのでしょうか?(データー処理がメインのProg)

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



K

リンク

2006/7/22(Sat) 01:51:41|NO.1486

>は何をしているのでしょうか?
げ、すみません
何回かコピペしてるマクロが抜け落ちてました(^^;


;(mod1.hsp) #define stopsub(%1) %1=0:%tstopsub %i0 *%p0:wait 1:if %1=0 {goto *%o} else {return} #module #deffunc mod1

stopsub@ の @はmodule内から外のマクロを使う時に必要
(global 定義されてない場合)

>と言うことは、「onkey」や「oncmd」、「ontime」などの割り込み命令もすべて
>gosubに変えなくてはいけないのか・・・(泣

やり方によってはgotoでも出来そうだけど
飛んだ先で処理が終わったらstopで問題ない
ような構造にしないといけないかな?(gotoで戻る場所を指定できるなら別だけど)

>もうひとつ、表にデーターを出力して印刷したいのですが可能なのでしょうか?
一度ファイル出力してexec ってのが簡単かもしれない



K

リンク

2006/7/22(Sat) 06:12:54|NO.1490

>(プリンターに印刷するような命令を見かけないし、ネットでプラグイン関係も見かけないから)

hsp 印刷 でネット検索したらAPIで印刷する方法や
プラグンも出てきましたよ


ちょっと無理やりっぽいけどgotoにしてみる

;(mod1.hsp) #define mod_1 mod1 :*md1ent :stop :*md1end #module #deffunc mod1 screen 1,300,300 title "module1" mes "モジュール1です" ; ←ここで、データーの入力や制御など複雑な処理をする input a,100,24,5 button "Ent!!",*L1; ←ここにgusubをいれるとエラーにはならないがメインに戻らない button "ENT2",*L2 button "ENT3",*L3 onkey goto *key return *key mes iparam stop *L1 mes "ENT!!が押されました" mod1endf1=1 goto *@f *L2 mes "ENT2が押されました" mod1endf2=1 goto *@f *L3 mes "ENT3が押されました" mod1endf3=1 *@ on (mod1endf1+mod1endf2+mod1endf3) goto *md1ent@,*md1ent@,*md1ent@,*md1end@ #global ;(mod2.hsp) #module #deffunc mod2 screen 2,600,300 title "module2";      ←ここは、別の処理(データーファイル関連または印刷)の mes "モジュール2です";    処理をする予定 return #global screen 0,250,400 title "module3"; mes "モジュール3です";  ←ここでも複雑な処理をする mod_1 mod2 gsel 0,1 stop



hiro

リンク

2006/7/22(Sat) 07:38:46|NO.1491

buttonやoncmd等の処理を扱うのは難しいですね。
長い処理をしている間等
無効化してあげないと処理が別に移り困る場合があります。

印刷についてですが、Kさんが言われた様にAPIにて可能だと思います。
表については詳しく分かりませんが以下にサンプルを書いてみました。
WindowsXP / HSP3.0にて動作確認をしましたが、
動かなかったらすいません(^^;
screen 0のhdcを使ってプリンタに送っています。

#uselib "Comdlg32.dll" #func PrintDlgA "PrintDlgA" sptr #uselib "gdi32.dll" #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #func StretchBlt "StretchBlt" int,int,int,int,int,int,int,int,int,int,int #func GetDeviceCaps "GetDeviceCaps" int,sptr #func StartDocA "StartDocA" int,sptr #func StartPage "StartPage" int #func EndPage "EndPage" int #func EndDoc "EndDoc" int #func DeleteDC "DeleteDC" int screen 0,200,200 font "",18 : pos 10,10 : mes "印刷テスト" font "",12 : color repeat 5,1 line 5,(cnt*20)+50,195,(cnt*20)+50 pos 10,(cnt*20)+38:mes "Sample "+cnt pos 170,(cnt*20)+38:mes ""+cnt*1000 loop objsize 100 , 30 : pos 50,160 button "画面印刷",*printout stop *printout //通常使用するプリンタのDC取得 pd(4) dim pd , 17 pd(0)=66 : pd(1)=hwnd : pd(5)=0x0500 PrintDlgA varptr(pd) if stat=0 : dialog "error 1" :stop h_dc=pd(4) //プリンタ解像度取得 GetDeviceCaps h_dc,8 : x=stat GetDeviceCaps h_dc,10 : y=stat dim docinfo,5 : docinfo(0)=20 sdim docname,260 : docname="hsp sample" docinfo(1)=varptr(docname) StartDocA h_dc,varptr(docinfo) if stat<=0 : dialog "error 2" : goto *pend StartPage h_dc if stat<=0 : dialog "error 3" : goto *pend //印刷 //BitBlt h_dc,0,0,200,200,hdc,0,0,0xcc0020 //拡大して印刷 StretchBlt h_dc,x/4,y/4,x/2,x/2,hdc,0,0,200,200,0xcc0020 //終了処理 *pend EndPage h_dc : EndDoc h_dc : DeleteDC h_dc stop



HSP初級者

リンク

2006/7/22(Sat) 11:27:12|NO.1494

Kさん、hiroさん 素早い返答ありがとうございます。

>buttonやoncmd等の処理を扱うのは難しいですね。
>長い処理をしている間等
>無効化してあげないと処理が別に移り困る場合があります

そうですね。実はそれで半日ほど悩んだ事もあって、処理フラグで判断するようにしています。

何となく、細い光が見えたので、ホンチャンのスクリプトで試してみます。
それと、印刷の方もテストしてみたいので、少し頑張って勉強してみます。

また、どうしても行き詰まったときにはご教授お願いします。

いろいろ有り難うございました。



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