因爲實際上手過的界面引擎也就只有迅雷的BOLT,其主要的特點在於採用XML,LUA以及C++或者C# .NET等多語言混合編程的設計開發模式,通過XML可以十分方便快捷的進行窗體對象樹的創建,控件間的關係通過樹形圖的方式進行佈局和設計,並提供綁定響應事件的解決方案,可讀性和可維護性有保證;
此外,各個控件的響應方法主要通過LUA腳本代碼的編寫來進行實現,LUA小巧精悍,在編寫的時候可以快速上手減輕負擔。至於引擎環境的搭建目前比較成熟的主要有基於C++或者C# .net平臺的兩種。使用BOLT進行項目開發過程中最令人頭疼的是各個語言間的交互設計,在其中有很大的難題,而且只能由開發者自身去解決。我在使用BOLT進行數據信息管理系統的開發的時候,需要用到數據庫的鏈接,這其中需要涉及到一些數據的讀取和更新,然而已知的解決方案只有通過壓棧的方式一個一個的將數據傳入LUA端然後在進行界面的更新,這既阻礙了數據信息處理的連續性也大大增加了數據操作的難度,這讓我很費解。以上是一個實際使用過BOLT進行界面開發的一個小青年的愚見,如果有說錯的地方,還請見諒,如果能指教一番就更好了。
---------------------------------------更新---------------------------------------關於數據庫數據傳輸和使用的方法已經在好久以前就發現了,只是很久沒上過知乎,才一直沒有進行更新。其實並不是沒有方法的,在監聽獲取數據的同時使用回調函數CallBack將數據傳輸到程序主體中,實現對UI的更新或者其他用途其實都是可行的。
比方說在.Net環境下的實例:
public void ConnectDataBase(){}//使用C#鏈接數據庫獲取數據記錄
public void ConnectDataBase()
{
DataSet dsall;
String mysqlcon = "database=BookSale;Password=yancai1991;User ID=sa;server=(local)";//Data Source=MySQL;;charset=utf8";
SqlConnection conn;
conn = new SqlConnection(mysqlcon);
SqlDataAdapter mdap;
try
{
mdap = new SqlDataAdapter("select * from Admins", conn);
dsall = new DataSet();
mdap.Fill(dsall, "hard");
DataTable dt = dsall.Tables[0];
foreach(DataRow dr in dt.Rows)
{
//遍歷列
for(int i=0;i<dt.Columns.Count;i++)
{
PushData(dr[i].ToString());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}
[LuaClassMethod]
private static int ConnectDataBase(IntPtr L)//將函數註冊到LUA環境中
{
var instance = GetInstance(L); //通過父類的GetInstance(L)方法獲取BOLT環境下通過工廠類創建的MyClass實例
instance.ConnectDataBase(); //調用MyClass的Add方法 //將計算結果Push到Lua棧,L.PushXXX是一系列擴展方法,方便將C#數據Push到Lua棧
return 1; //1表示往Lua棧裏Push了一個元素
}
[LuaClassMethod]
private static int AttachResultListener(IntPtr L)//監聽回調函數
{
var instance = GetInstance(L); //通過調用父類的GetInstance(L)方法獲取BOLT環境下通過工廠類創建的MyClass實例
if (!L.IsLuaFunction(-1)) return 0; //判斷Lua棧的棧頂元素是否爲function
//
//調用L.ToAction<T>(Action<T> caller)擴展方法將Lua棧頂function轉爲C#的Action<T>委託
//其中caller用來具體將委託的參數Push到Lua棧,並通過L.Call(int arg,int ret)調用Lua的function
// arg表示Push到Lua棧的元素個數
// ret表示Lua function的返回值個數
//
var function = L.ToAction<string>(result =>
{
L.PushString(result); //將resultPush到Lua棧
L.Call(1, 0); //調用Lua的方法,1表示參數個數爲1,0表示返回值個數爲0
});
instance.OnPushDataFinish += function; //將轉換後的委託添加到MyClass實例的OnAddFinish事件上
return 0; //此處並沒有往Lua棧裏Push元素,故返回0
}
////////////////////////////////////////////////////////////////////////////////////////////
LUA執行代碼:通過工廠實例獲取C#端註冊的函數,函數執行時回調函數響應輸出數據庫數據
local myClassFactory = XLGetObject("HelloBolt.NET.MyClass.Factory")
local myClass = myClassFactory:CreateInstance()
myClass:AttachResultListener(function(result)
--process result
XLMessageBox(result)
end)
myClass:ConnectDataBase()