2012-04-24 122 views
0

我目前正在爲我的學校開發我的matlab最終項目。在編程方面,我認爲自己相當博學和熟練......但是Matlab只是有很多古怪之處。Matlab GUI:使用變量引用現有的對象句柄

根本問題(找到答案後,意識到這一點)!如何在調用gui句柄對象 時使用變量而不使用變量的名稱而不是值?

換句話說:使用的字段名一個變量(如果我早知道這是這個簡單,我不會問)

我的項目是建立一個簡單的再現年代久遠的'戰艦'遊戲。

我的問題:我目前有5個對象(軸)的船件。他們被選中一個移動到另一個位置(網格)。 我可以使用setpixelposition移動每個對象按鈕點擊。

現在按一下按鈕下,我有這樣的事情

function btnPlaceShip_Callback(hObject, eventdata, handles) 

    %Store the current selected ship(passed from an onclick to a label) 
    ship = get(handles.lblSelectedShip,'string'); 

    %I have tried everything I could think of, but basically I want to achieve the 
    %following 

    setpixelposition(handles.ship, [0 250 50 250]) 
    %where the variable 'ship' contains the name of the object. 

換句話說,在VAR = 'shipAircraftCarrier',和..

setpixelposition(handles.shipAircraftCarrier, [0 250 50 250]) 

作品!(設置指定的特定船舶的位置)。然而,使用變量ship,matlab逐字地輸入字符串,而不是它的值。改用這個變量會非常方便!

如果有人有任何解決方案,我將不勝感激。我瀏覽過網頁,但也許我錯過了對Matlab GUI的一些基本理解 - matlab幫助文檔非常不具描述性,並且沒有什麼幫助。

回答

0

正如其他人提到使用dynamic fieldnames。雖然不具有代碼來測試它,我相信,乾脆把括號圍繞將替換字符串中的結構名,從而

setpixelposition(handles.(ship), [0 250 50 250]) 

儘量避免使用eval(的),如果在所有可能的。

+0

謝謝。我會盡快嘗試。在我看到這個答案之前,我一整天都在嘗試各種各樣的東西!但是我學到了很多 - 我終於明白了matlab如何組織所有這些gui的東西!我認爲一切都很混亂,因爲我不瞭解自動生成的代碼,並且花了一段時間才明白它(即我現在意識到「句柄」只是一個結構數組)! – mtotho 2012-04-25 16:58:43

0

爲此,您可以使用eval功能,但你必須要小心串注射:

setpixelposition(eval(strcat('handles.',ship)), [0 250 50 250]) 
+0

感謝您的回答。我會嘗試這一點,但其他用戶提到,我可以把變量放在括號中,比如:setpixelposition(** handles。(ship)**,position),它更短。我不認爲我需要擔心我的matlab腳本中的字符串注入,尤其是因爲這個變量沒有通過輸入框輸入,而是gui選擇 – mtotho 2012-04-25 17:15:24

0

您可以使用dynamic fieldnamesgetfield。使用標識符與字符串的字段索引在Matlab structs和Javascript objects中非常相似。

Matlab的:

fromId = handles.shipAircraftCarrier; %identifier 
fromString = handles.('shipAircraftCarrier'); %string 

的Javascript:

var fromId = handles.shipAircraftCarrier; //identifier 
var fromString = handles["shipAircraftCarrier"]; //string 
+0

謝謝!變量** shipTag **是一個等於船的標籤的字符串變量。我會嘗試使用:**句柄(shipTag)**而不是句柄.shipTag – mtotho 2012-04-25 17:11:11