Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在尝试在MATLAB(R2009a)UI中实现保存/加载功能。我的对象实现了一个布局功能,该功能为该对象生成一个用户界面。我正在尝试实现保存/加载按钮的回调。保存按钮将起作用,并将对象保存到MAT文件中,以便以后加载。
我的问题是实现加载按钮的回调。我似乎无法从MAT文件中加载数据并更新新对象的属性。非常感谢任何关于我哪里出问题的建议以及关于我可能如何进行的建议。 重要的代码是我的类定义文件,当然我的实际对象实现了更多的属性和方法,但这是我所拥有内容的框架 classdef myObj> var = myObj; >> var.load_object; 但是,如果我以这种方式使用LayoutFcn.m中定义的loadingMyObject回调 >> var = myObjl >> var.LayoutFcn -> click Load button to call _loadingMyObject_ 不会影响var属性。在单击“加载”按钮后, var将仍然具有其默认属性值。
回答: 我相信福兹先生是对的。传递给load_object的self变量是类型为“ myObj”的对象,但该行如下: self = tmp.obj; 只是用存储在tmp.obj中的结构覆盖了self变量。正在做: self.image = tmp.obj.image; 相反,应该为对象self的image属性调用set运算符。在MATLAB文档中,有一个示例类定义,其中包含一个名为“ set.OfficeNumber”的方法来说明这一点。 另外,函数savingMyObject中的以下行可能是不必要的: obj = self; 我认为,如果在类代码中使用名称“ obj”代替“自我”一词,这可能是最有意义的(并使代码更清晰一些)(因为文档倾向于这样做)。在MATLAB中,“ self”似乎不是任何特殊的关键字(就像其他语言一样)。据我所知,这只是另一个变量。 =) 编辑#1: 如果看起来不必在load_object方法中分别设置每个属性的感觉听起来很有趣,那么一种解决方法是,您可以为对象设置一个SET方法,该对象的设计类似于用于处理图形的SET方法 。该SET命令可以接受结构输入,其中每个字段名称是属性名称,每个字段值是该属性的新值。然后,您将收到一个像这样的电话: set(self,tmp.obj); 相当短,尤其是在您要设置许多属性的情况下。当然,您必须为对象编写新的SET方法,但是如果缩短的语法在其他地方也很方便,则可能值得进行额外的工作。 =) 编辑#2: 您可能可以将Fooz先生建议的循环与try / catch块结合使用: fn = fieldnames(tmp.obj); for i = 1:numel(fn), try self.(fn{i}) = tmp.obj.(fn{i}); catch % Throw a warning here, or potentially just do nothing. end end 更多&回答... |
![]() |
![]() |