由于Gox 1.56a版本之后已經(jīng)不支持Govcl庫,因此本文檔僅用作留存參考
老資格的Delphi程序員都知道,用VCL庫編寫圖形界面是非常方便的移宅,而LCL庫就是受VCL庫啟發(fā)而來形成的免費版本的圖形界面開發(fā)庫畸肆。感謝Github上的ying32提供的Govcl庫,使得我們現(xiàn)在可以使用Gox語言(Goxlang)結(jié)合LCL庫進(jìn)行GUI圖形界面的編程朋腋,下面我們就來看一個具體的實例。
在Gox語言簡介一文中膜楷,我們已經(jīng)介紹過使用基于OpenGL技術(shù)的GUI圖形界面庫Giu來開發(fā)圖形界面的方式旭咽,而使用LCL庫開發(fā)則更貼近傳統(tǒng)程序員的圖形界面構(gòu)建思路,我們來看用LCL庫實現(xiàn)與之前的例子功能一致的小型計算器的程序代碼赌厅。
errT = lcl.InitLCL()
if errT != nil {
tk.Plerr(errT)
return
}
application = lcl.GetApplication()
application.Initialize()
application.SetTitle("Calculator with LCL")
application.SetMainFormOnTaskBar(true)
mainForm = application.CreateForm()
mainForm.SetWidth(400)
mainForm.SetHeight(200)
mainForm.SetCaption("Calculator with LCL")
mainForm.SetPosition(lcl.PoScreenCenter)
mainForm.Font().SetSize(11)
onFromDestory = fn(sender) {
println("Form Destroyed.")
}
mainForm.SetOnDestroy(lcl.NewTNotifyEvent(onFromDestory))
label1 = lcl.NewLabel(mainForm)
label1.SetParent(mainForm)
label1.SetLeft(10)
label1.SetTop(10)
label1.Font().SetName("Arial")
label1.Font().SetSize(18)
label1.SetCaption("Enter an expression")
onEdit1KeyUp = fn(sender, key, shift) {
println("onEdit1KeyUp:", sender, *key, shift)
}
edit1 = lcl.NewEdit(mainForm)
edit1.SetParent(mainForm)
edit1.SetBounds(10, 48, 200, 32)
edit1.Font().SetSize(11)
edit1.SetOnKeyUp(lcl.NewTKeyEvent(onEdit1KeyUp))
onClick1 = fn(objA) {
rs = edit1.Text()
edit1.SetText(eval(rs))
}
f1 = lcl.NewTNotifyEvent(onClick1)
button1 = lcl.NewButton(mainForm)
button1.SetParent(mainForm)
button1.SetLeft(20)
button1.SetTop(90)
button1.SetCaption("Go")
button1.SetOnClick(f1)
onClick2 = fn(sender) {
application.Terminate()
}
button2 = lcl.NewButton(mainForm)
button2.SetParent(mainForm)
button2.SetLeft(110)
button2.SetTop(90)
button2.SetCaption("Close")
button2.SetOnClick(lcl.NewTNotifyEvent(onClick2))
application.Run()
可以看到穷绵,代碼非常簡單,連空行加起來一共不超過80行代碼特愿,就實現(xiàn)了一個圖形界面的計算器仲墨。下面我們看看執(zhí)行之后的效果。
可以看到揍障,很簡單地目养,一個圖形界面的小計算器已經(jīng)成功運行了。我們可以嘗試輸入一個算式讓它計算毒嫡。
點擊“Go”按鈕后癌蚁,就會得到計算結(jié)果。
可以看到,計算結(jié)果已經(jīng)出來了努释,最后的小數(shù)點是有名的計算機上的浮點數(shù)誤差碘梢,屬于計算機的正常行為。
另外伐蒂,點擊“Close”按鈕是關(guān)閉該計算器痘系,點擊窗口右上方的關(guān)閉按鈕也是同樣的效果。
由此可見饿自,短短幾十行代碼汰翠,實現(xiàn)了一個麻雀雖小、五臟俱全的圖形界面小程序昭雌,非常不容易复唤。
下面我們來解說一下具體代碼,我們還是用代碼中的注釋來說明吧烛卧。
errT = lcl.InitLCL() // 先要初始化LCL庫佛纫,LCL庫也是直接引用lcl即可,不需要寫多級路徑
if errT != nil {
tk.Plerr(errT)
return
}
// 獲取LCL的默認(rèn)應(yīng)用
application = lcl.GetApplication()
application.Initialize() // 必須進(jìn)行初始化
application.SetTitle("Calculator with LCL") // 設(shè)置應(yīng)用標(biāo)題总放,顯示在任務(wù)條上的
application.SetMainFormOnTaskBar(true) // 設(shè)置在任務(wù)條上顯示
mainForm = application.CreateForm() // 創(chuàng)建一個主窗口
mainForm.SetWidth(400) // 設(shè)置主窗口的寬度
mainForm.SetHeight(200) // 設(shè)置主窗口的高度
mainForm.SetCaption("Calculator with LCL") // 設(shè)置主窗口的標(biāo)題
mainForm.SetPosition(lcl.PoScreenCenter) // 設(shè)置主窗口的默認(rèn)位置呈宇,PoScreenCenter表示在屏幕中間
mainForm.Font().SetSize(11) // 設(shè)置主窗口字體大小
// 用于主窗口銷毀時的回調(diào)函數(shù)
onFromDestory = fn(sender) {
println("Form Destroyed.")
}
// 設(shè)置主窗口銷毀時的回調(diào)函數(shù)
// 這里比較特殊,需要調(diào)用NewTNotifyEvent函數(shù)將onFromDestory轉(zhuǎn)換為回調(diào)函數(shù)所需的類型
// 不同的LCL回調(diào)函數(shù)需要有不同的類型局雄,具體用何事件可以參考[這里](https://z-kit.cc/doc.html)
mainForm.SetOnDestroy(lcl.NewTNotifyEvent(onFromDestory))
// 新建一個label甥啄,即顯示文字的標(biāo)簽
label1 = lcl.NewLabel(mainForm) // 參數(shù)一定是所屬的窗口
label1.SetParent(mainForm) // 設(shè)置父級對象為主窗口
// 設(shè)置左上角坐標(biāo)
label1.SetLeft(10)
label1.SetTop(10)
// 設(shè)置標(biāo)簽字體
label1.Font().SetName("Arial")
label1.Font().SetSize(18)
// 設(shè)置標(biāo)簽文字
label1.SetCaption("Enter an expression")
// 用于文本輸入框按鍵抬起時的回調(diào)函數(shù)(測試用)
onEdit1KeyUp = fn(sender, key, shift) {
println("onEdit1KeyUp:", sender, *key, shift)
}
// 創(chuàng)建一個文本輸入框
edit1 = lcl.NewEdit(mainForm)
edit1.SetParent(mainForm)
edit1.SetBounds(10, 48, 200, 32) // 設(shè)置左上角坐標(biāo)和寬度、高度
edit1.Font().SetSize(11)
edit1.SetOnKeyUp(lcl.NewTKeyEvent(onEdit1KeyUp)) // 設(shè)置按鍵抬起的回調(diào)函數(shù)炬搭,注意這里是用NewTKeyEvent函數(shù)將Gox的函數(shù)轉(zhuǎn)換為TKeyEvent類型的回調(diào)函數(shù)
// 用于按鈕1點擊后的回調(diào)函數(shù)
// 對文本輸入框中的內(nèi)容進(jìn)行eval并將結(jié)果填回文本輸入框中
onClick1 = fn(objA) {
rs = edit1.Text()
edit1.SetText(eval(rs))
}
f1 = lcl.NewTNotifyEvent(onClick1)
// 創(chuàng)建一個按鈕用于點擊后進(jìn)行計算
button1 = lcl.NewButton(mainForm)
button1.SetParent(mainForm)
button1.SetLeft(20)
button1.SetTop(90)
button1.SetCaption("Go")
button1.SetOnClick(f1)
// 創(chuàng)建第二個按鈕蜈漓,點擊后將退出程序
onClick2 = fn(sender) {
application.Terminate() // 其實是退出圖形界面,仍可以執(zhí)行Run后面的代碼
}
button2 = lcl.NewButton(mainForm)
button2.SetParent(mainForm)
button2.SetLeft(110)
button2.SetTop(90)
button2.SetCaption("Close")
button2.SetOnClick(lcl.NewTNotifyEvent(onClick2))
application.Run()
代碼中通過注釋的方式已經(jīng)解釋得很詳細(xì)宫盔,另外需要注意:
調(diào)用lcl.InitLCL函數(shù)進(jìn)行GUI的初始化時融虽,如果當(dāng)前系統(tǒng)中沒有LCL庫(liblcl.dll),則會進(jìn)行自動下載灼芭,保存在gox主程序的相同路徑下有额。如果希望不要有這一步,建議直接去Gox語言的官網(wǎng)自行下載liblcl.dll庫文件彼绷,然后可以放在Windows目錄下巍佑,也可以放在Gox語言主程序可執(zhí)行文件的相同目錄下。
特別需要注意的事苛预,所有回調(diào)函數(shù)需要進(jìn)行轉(zhuǎn)換句狼,轉(zhuǎn)換方法參考上面代碼中的button1和edit1的回調(diào)函數(shù)笋熬,LCL支持的事件則可以參考這里或Govcl的Github頁面热某。
最后,注意圖形界面編程的統(tǒng)一禁忌是:只能在一個線程中操作圖形界面。
比較一下的話昔馋,在Gox語言中使用LCL庫編程筹吐,更貼近傳統(tǒng)程序員的編程思維,也能更精細(xì)地控制界面元素的展現(xiàn)和行為方式秘遏,相比OpenGL庫來說丘薛,稍微復(fù)雜一些但功能更豐富色查,唯一需要依賴的是要有運行庫抖苦,但也就僅需要下載一個dll庫文件,還算可以接受坦敌。并且倦蚪,這種方式也是跨平臺的希坚,在Mac和Linux只需要下載對應(yīng)版本的庫文件即可。
總的來說陵且,Gox語言作為一個解釋執(zhí)行的腳本語言裁僧,能夠提供兩種風(fēng)格的圖形界面庫,并且還是內(nèi)置的慕购,無需安裝附加包聊疲,相比大多數(shù)其他腳本語言來說是非常方便的。