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?
「重載」的正確讀音是什麼?

TAG:MATLAB | 面向对象编程 |