• ベストアンサー

処理中にincludeされるファイル内で関数化するには?

動的に生成するHTMLで、共通した処理を別ファイルに記述し、 includeして共通化したいのですが、どうもうまくいきません。 解決方法をご教授いただけないでしょうか。 もしくは該当しそうなサイトを教えていただけないでしょうか。 (includeや、関数化についてなどTipsに強いサイト) よろしくお願い致します。 問題点=== === === === === (1)X.asp内で、"01 Call A()"がエラーとなる →2重定義ということでしょうか? (2)X.asp内で、"04 Dim i"が2重定義でエラーとなる →気持ちでは、Privateな変数のつもりなので、2重定義ではないと。 (3)X.asp内で、プライベート関数を定義することは可能かどうか 現状=== === === === === --- ~index.asp~ ----- 01 Sub A() 02 Dim i 03 Dim j 04 <!--#include file ="X.asp" --> 05 End Sub --------------------- --- ~X.asp~ ----- <% 01 Call A() 02 03 Sub A() 04 Dim i 05 06 処理A 07 08 End Sub %> ---------------------

noname#6692
noname#6692

質問者が選んだベストアンサー

  • ベストアンサー
  • run_away
  • ベストアンサー率42% (8/19)
回答No.2

このやり方は初めて見ました。素晴らしい! 関数→中身を別のものとして考えるということで関数ベースで継承や多態性を表現しているのですね!ASPによるオブジェクト指向への挑戦ですね!素晴らしい。 ただ、惜しむらくは関数はクラスではないのでプライベート関数を持つことが出来ないのです。 また、yoshisukeさんの指摘の通りプリコンパイルの段階でインクルードファイルと元のファイルは結合されてしまいます。そういう意味で、Private宣言はありません。 また、Executeを使用して、他ページとして処理すれば、リソースは食いますが擬似的にプライベート関数、変数を作ることができます。

noname#6692
質問者

お礼

ご回答ありがとうございます。 オブジェクト指向は一通り学んだつもりですが、 深く意識して質問しているわけではありません。 というより、ひらめいて質問した程度です。 実際目的としていることは、 index.aspで保持している値を そのまま(index.aspでは意識せず)別ファイルであるX.aspに渡し、 その中で動的に処理を行いたいのです。 またindex.aspに代わるファイルがいくつか存在するため、 X.asp内の処理が共通化できるのではないかというところです。 ASPはまださわりはじめなのですが、Executeで処理するのが現実的でしょうか。 代替え案などございましたら、ご回答いただければと思います。 よろしくお願いいたします。

その他の回答 (3)

  • run_away
  • ベストアンサー率42% (8/19)
回答No.4

> パラメータが変更になっても、呼び出す側のファイルと、呼び出される側のファイルとで影響が少なくなると考えました。 これはつまり「呼び出す側」のモジュールと「呼び出される側」のモジュール間結合度が高くなることを言っています。つまり、「呼び出す側」は常に「呼び出される側」のモジュールの中でどんな変数を使ってどういう処理がされているかを意識する必要があるわけです。これって期待する効果「影響が少なくなる」と逆じゃありませんか? モジュール間結合度を低くして、互いのモジュールの影響を低く押さえたいときには、ASP 3.0以降であればClassが使用できるので、そちらを使うことをお勧めします。

  • run_away
  • ベストアンサー率42% (8/19)
回答No.3

--- ~index.asp~ ----- 04 <!--#include file ="X.asp" --> 01 Sub A() 02 Dim i 03 Dim j 01 Call SubA(i,j) 05 End Sub --------------------- --- ~X.asp~ ----- <% 02 03 Sub SubA(ai, aj) 05 06 処理A 07 08 End Sub %> --------------------- これじゃだめな理由がわからないのですが。。。

noname#6692
質問者

お礼

再びご回答ありがとうございます。 思想での理由というのはないのですが、 関数内でIncludeすることで、 別ファイルの関数パラメータの指定が不要になりますよね。 (実行時にはソースが連結されているため) パラメータが変更になっても、 呼び出す側のファイルと、呼び出される側のファイルとで 影響が少なくなると考えました。 つまりは変更量を減らすことを一番の目的としていました。 現在は、上記に書かれた様に処理を行っております。

  • yoshisuke
  • ベストアンサー率65% (19/29)
回答No.1

実際にロジックがインタープリットされるときは ソースはこんな感じになっているはずです。 01 Sub A() 02 Dim i 03 Dim j ------インクルードされた「X.asp」--------------- 04 Call A() 05 06 Sub A() 07 Dim i 08 09 処理A 10 11 End Sub ------------------------------- 12 End Sub そのため。。。 「Sub A()」のなかで「Sub A()」が存在してしまいます ネストされた「Sub A()」の名前を変えてみてはいかが でしょうか?

noname#6692
質問者

お礼

ご回答ありがとうございます。 関数名は勝手な都合で、そのままで考えたいんです。 個人的な意味合いとしては、 X.aspファイルの中の関数は、Private関数という意味なんですが。 includeは別ファイルを呼び出すのでなく、 ソースを結合するだけなので、 この方法では実現できないということですね。 別の方法を検討します。

関連するQ&A

  • インクルードしたファイルの関数を使用する

    お世話になっております。カナと申します。 宜しくお願いいたします。 ・windowsXP ・Vbscript ・IIS5.0 インクルードしたaspファイルに、関数があるのですが、 それを実行し戻り値を取得して呼び出し元の関数に戻った際に、 エラー「この変数は宣言されていません。」が出てしまいます。 以下ソースです。 '~~~~~TEST_1.asp~~~~~~~~~ <%@ LANGUAGE="VBScript" %> <% option explicit %> <!-- #include file="TEST_2.asp" --> <% call TEST_1() %> <% public function TEST_1(Data) Dim Data On Error Resume Next Data=27 Call TEST_2(Data) Response.Write(Data)%><br><%      '↑きちんと30が取得できます Response.Write(Err内容:" & Err.Description)%><br><% '↑ここでエラーの確認をしています。      '「この変数は宣言されていません。」になります。 End Function %> ~~~~~TEST_2.asp~~~~~~~~~ <% Public Sub TEST_2(ByRef Data) On Error Resume Next Response.Write("Data)%><br><%      '↑27が表示されます     Data=Data+3 End Sub %> ------------------------------------------------------- 以上です。 callで関数を呼んで、実行結果は正しく取得できるのですが、戻ってきたときにエラーになるので、この先のコードを書いていったときにエラー処理等に問題が出てしまいます。 もっと長いソースを書いているときも同様のエラーが出るので、ファイルのインクルードの仕方か関数の呼び出し方など、根本的になにか問題があるのだと思うのですが・・・。 何かおかしい点があるのでしょうか? 大変困っています。 申し訳ありませんが、どなたかご教授ください。

  • 【緊急】インクルードファイルに配列変数を使用することができない???

    ASPでVBSCRIPTを使っています。 多くのASPで使う部分を共通化して インクルードファイル(.inc)にして それを読み込んでいるのですが、 インクルードファイルに Dim gsAAA と宣言すると、 普通に使えるのに Dim gsAAA(9) とすると使えません。 配列の変数はインクルードにおくことが できず、かならずローカルのASPで 宣言してやらないとダメなのでしょうか? どのASPでも同じ宣言が必要になってきたので。 どなたか、少しでも分かることがあれば 教えて下さい。お願いします。

  • 相互のインクルードファイルの方法について

    下のように、2つのヘッダーファイルを相互にインクルードすると colorparettewindowclass.h(2) : fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024 というエラーが表示されます。(2つ表示される) 一応、#pragma onceを使用していますが、 エラーになります。 どうすればいいでしょうか? よろしくお願いします。 --------------------------------------------- <<ColorParetteWindowParentClass.h>> #include"WindowBaseClass.h" #include"ColorParetteWindowClass.h" #include"ColorClass.h" #pragma once class ColorParetteWindowParentClass : public WindowBaseClass { ((処理関数等定義)) }; --------------------------------------------- <<ColorParetteWindowClass .h>> #include"WindowBaseClass.h" #include"ColorParetteWindowParentClass.h" #pragma once class ColorParetteWindowClass : public WindowBaseClass { ((処理関数等定義)) };

  • 処理を別ファイルに書きたいんですが。

    ASPのコード部分で、 いろんなファイル共通の処理(更新日付を表示用に編集する等)をまとめて一つの別ファイルに記述し、 各ファイルの処理内で、呼び出して使用したいのですが。 ◎呼び出し側 <!--#include file="abc.asp"> として、aspコード内で、 call Change_Ymdhms(w_Tymd,w_Thms) と書いてます。 ◎呼び出される側 abc.aspの中では、 function Change_Ymdhms(w_Ymd,w_Hms) dim w_Len dim R_Ymdhms w_Len = len(w_Tymd) if w_len < 8 then w_Ymd = string((8 - w_Len),"0") & w_Tymd end if w_Len = len(w_Hms) if w_len < 6 then w_Thms = string((6 - w_Len),"0") & w_Thms end if R_Ymdhms = mid(w_Ymd,1,4) & "/" & mid (w_Ymd,5,2) & "/" & mid(w_Ymd,7,2) & " " & _ mid(w_Yms,1,2) & ":" & mid(w_Yms,3,2) & ":" & mid(w_Yms,5,2) end function とファンクションが書いてあります。 呼び出し側のaspファイルを実行すると、 「ページを表示できません」となり、 「Subプロシージャを呼び出すときに括弧を使うことはできません」というエラータイプが表示されます。 本で探しても見つけられず、「こうすればどうか・・・」 と思い、書いてみましたが、上手くいきません。 (当たり前ですが・・・) どなたかご存知でしたら、どうか教えてください。 よろしくお願いします。

  • 別ファイルの共通関数をHTMLで呼び出したい

    みなさんいつもお世話になっています。 今とりかかっているプロジェクトの決まりで「JavaScriptは極力使用しない」というものがあり、ボタンをクリックした時引数で指定したURLへジャンプするというのをVBScriptの共通関数で行いたいのです。 共通関数は以下関数名です。(処理内容省略しましたが、 VBScript内で呼び出すことには成功しました。) Public sub subGotoUrl(strUrl) 。(処理内容省略) End sub この関数を下記ファイルでインクルードして <!-- #include File="../../../inc/Lease/cmnFunc.inc" --> <input type="button" name="DataAdd" value="新規登録" onClick =fncNextUrl(document.form1,"R1LM010.asp?act=<%=INSERT_DISP%>")> ・・・現在fncNextUrlというJavaScriptで実行されている部分を変更して呼び出したいのですが・・・。何か良い方法はありませんか?よろしくお願いします。

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • Rubyの関数定義

    Rubyで関数を定義し、呼び出すとエラーになります。 sub1() #sub1の呼び出し ・・・ def sub1() ・・・ end のようにすると、エラーになります。 def sub1() ・・・ end sub1() #sub1の呼び出し のようにするとエラーになりません。 関数の定義を呼び出し箇所のソースの後ろで定義してもエラーにならない方法はないのでしょうか。 ご存じのかた、いらしたら教えて下さい。

  • 複数ファイルから同じ関数の呼び出しできますか?

    今、クライアント・サーバーのプログラムを作っているのですが、クライアントとサーバの間の通信を暗号化しようとしています。 開発環境はVisualStudio2010のMFCを使っています。 サーバとクライアントのプログラムとを同一のプロジェクトにして、サーバとクライアントの起動をオプションで切り分けています。 しかし暗号モジュールは一つのファイルなので、これをp1.cppとしましょう。 サーバのファイルをmain.cpp クライアントをsub.cpp として、main.cppの方で#include "p1.cpp"とやっても、クライアントのソースからは関数が参照できません。 例えば g++ main.cpp sub.cpp として、両方に同じ関数を書くと2重定義になります。 クライアントのsub.cpp にも同じようにインクルードしてやると、再定義されてるとリンクエラーが出ます。どうすれば同じ関数を同一プロジェクト内で共有(他のファイルから参照)させることができますでしょうか? 解決法をよろしくお願いします。

  • プログラムについて

    初心者の質問ですみません。 関数の読み出しについてですが、 A1実施→X1となり、X1をa()に代入する。 これを数回ループする場合、aのデータを他の関数で読み出し 変数に代入したい場合どのような記述が良いでしょうか? sub test1() Dim i,X as integer Dim A(10) as integer Dim a(10) as integer For i = 0 to 10 X = A(i)+300 a(i)=X next i End sub sub test2() ※ここにどのように記載すればa(i)を読み出せますか? End sub

  • VBA 処理の途中でエラーが出る

    VBA初心者です。 シート1とシート2があり、 シート1の表の列Mと列Nにそれぞれシート2のデータを参照する COUNTIFS関数を入れたいと思い、以下のように作成しました。 ※シート1は場合よって行の最後行が違います。 Dim Test As String Dim Test2 As String Dim i As Long For i = 1 To Cells(Rows.Count,1).End(xlUP).Row Test=Range("A" & i ) If MyStr<>""Then Range("M" & i) ="=COUNTIFS(Sheet2!,A:A"& Test &",Sheet2!B:B,M1"&")" End If Test2=Range("A" & i ) If MyStr<>""Then Range("N" & i )="=COUNTIFS(Sheet2!,A:A"& Test2 &",Sheet2!B:B,N1"&")" End If Next i この内容にて、処理が成功していたのですが、 急に、行150のあたりで処理が止まり、実行時エラー(アプリケーション定義またはオブジェクト定義のエラーです) が出るようになりました。 行150より上の方は、列Mと列N共にCOUNTIFS関数が入っています。 この場合、どのようにすればよろしいのでしょうか? エラーの対処、または別の記述方法があれば、ご教授頂きたく存じます。

専門家に質問してみよう