【问题标题】:How to restrict findobj to only find object in gui being currently created?如何将 findobj 限制为仅在当前创建的 gui 中查找对象?
【发布时间】:2013-08-07 22:53:16
【问题描述】:

我有两个完全一样的 gui。

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

我将单体应用划分为 subguis,每个 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(当前正在创建的对象?)中查找对象。 谢谢

【问题讨论】:

    标签: matlab


    【解决方案1】:

    尝试其他功能:

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

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

    【讨论】:

      【解决方案2】:

      您可以尝试另一种共享资源的方法,以免出现此问题。在 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 的控件发生更改,则只有单例需要了解这些更改的内部结构。

      【讨论】:

      • 这很有趣,史蒂夫!感谢您的帮助。
      猜你喜欢
      • 2011-01-22
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2012-06-19
      相关资源
      最近更新 更多