Here is a small application, which dynamically builds a form for the script parameter inputs.
The script should contain the input fields description.
The script location is the ./scripts folder (see FileListBox1.Directory property)
:::lua
-- SAMPLE SCRIPT
-- vcltype; label; valueproperty; [defaultvalue]; [length]; [listitems]
-- space required for empty param value!
-- @ARGS
-- Edit;Text parameter;text; ;100
-- FileNameEdit;Output filename;filename;deafult.txt;260
-- DateEdit;From date;text; ;100
-- CheckBox;Click this;checked; ;true
-- ComboBox;Resolution;text; ;100;low|medium|high
-- @ENDARGS
io.stderr:write("\nScript arguments:\n")
for i,p in ipairs(arg) do
io.stderr:write("arg["..i.."]\tlength="..string.len(p).."\t"..p.."\n")
end
Here is the VCLua application
:::lua
-- SCRIPT WIZARD APP
package.path=package.path..";lua/?.lua"
package.cpath=package.cpath..";lib/?.dll;lib/?.so"
VCL = require "vcl"
local formArgs = {}
local CS = 24
local BTOP = 70
MainForm = VCL.Form(nil,"MainForm")
local Panel1 = VCL.Panel(MainForm,"Panel1")
local Panel3 = VCL.Panel(Panel1,"Panel3")
local Button1 = VCL.Button(Panel3,"Button1")
local Splitter1 = VCL.Splitter(MainForm,"Splitter1")
local Panel2 = VCL.Panel(MainForm,"Panel2")
local FileListBox1 = VCL.FileListBox(Panel2,"FileListBox1")
local Label1 = VCL.Label(Panel1,"Label1")
MainForm._ = { Left = 349, Height = 396, Top = 211, Width = 595, ClientHeight = 396, ClientWidth = 595, Caption = "VCLua Script Wizard", }
Panel1._ = { Left = 0, Height = 400, Top = 0, Width = 420, Align = "alLeft", ClientHeight = 400, ClientWidth = 420, TabOrder = 0, }
Panel3._ = { Left = 1, Height = 43, Top = 352, Width = 385, Align = "alBottom", BevelInner = "bvRaised", BevelOuter = "bvLowered", ClientHeight = 43, ClientWidth = 385, TabOrder = 0, }
Button1._ = { Left = 159, Height = 25, Top = 8, Width = 75, Caption = "Run", Enabled = false, TabOrder = 0, }
Splitter1._ = { Left = 387, Height = 396, Top = 0, Width = 5, }
Panel2._ = { Left = 392, Height = 396, Top = 0, Width = 203, Align = "alClient", ClientHeight = 396, ClientWidth = 203, TabOrder = 2, }
FileListBox1._ = { Left = 1, Height = 394, Top = 1, Width = 201, Align = "alClient", Directory = "./scripts", ItemHeight = 15, TabOrder = 0, }
Label1._ = { Caption = " ", Top = 3, Left = 10, font={style="fsbold,fsItalic", name="Courier New", size=9, color="clBlue"}}
function findargs(scriptName)
local script = {}
local f = io.open(scriptName, "r")
while true do
local line = f:read("*l")
if line == nil then break end
table.insert(script,line)
end
f:close()
local argh = {}
local sa = nil
for i,l in ipairs(script) do
-- print(i,l)
if string.find(l,"@ENDARGS") then sa = nil end
if sa then
table.insert(argh,string.sub(l,3):match("^%s*(.-)%s*$"))
end
if string.find(l,"@ARGS") then sa = i end
end
for i,l in ipairs(argh) do
local n = 0
local p = nil
for word in string.gmatch(l, "[^;]+") do
n = n + 1
if n==1 then
local o = VCL[word](Panel1,{left=120,top=10+i*CS})
table.insert(formArgs, o)
elseif n==2 then
local o = VCL.Label(Panel1,{left=10, top=10+i*CS, caption=word})
formArgs[i]["labelcontrol"] = o
elseif n==3 then
p = word
formArgs[i]["propertyvalue"] = word
elseif n==4 and word~=" " then
formArgs[i][p] = word
elseif n==5 and word~=" " then
formArgs[i].width=tonumber(word)
elseif n==6 then
formArgs[i].items=string.gsub(word,"|","\n")
end
end
end
end
function ScriptFileNameChange()
if VCL.FileExists(FileListBox1.Filename) then
Button1.Enabled = true
Label1.Caption = FileListBox1.Filename
local scriptName = FileListBox1.Filename
if #formArgs>0 then
for i,o in ipairs(formArgs) do
o.labelcontrol:Free()
o:Free()
end
formArgs = {}
end
findargs(scriptName)
end
end
function ScriptRunButtonClick()
local scriptArgs = {}
for i,o in ipairs(formArgs) do
local p = o.propertyvalue
table.insert(scriptArgs,tostring(o[p]))
end
local scriptName = Label1.Caption
local result = VCL.RunSeparate(table.maxn(scriptArgs),scriptName,unpack(scriptArgs))
if #result>0 then
VCL.MessageDlg("Script error:\n" .. table.concat(result,"\n"),"mtError",{"mbOk"})
else
VCL.MessageDlg("Script running finished.","mtInformation",{"mbOk"})
end
end
FileListBox1.OnDblClick = ScriptFileNameChange
Button1.OnClick = ScriptRunButtonClick
MainForm:ShowModal()