如何限制findobj只能找到当前创建的gui中的对象?

时间:2013-08-06 16:41:24

标签: matlab

我有两个guis,彼此是完全相同的副本。

但是每个gui中只使用了一些功能。我基本上用两个不同的名字在GUIDE中保存了一个单片gui。

我将整体块划分为subguis,每个都使用相同的fig文件,但保存在带有不同名称的GUIDE中。

SubguiA和subguiB是从父gui上的两个按钮启动的。在每个子区域中都有一个用户控件(面板),其'UserData'设置为3005.I从按钮1运行subguiA。我从button2运行subguiB并进入并从内部请求hpanel = findobj('UserData',3005) subguiB上其中一个文本框的CreateFcn。我把hpanel作为2x1的两倍,因为它在内存中找到了两个这样的面板。我明白了。

然后,当我使用hpanel设置文本框的用户数据为“父”时,应用程序崩溃,因为hpanel应该是1x1。我以为我会在findobj中使用subguiB的句柄,因此特别限制findobj到subguiB。但是,当正在运行subguiB上的文本框的CreateFcn时,它还没有整个subguiB的hObject。整个subguiB的hObject可以从subguiB的OpeningFcn获得,它只在执行了所有用户控件的CreateFcns之后运行。

所以问题是:如何将findObj限制为仅在subguiB(当前正在创建?)中查找对象。 谢谢

2 个答案:

答案 0 :(得分:1)

尝试另一个功能:

findall(handle_list,'property','value',...)

在这里你可以使用一个句柄作为你想要搜索具有属性的对象的父...仍然你必须确保得到正确的对象。可能给出一个独特的名字会有所帮助!

答案 1 :(得分:0)

您可以尝试另一种共享资源的方法,以便您不会遇到此问题。在Mathworks文件交换站点中,有一个面向对象的类,称为Singleton(http://www.mathworks.com/matlabcentral/fileexchange/24911-design-pattern-singleton-creational),您可以使用它来构建自定义子类以允许交换重要信息并抽象GUI界面详细信息。

单例的意思是保证在任何程序中只有一个,因此您可以在该对象中存储状态信息,并能够从任何地方访问它。无需搜索。

当每个GUI调用其CreateFcn时,它获取您创建的单例子类的实例句柄,并设置GUI [A,B]窗口句柄属性,以便其他GUI可以通过相同的单例直接访问它。然后,您可以构建一个消息传递系统,以跨GUI交换或复制值,或者将高级协调功能编排到整个应用程序中。对于应用程序的不同部分需要通信的任何功能,这是一个很好的范例,例如允许外部Matlab脚本与GUI交互以进行批处理类型处理。例如,一个GUI按钮回调可以调用单例对象中的方法,以使第二个GUI弹出并显示,然后使用刚刚输入的第一个GUI中的所有最新数据上下文填充该GUI,而第一个GUI甚至不知道任何关于第二个GUI的内部。如果GUI的控件只更改单例需要知道这些更改的内部。