2011年6月29日水曜日

変数の有効範囲

Calc Basic の変数には、Global、Public、Private、ローカルの四種類の
変数がある。それぞれの変数の宣言と有効は下記の通りである。但し、
Global については、(VB の Public と同様の有効範囲であると推察される
が) どのような場面で使用するのか全く思いつかない為、ヘルプの内容を
ほぼそのまま記載させて頂いた。
  
1. Global 変数
   LibreOffice セッション終了時まで有効な変数。他のドキュメントから
   アクセスすることが可能と思われる。書式は下記の通り :
  
      Global Varname As Typename
  
2. Public 変数
   ドキュメント (プロジェクト) 内の全てのモジュールからアクセスすること
   が可能。書式は下記の通り :
  
      Public Varname As Typename
  
3. Private 変数
   モジュール内でのみ有効な変数。モジュール内の全てのプロシージャ
   や関数からはアクセス可。書式は下記の通り :
  
      Private Varname As Typename
  
4. ローカル変数
   プロシージャ、または、関数内でのみ有効な変数。書式は下記の通り :
  
      Dim Varname As Typename
  
Public変数、Private変数、ローカル変数の有効範囲について理解する為、
実際のサンプルコードを以下に記す。Module1、Module2 の二つのモジュール
があるものとし、それぞれのモジュール内のプロシージャを下記の通りとする :
  
Module1
  
Public gstrVar As String
Private mstrVar As String
  
Sub Proc0()
       Dim strVar As String
       gstrVar = "変数gstrVarはPublic変数です"
       mstrVar = "変数mstrVarはModule1のPrivate変数です"
       strVar = "変数strVarはModule1のProc0のローカル変数です"
       Module1.Proc2()
End Sub
  
Sub Proc1()
       Dim strVar As String
       gstrVar = "変数gstrVarはPublic変数です"
       mstrVar = "変数mstrVarはModule1のPrivate変数です"
       strVar = "変数strVarはModule1のProc1のローカル変数です (*)"
       Module2.Proc3()
End Sub
  
Sub Proc2()
       Dim strVar As String
       strVar = "変数strVarはModule1のProc2のローカル変数です (**)"
       Msgbox(gstrVar & Chr$(13) & _
                      mstrVar & Chr$(13) & _
                      strVar, 0, _
                      "Module1.Proc2のメッセージ")
End Sub
  
Module2
  
Private mstrVar As String
  
Sub Proc3()
       Dim strVar As String
       mstrVar = "変数mstrVarはModule2のPrivate変数です (***)"
       strVar = "変数strVarはModule2のProc3のローカル変数です (****)"
       Msgbox(gstrVar & Chr$(13) & _
                      mstrVar & Chr$(13) & _
                      strVar, 0, _
                      "Module2.Proc3のメッセージ")
End Sub
  
Module1の Proc0 プロシージャを実行した結果のメッセージボックスは
下図の通りとなる。この例からわかるように、Public と Private の値は
引き継がれることがわかる。また、Proc0 と Proc2 それぞれで宣言
されているローカル変数 strVar は、同じ名前であっても、異なる変数
であることも、この例からわかる :
  

Module1の Proc1 プロシージャを実行した結果のメッセージボックスは
下図の通り。Global 変数がモジュールを跨って値が保持されることが
この例からわかる :


0 件のコメント:

コメントを投稿