1

我有两个 gui,它们是彼此的精确副本。

然而,每个 gui 中只使用了一些功能。我基本上在 GUIDE 中以两个不同的名称保存了一个整体 gui。

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

SubguiA 和 subguiB 从父 gui 上的两个按钮启动。在每个 subgui 中都有一个用户控件(一个面板),其中 'UserData' 设置为 3005。我从按钮 1 运行 subguiA。我从按钮 2 运行 subguiB 并介入并从内部询问 hpanel = findobj('UserData',3005) subguiB 上的文本框之一的 CreateFcn。我将 hpanel 作为 2x1 double 返回,因为它在内存中找到了两个这样的面板。我明白了。

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

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

4

2 回答 2

1

尝试另一个功能:

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

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

于 2013-08-07T07:22:00.803 回答
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 的控件发生更改,则只有单例需要了解这些更改的内部结构。

于 2013-08-07T14:53:16.807 回答