MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   尝试在MATLAB UI中实现保存/加载对象功能的过程陷入困境 (https://www.labfans.com/bbs/showthread.php?t=22621)

poster 2019-12-10 16:49

尝试在MATLAB UI中实现保存/加载对象功能的过程陷入困境
 
我正在尝试在MATLAB(R2009a)UI中实现保存/加载功能。我的对象实现了一个布局功能,该功能为该对象生成一个用户界面。我正在尝试实现保存/加载按钮的回调。保存按钮将起作用,并将对象保存到MAT文件中,以便以后加载。

我的问题是实现加载按钮的回调。我似乎无法从MAT文件中加载数据并更新新对象的属性。非常感谢任何关于我哪里出问题的建议以及关于我可能如何进行的建议。

重要的代码是我的类定义文件,当然我的实际对象实现了更多的属性和方法,但这是我所拥有内容的框架

classdef myObj> var = myObj; >> var.load_object; 但是,如果我以这种方式使用[I]LayoutFcn.m[/I]中定义的[I]loadingMyObject[/I]回调

>> var = myObjl >> var.LayoutFcn -> click Load button to call _loadingMyObject_ 不会影响[I]var[/I]属性。在单击“加载”按钮后, [I]var[/I]将仍然具有其默认属性值。
[LIST=1][*]根据[URL="https://stackoverflow.com/questions/660399/stumped-trying-to-implement-save-load-object-functionality-in-a-matlab-ui/660791#660791"]gnovice的[/URL]建议将加载方法更改为使用[I]set[/I]会引发以下错误
[INDENT] ???使用==>将FujiCalibration的Conversion设置为double时出错。

[/INDENT]即使我为每个属性设置/获取方法;如

method set.image(self,II) % ... some data validation code ... self.image = II end[*]按照[URL="https://stackoverflow.com/questions/660399/stumped-trying-to-implement-save-load-object-functionality-in-a-matlab-ui/660649#660649"]Fooz先生的[/URL]建议,使用循环来设置每个字段并不是真正的选择,因为我的整个类都有公共常量,设置它们时会抛出错误。
[/LIST]我正在寻找一种解决方案,可以避免我不得不手动设置每个字段的代码。尽管目前看来这是唯一的可能性。


回答:
我相信[URL="https://stackoverflow.com/questions/660399/stumped-trying-to-implement-save-load-object-functionality-in-a-matlab-ui/660649#660649"]福兹先生[/URL]是对的。传递给load_object的self变量是类型为“ myObj”的对象,但该行如下:

self = tmp.obj; 只是用存储在tmp.obj中的结构覆盖了self变量。正在做:

self.image = tmp.obj.image; 相反,应该为对象self的image属性调用set运算符。在MATLAB文档中,有一个[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_oop/brqy3km-24.html"]示例类定义,[/URL]其中包含一个名为“ set.OfficeNumber”的方法来说明这一点。

另外,函数savingMyObject中的以下行可能是不必要的:

obj = self; 我认为,如果在类代码中使用名称“ obj”代替“自我”一词,这可能是最有意义的(并使代码更清晰一些)(因为文档倾向于这样做)。在MATLAB中,“ self”似乎不是任何特殊的关键字(就像其他语言一样)。据我所知,这只是另一个变量。 =)

编辑#1:

如果看起来不必在load_object方法中分别设置每个属性的感觉听起来很有趣,那么一种解决方法是,您可以为对象设置一个SET方法,该对象的设计类似于[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/set.html"]用于处理图形[/URL]的[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/set.html"]SET方法[/URL] 。该SET命令可以接受结构输入,其中每个字段名称是属性名称,每个字段值是该属性的新值。然后,您将收到一个像这样的电话:

set(self,tmp.obj); 相当短,尤其是在您要设置许多属性的情况下。当然,您必须为对象[I]编写[/I]新的SET方法,但是如果缩短的语法在其他地方也很方便,则可能值得进行额外的工作。 =)

编辑#2:

您可能可以将[URL="https://stackoverflow.com/questions/660399/stumped-trying-to-implement-save-load-object-functionality-in-a-matlab-ui/660649#660649"]Fooz先生[/URL]建议的循环与[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/try.html"]try / catch[/URL]块结合使用:

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

[url=https://stackoverflow.com/questions/660399]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:27

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.