matlabGUIのコールバック処理について

このQ&Aのポイント
  • matlabという言語を用いてGUIを構築しており、タブ機能を作成しています。ボタンを押した時にset関数を用いてメニュー内の各ボタンを表示/非表示させることで実現しようと考えています。
  • しかし、各ボタンの引数の渡し方が分からず戸惑っています。ファイルを分けてset関数を格納しようと考えています。
  • プログラムの実験用のコードが記載されたjikken1関数とjikken2関数を別ファイルに格納しています。
回答を見る
  • ベストアンサー

matlabGUIのコールバック処理について

matlabという言語を用いてGUIを構築しています。 よろしければアドバイスお願い致します。 作成しているプログラムはGUIDEを使用せずに作成してきました。 現在、タブ機能を作成しており、ボタンを押した時にset(handle,'visible','off/on')を用いて メニュー内の各ボタンを表示/非表示させることで実現しようと考えています。 このset関数はボタンの数が増えることによって行数が増えるため、メイン文とは別ファイルにこのset関数を格納したいと考えています。 しかし、各ボタンの引数の渡し方が分からず戸惑っています。 下記が私が作成した実験用のプログラムです。 それぞれの関数(jikken1,jikken2)は別ファイルに格納されています。よろしくお願いします。 function jikken1 %% メニュー画面の作成 file_menu = figure('Name','Change FileName',... 'NumberTitle','off',... 'Position',[600,100,220,100]); set(gcf,'Menubar','none') ph = uipanel('Parent',file_menu,'Title','',... 'Position',[.02 .02 .96 .93]); %%ボタンの作成 file_menu_update_button = uicontrol('Style', 'pushbutton', 'String', '適用',... 'Position', [90 10 40 20],'Callback','jikken2'); end function jikken2(iranai,iirana) %%ボタンの非表示処理 set(file_menu_update_button,'visible','off') end

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

ええと… 現在疑問となっているのは、 function jikken2(iranai,iirana) の引数iranai,iiranaを入力として使いたいなんだけど、 file_menu_update_button = uicontrol('Style', 'pushbutton', 'String', '適用',... 'Position', [90 10 40 20],'Callback','jikken2(iranai,iirana)'); とすると 「変数、または関数iranaiは未定義です」 みたいなエラーが出るのでどうしましょう?ということですかね? で、iranaiとかには非表示にするボタンとかのハンドルを入れるって感じでしょうか? そうですね… まあお手軽なのは各ボタンにタグをセットしておいて(set(handle,'Tag','Hogehoge')みたいに)、 あとは function jikken2(iranai,iirana) 内で h=findall(0,'Tag','Hogehoge'); とすれば(Hogehogeというタグがユニークなものであれば)一つのハンドルに決まるのであとはsetに使うことができます。 あるいは、guidataを用いて各ハンドルをfigureに保存しておき(構造体の形にすれば複数のハンドルを保存することが可能です)、 uicontrol('Style', 'pushbutton', 'String', '適用',... 'Position', [90 10 40 20],'Callback','jikken2(gcbo)'); とすれば、コールバックをしたときにgcbo(get call back object)のハンドルを関数jikkenn2に渡すので、関数jikken2内で function jikken2(h) H=guidata(h); とすればHの中に各ハンドルの構造体が入るので、後はsetに使うことができます。 あと、これはお求めの方法ではないかも知れませんが、 タブ機能を作るってことは ボタンAを押す→Aに関するオブジェクトだけ表示する ボタンBを押す→Bに関するオブジェクトだけ表示する みたいなことをしたいんですよね?で、ボタンAとボタンBはラジオボタンにしてるって感じでしょうか。 だとすると、 uipanelを複数作って(仮にuipanelA、uipanelBとします)、Aに関するオブジェクトはuipanelAの子に、Bに関するオブジェクトはuipanelBの子にします。 ボタンAを押す→uipanelAを表示、uipanelBを非表示 ボタンBを押す→uipanelBを表示、uipanelAを非表示 とすればお望みの機能ができると思うのですが。いちいち各オブジェクトのvisibleプロパティをオフにすることなく、uipanel自体のvisibleプロパティをon,offにすることで表示、非表示を実現出来ますし。uipanelAとuipanelBを完全に重ねてしまえば完全にタブ風になりますよね。 ただ、visibleをoffにしても前後関係は変わらないので、例えばuipanelAがuipanelBより前にあると、ボタンBを押すとuipanelBは見えるけどボタンなどの操作が出来ない、という状態になるかも知れません。その場合、figure上のChildrenプロパティの順番を替えてやることで解消されるはずです。 長文失礼しました。「そういうことじゃないんだよ」「そういうことだけど、説明が下手でよくわからないよ」 とかありましたら補足願います。もっと詳細な動作や現在意図しているコードの詳細がわかればもう少し有益な回答ができるかも知れません。 参考になれば幸いです。

aporochoko
質問者

お礼

御解答ありがとうございました。 質問内容が分かり難くて申し訳ありませんでした。 私のやりたいことは回答者様の仰る通りです。 回答者様の提言頂いたボタンにTagをつける方法で無事解決することができました! 非常に分かりやすい解説ありがとうございました!

関連するQ&A

  • jQuery コールバック関数について

    jQueryの勉強をしています。 コールバック関数というところで、下のようなソースがあるのですが、iとoriginalがどうして取得できているのかが分かりません。 <script> $(document).ready(function(){ $("#btn").click(function(){ $("#test").text(function(i,original){ return "旧: " + original + "/新: 文字が変わりました! (index: " + i + ")"; }); }); }); </script> </head> <body> <p id="test">文字が変わります</p> <button id="btn">旧/新 テキスト表示</button> </body> 教えていただけないでしょうか? 宜しくお願いします。

  • クラスモジュールの処理

    VB6.0で開発しています。 以下のようにクラスモジュールを作ったのですが フォームでコマンドボタンを押したら 処理されるようにしたいのですが どうすればいいかわかりません。 教えてください。 Class CExcel Public App Public WshShell Public ErrDescription Private WorkBook Public CurBook Private Sub Class_Initialize() Call InitSetting() End Sub Private Sub Class_Terminate() Call Quit() End Sub Public Default Function InitSetting() if IsEmpty( App ) then Set App = CreateObject("Excel.Application") end if if IsEmpty( WshShell ) then Set WshShell = CreateObject("WScript.Shell") end if App.DisplayAlerts = False Set CurBook = Nothing end function Public Function Quit() If not IsEmpty( App ) Then For Each Workbook In App.Workbooks WorkBook.Saved = True Next App.Quit Set App = Nothing App = Empty Set CurBook = Nothing End If End Function Public Property Let Visible( bFlg ) App.Visible = bFlg End Property Public Property Get Visible Visible = App.Visible End Property Public Function Open( strPath ) on error resume next Set Open = App.Workbooks.Open(strPath) if Err.Number <> 0 then Set Open = Nothing ErrDescription = Err.Description Exit Function end if on error goto 0 Set CurBook = Open ' アクティブなウィンドウを最大化 App.ActiveWindow.WindowState = xlMaximized End Function Public Function Create( strPath ) Dim nBooks App.Workbooks.Add nBooks = App.Workbooks.Count Set Create = App.Workbooks( nBooks ) Set CurBook = Create CurBook.Activate App.ActiveWindow.WindowState = xlMaximized if strPath <> "" then on error resume next CurBook.SaveAs( strPath ) if Err.Number <> 0 then MsgBox( Err.Description ) Exit Function end if on error goto 0 end if End Function Public Function Close( MyBook ) if IsObject( MyBook ) then MyBook.Saved = True MyBook.Close Set MyBook = Nothing MyBook = Empty else if CurBook is Nothing then else CurBook.Saved = True CurBook.Close Set CurBook = Nothing end if end if End Function Function Save( MyBook ) if IsObject( MyBook ) then MyBook.Save else CurBook.Save end if End Function Function SaveAs( MyBook, strPath ) if IsObject( MyBook ) then MyBook.SaveAs strPath else CurBook.SaveAs strPath end if End Function Function Load( strPath ) if not IsEmpty( App ) then MsgBox( "Excel をロードする前に、Quitを実行して下さい   " ) Exit Function end if Call WshShell.Run( _ "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _ strPath _ ) End Function End Class

  • イベントをつかってコールバックさせたいのですが

    HTAスクリプトでIEを起動し、ページが表示されるのを待つプログラムを 作成しようとしています。 JavaScriptではスリープができないのでisBusyをがfalseになるのを 待つ代わりに、IEオブジェクトのイベントからコールバックさせようと思いました。 そこで次のプログラムを書いたのですが、 イベントハンドラ登録の文法が間違っているらしく、実行時に 「オブジェクトでサポートされていないメソッドまたはプロパティです」 になってしまいます。 この行でやりたいことは、ieオブジェクトの NavigateComplete2 イベントが発生したときに、onComplete が呼ばれるようにすることです。 イベントハンドラの登録方法、または ieがページを読み終わるのを検知するよい方法がありましたら お教え下さい。よろしくお願いします。 ■sample.hta <html> <script> function perform(){   var ie = new ActiveXObject("InternetExplorer.Application");   ie.visible=true;   ie.navigateComplete2 = onComplete; // ←この行がエラー   ie.navigate("http://www.1101.com"); } function onComplete(a, b){   alert("complete"); } </script> <body> <input type=button onclick="perform();" value="open"> </body> </html>

  • 自作関数をメニューボタン表示

    自作関数で消費税を作作成しました。 Function 消費税(金額) 消費税 = Int(金額 * 0.05) End Function Excelで表を作成して、セルに関数を入力しておりましたが、 VBAで作成したいと考え、教本で作成しました。 使用頻度が高いので、メニューボタン(もしくはツールボタン)に作成したいのですが、可能でしょうか。 よろしくお願いします。

  • Actionscript 同じような処理をまとめたい

    閲覧ありがとうございます。 プログラム初心者です。 FlashでサイトのTOPページに置くメニューを作成しています。 Flashのヘルプを見ながらできたのですが5つあるボタンにつきいちいち関数を作っていて、もう少しコンパクトに書きたいと思いました。 きれいに書くにはどうするのがベストでしょうか? もしかしてActionscriptは一つのボタンにつき一つの関数を書かなければいけないのですか? //自分なりに書いてみてうまくいかなかったソースです。 //実行するとボタンを押す前に一番上に書いたアドレス(http://address1.php)に飛んでしまいました。 var Add1:String = "http://address1.php"; var Add2:String = "http://address2.php"; var Add3:String = "http://address3.php"; var Add4:String = "http://address4.php"; var Add5:String = "http://address5.php"; function onClickButton(event:MouseEvent, address:String) :void { var selectURL:URLRequest = new URLRequest(address); navigateToURL(selectURL,"_self"); } button1.addEventListener(MouseEvent.CLICK, onClickButton(Add1)); button2.addEventListener(MouseEvent.CLICK, onClickButton(Add2)); button3.addEventListener(MouseEvent.CLICK, onClickButton(Add3)); button4.addEventListener(MouseEvent.CLICK, onClickButton(Add4)); button5.addEventListener(MouseEvent.CLICK, onClickButton(Add5));

    • ベストアンサー
    • Flash
  • エクセルVBA フォームへ動的に貼り付けたボタンのクリックイベントを検知する方法を教えてください

    (1)excel97にのVBAでフォームを作成します。 デフォルトの場合はUserForm1という名前がつきます。 (2)標準モジュールとして下記のコードを作成します。 Sub ボタンを付けて表示() Dim btn As Control  With UserForm1       ’ボタンを"button"という名前で作成します   Set btn = .Controls.Add("Forms.CommandButton.1", "button")   ’ボタンの設定をします   With btn    .Top = 5    .Left = 5    .Height = 20    .Width = 200    .Caption = "push me!"   End With   ’フォームの設定をし、表示します   .Height = 60   .Width = 220   .Show  End With End Sub (3)マクロを実行するとフォームが表示されます。 そこでこのボタン("push me!"と表示されています)をクリックします。 このクリックを検知してマクロを動かしたいのですが可能でしょうか? なおUserForm1に下記のコードを付けてみたのですがクリックは検知できませんでした。 Private Sub button_Click()  MsgBox "You click the button." End Sub

  • C++製DLLにてVB.NET関数を引数付きでコールバックしたい。

    C++製DLLにてVB.NET関数を引数付きでコールバックしたい。 以下のようなソリューションがあります。 ソリューションには、VB.NETによるプロジェクトapp、C++によるプロジェクトdllがあり、 名前のとおり、appはWindowsフォームアプリケーション、dllはクラスライブラリです。 *** VisualStudio.NET 2003 ソリューション *** === VB.NETプロジェクト:app.exe === --- Module1.vb --- Module Module1 Delegate Function _t() As Int32 <System.Runtime.InteropServices.DllImport("dll.dll")> Public Function dllfunc(ByVal lpFunc As _t) As Int32 End Function End Module --- Form1.vb --- Public Class Form1 Inherits Form Private button1 As Button Public Sub New() button1 = New Button button1.Parent = Me : button1.Text = "button1" AddHandler button1.Click, AddressOf MyClass.GetEvent End Sub Private Sub GetEvent(ByVal sender As Object, ByVal e As EventArgs) dllfunc(AddressOf func1) End Sub Public Function func1() As Int32 MsgBox("func1@vb.net") Return 123 End Function End Class === C++ライブラリプロジェクト:dll.dll === --- dll.def --- LIBRARY dll EXPORTS dllfunc --- dll.h --- #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif DLL_API void dllfunc(int* vbfunc(void)); -- dll.cpp --- #include "stdafx.h" #include "dll.h" #include "stdio.h" #include "windows.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return true; } DLL_API void dllfunc(int* vbfunc(void)) { char str[16]; sprintf(str,"vbfunc() = %d",vbfunc()); MessageBoxA(NULL,str,"dll",MB_OK); } --- stdafx.cpp, stdafx.h --- (省略) *** ソリューション ここまで *** [ 動作 ] appを実行すると、Form1にbutton1が生成される。 button1をクリックするとGetEventが呼ばれ、func1のアドレスを引数としたdllfunc()を呼びます。 dll側のdllfunc()から、app側のfunc1()を呼び、戻り値の123を表示します。 [ 質問 ] dllfunc()から引数付きでfunc1()を呼びたいが、記述の方法が分かりません。 ご教示お願い致します。

  • EXCELVBAで同じフォームボタンで表示のON/OFFをする。

    EXCELVBA初心者です。 図形描写の”表示”、”非表示”はできたのですが 同じボタンをクリックしてON/OFFする方法を教えてください。 ボタンが2個だといまいちなので、よろしくお願いします。 Sub 図形_del() ActiveSheet.Shapes("daily7").Visible = False End Sub Sub 図形_add() ActiveSheet.Shapes("daily7").Visible = True End Sub

  • onclickイベントで、PHPの関数をコール

    下記のようなPHPスクリプトで、ボタンが押された時の、onclickイベントで<?php upload_file() ?>として PHPのupload_file() 関数をコールしてるのですが、画像ファイルがアップできません。 どこが間違いなのか、教えていただけますか。 --------------------------------------------------------------------------------- <form name="form2" method="POST" enctype="multipart/form-data" action="bbs.php"> <!-- ファイル参照フォームを表示する --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <input type="file" name="upfile" tabindex="6"> <input type="button" value="画像を送信" tabindex="7" onclick="<?php upload_file() ?>"> </form>

    • 締切済み
    • PHP
  • エクセルVBA ラベル表示/非表示の切替速度

    質問失礼します。 エクセル2003でラベル(コントロールツール)を作成し、 ラベルの表示/非表示を別に作成したボタンを押すたびに 切り替えるマクロを作成しています。 一応、自分で作成したものは動作するのですが、余りにも処理が遅いです。 (ボタンを押下後、処理が完了するまでに8秒前後かかります。) 『この場合はこうした方がいい』や『こうすれば早くなる』、または『それが限界』などの ご意見があれば、ご返答お願い致します。 ※ラベルは1グループ18個のa・b・cの3グループで合計54個あります。 ※ラベルのオブジェクト名はa1・a2・a3・・・という規則性でつけています。 <作成例> Private Sub button1_Click() Dim test As Boolean If a1.Visible Then test = False Else test = True End If With ActiveSheet For i = 1 To 18 Step 1 .OLEObjects("a" & i).Visible = test .OLEObjects("b" & i).Visible = test .OLEObjects("c" & i).Visible = test Next i End With End Sub

専門家に質問してみよう