MATLAB App Desinger教程連載2:詳解App Designer生成的代碼
本節接著 教程1, 解讀App Designer自動生成的面向對象代碼中的內容。
App屬性聲明的語法為什麼和以前的不一樣
沿用教程1中的例子,由App Designer生成MyBalanceApp類的屬性如下,它們都是用戶在DesignView中拖拽到畫布上的控制項,並且我們教程1中修改了部分屬性的名稱:
還需要注意到,這裡屬性聲明的語法,和 (出版於2015年1月)中介紹的屬性聲明有些不同,書中介紹的語法格式是:
propertiesn propNamenendn
而這裡的語法格式在propName後面多了一部分:
propertiesn propName propTypenendn
這是因為,在最新的R2016a中,MATLAB的面向對象系統專門引入新的可選(Optional)屬性聲明。這就是說, 如果有需要 ,類的設計者可指定屬性的種類。比如我們把myprop的屬性指定成double.
classdef MyClassn propertiesntmyprop doublen endnendn
那麼在賦值給對象屬性賦值的時候,也必須指定其值的類型是double scalar,如果嘗試要給它賦其它種類的值,MATLAB將報錯:
>> o = MyClass;n>> o.myprop = {1,2}nWhile setting the myprop property of MyClass:nThe following error occurred converting from cell to double:nConversion to double from cell is not possible.n
而在這個功能發布之前,類的設計者需要通過set函數來實現對類的屬性的限制,詳見書第2.8節
App的構造函數中做了哪些事情
在App Designer生成的MyBalanceApp類中,構造函數包括以下工作
該方法在Code View中是灰色的,表示不支持直接修改。
第一步 調用createComponents方法
createComponents是定義在MyBalanceApp類中的一個private方法,只能從類的內部進行調用。它相當於MVC模式中,View類的初始化工作,內容包括:
- 生成figure對象當做畫布,figure尺寸大小來自於Design View中的設計
- 生成Design View中用戶指定的各個控制項,初始化它們的大小,部分初值和在figure中的位置
methods (Access = private)n function createComponents(app)ntapp.UIFigure = uifigure;ntapp.UIFigure.Position = [100 100 212 152];ntapp.UIFigure.Name = UI Figure;ntsetAutoResize(app, app.UIFigure, true)n... 以下省略 ...n
該方法在Code View中是灰色的,表示不支持直接修改。
第二步 調用registerApp方法
registerApp方法繼承自MyBalanceApp的基類matlab.apps.AppBase
% Register the app with App DesignernregisterApp(app, app.UIFigure)n
該方法把app對象中的UIFigure屬性,作為reference傳給基類去註冊自己,工作包括:
- 給UIFigure添加一個動態屬性,該動態屬性反過來指向app本身,這樣UIFigure也擁有指向app的handle
- 把MyBalanceApp的析構函數設置成關閉GUI窗口的回調函數,這樣關閉GUI窗口的時候,會觸發MATLAB關閉UIFigure
- 註冊一些其它的回調函數
該方法在Code View中是灰色的,表示不支持直接修改。
第三步 調用runStartupFcn方法
該方法是MyBalanceApp中定義的一個public方法,該方法的框架由App Designer生產,由用戶自行添加需要的內容。作用包括一些額外的初始化工作。比如在賬戶提款存款的例子中,我們需要在GUI剛開始的時候,一些欄目中就可以顯示一些初始值,於是我們需要修改runStartupFcn如下:
function startupFcn(app)n app.Balance = 500;n app.ViewRMB.Value = 0 ;n app.ViewBalance.Value = app.Balance;nendn
App的析構函數在何時被調用
MyBalanceApp的析構函數的內容是關閉GUI的Figure,該函數是點擊GUI的關閉窗口按鈕時的回調函數,於是GUI的窗口被關閉將觸發該方法,關閉MATLAB的UIFigure。
% Code that executes before app deletionnfunction delete(app)n % Delete UIFigure when app is deletedn delete(app.UIFigure)nendn
如何得到AppDesigner生成的代碼
教程1中提到,本Tutorial的順序是先介紹使用App Designer提供的拖拽的方式GUI編程,然後再進階介紹如何用純程序的方式結合App Designer進行GUI編程。如果要使用純程序的方式,我們需要得到App Designer幫我們生成的代碼,但App Designer保存之後是一個後綴為mpapp的文件,該如何打開得到其中的代碼呢?有幾種辦法,最簡單的就是在App Designer的Code View中按下 Ctrl + A,選定所有的代碼,然後Ctrl + C,這樣就把所有的代碼賦值到剪貼板了。
讀者可以做一個實驗,假設你給App起的名字叫做MyBalanceApp, 那麼App Designer幫你自動生成的類的名字也叫做MyBalanceApp, 讀者可以在任意目錄中,新建一個M文件叫做MyBalanceApp,把拷貝出來的代碼粘貼進去,然後在命令行中聲明一個該類的對象>> myBalanceAppn
我們將看到,一個一摸一樣的GUI產生了,並且每個Button所執行的功能都和原來一樣!這將是我們後續介紹App Designer和MVC模式結合的基礎。
推薦閱讀:
※js以變數調用json未知keys的方法?
※教學用的代碼使用面向對象技術合適嗎?
※先有Class還是先有Object?
※「重載」的正確讀音是什麼?