在Gox語言中用LCL庫進(jìn)行GUI圖形界面編程-GX25.1

由于Gox 1.56a版本之后已經(jīng)不支持Govcl庫,因此本文檔僅用作留存參考

老資格的Delphi程序員都知道,用VCL庫編寫圖形界面是非常方便的移宅,而LCL庫就是受VCL庫啟發(fā)而來形成的免費版本的圖形界面開發(fā)庫畸肆。感謝Github上的ying32提供的Govcl庫,使得我們現(xiàn)在可以使用Gox語言(Goxlang)結(jié)合LCL庫進(jìn)行GUI圖形界面的編程朋腋,下面我們就來看一個具體的實例。

Goxlang

在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ù)其他腳本語言來說是非常方便的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沪悲,一起剝皮案震驚了整個濱河市获洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殿如,老刑警劉巖昌妹,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異握截,居然都是意外死亡飞崖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門谨胞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固歪,“玉大人,你說我怎么就攤上這事胯努±紊眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵叶沛,是天一觀的道長蒲讯。 經(jīng)常有香客問我,道長灰署,這世上最難降的妖魔是什么判帮? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任局嘁,我火速辦了婚禮,結(jié)果婚禮上晦墙,老公的妹妹穿的比我還像新娘悦昵。我一直安慰自己,他們只是感情好晌畅,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布但指。 她就那樣靜靜地躺著,像睡著了一般抗楔。 火紅的嫁衣襯著肌膚如雪棋凳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天连躏,我揣著相機與錄音贫橙,去河邊找鬼。 笑死反粥,一個胖子當(dāng)著我的面吹牛卢肃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播才顿,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼莫湘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郑气?” 一聲冷哼從身側(cè)響起幅垮,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尾组,沒想到半個月后忙芒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡讳侨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年呵萨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨跨。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡潮峦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勇婴,到底是詐尸還是另有隱情忱嘹,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布耕渴,位于F島的核電站拘悦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏橱脸。R本人自食惡果不足惜础米,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一分苇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椭盏,春花似錦组砚、人聲如沸吻商。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艾帐。三九已至乌叶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柒爸,已是汗流浹背准浴。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捎稚,地道東北人乐横。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像今野,于是被迫代替她去往敵國和親葡公。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359