コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

Luaridaの機能・システム編 (2)

今回は、Luaridaが起動して最初に呼び出すluarida.luaファイルを説明します。このプログラムを書き換えれば、起動させると直ぐにオリジナルのプログラムを走らせることができます。
最初にmtテーブルを使った関数を書いているのは、宣言していない変数をトラップする関数です。

------------------------------------------
--アプリ選択メニュ
------------------------------------------
--関数宣言--------------------------------
main={}     --mainメソッド
split={}    --指定キャラクタの前後で2つの文字列に分ける

--グローバル変数宣言----------------------
Menu={
       "はじめに, hajimeni.lua"
     , "画像ファイルサンプル, bitmapsample.lua"
     , "文字表示サンプル, textsample.lua"
     , "グラフィックサンプル, graphicsample.lua"
     , "Dialogのサンプル, dialogsample.lua"
     , "文字入力サンプル, textinput.lua"
     , "画面タッチサンプル,touchsample.lua"
     , "簡単Lua電卓, dentaku.lua"
     , "明示的アプリ呼び出しサンプル, explicitsample.lua"
     , "暗黙のアプリ呼び出しサンプル, implicitsample.lua"
}

Path="/sdcard/luarida/"	--luaファイルを保存しているPath
------------------------------------------
mt={}
mt.__newindex=function(mtt,mtn,mtv)
    dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 )
    touch(3)
end
mt.__index=function(mtt,mtn)
    dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 )
    touch(3)
end
setmetatable(_G,mt)
--------以下が実プログラム----------------

------------------------------------------
--文字の分解
------------------------------------------
function split(str, d)
local s = str
local t = {}
local p = "%s*(.-)%s*"..d.."%s*"
local f = function(v) table.insert(t, v) end

  if s ~= nil then
    string.gsub(s, p, f)
    f(string.gsub(s, p, ""))
  end
  return t
end

------------------------------------------
--メインプログラム
------------------------------------------
function main()
local t={}
local tmenu={}
local a, i
local key
local value
local x, y, b

  canvas.drawCls( color(0,0,0) )  --背景を黒に
  item.clear()                    --item Listのclear
	
  --menuテーブルを分解してitem Listに追加していく
  for key,value in pairs( Menu ) do
    t = split( value, "," )
    item.add( t[1], 0 )
    tmenu[key] = t[2]    --実行ファイル名をtmenuに取得
  end

  --リスト選択
  a = item.list("Luarida Ver."..system.version() )
  if( a~=0 )then
    --[[
      for i=1, 10000 do
        x, y, b = touch()
        if( b==0 )then
          --エディタ起動
          impCall("file://"..Path..tmenu[a])
          break
        end
      end
    --]]
    system.setrun( Path..tmenu[a] )
  else
    dialog( "Luaridaを終了します", "また使ってね", 1 )
    x, y = canvas.getviewSize()
    canvas.drawTextCenter( "ホームボタンで終了します", x/2, 100, 32, color(255,255,255) )	
    while(true)do touch(3) end
  end
end
main()

system.version()

リスト選択のダイアログを出すところで、system.version()を使っています。これで、リストダイアログにLuarida バージョン名が表示されます。
ちなみに、Lua言語の文字列の結合は、.. ドット二個です。また、コメントは−−マイナス二個です。複数行にコメントが渡るときは、−−[[ と ]] で囲みます。私は、閉じる側も−−]]としています。こうすると、−−[[を削除して、−−]]が残っても、文法エラーにならないです。半角で書くと特別な意味を持つようなので、全角で記号を書いています。

system.setrun()

プログラムの中ほどにsystem.setrun()があります。tmenu[]配列にファイル名が格納されているので、system.setrun()を使って、選ばれたファイルを次の実行ファイルとして予約しています。この状態でプログラムを終了すると、自動的に、setrun()したファイルが実行されます。
中ほどに、--エディタ起動と書いた部分が、コメントアウトしていると思いますが、リストダイアログでプログラムを選択して、直ぐに画面タッチすると、エディタが起動するプログラムを作ったのですが、intentを受け取ってくれるエディタを見つけられなくて、ボツになっています。