我正在开发应用程序设计软件。在应用程序中,用户将在运行一些计算之前选择一系列选项。为了简化这个过程,我添加了一个“另存为.”菜单,以便用户可以将当前设置保存到文件(.mat)中,并在下次打开应用程序时重新加载它们。
我想要实现的是,用户可以双击先前保存的.mat文件,该文件将启动应用程序,应用程序将自动读取双击文件并加载所有设置。
所有这些都需要在将应用程序编译并作为可执行文件分发之后发生。
我认为实现这一点的一种方法是为应用程序创建一个启动窗口,该窗口调用主窗口,将文件路径作为参数传递。
任何建议都会很感激的。
发布于 2018-08-29 00:24:49
嗨,我想我可能有一个很简单的解决方案,尽管涉及到你。
简要的解决方案概述(TL;DR)
用.mat以外的扩展名保存应用程序中的设置,例如.mydat。添加一个应用程序输入参数,并让startupFcn将该参数作为文件名处理到*.mydat文件中,并确保同时处理该参数被忽略的情况。保存第一个输出文件后,使用windows Open with.选择你的应用程序。现在,双击*.mydat文件将打开应用程序的.exe,并将单击文件的文件名提供给startupFcn中的输入参数。
在Matlab2018a中的一个示例是windows 10上编译的exe。
好吧,开始吧。让我们设置一个简单的应用程序(我称之为runAppFromData),它将一个字符串输入到一个编辑字段中,并将其保存在一个名为“setingsValues.mydat”的文件中。看上去:

Save按钮的回调将Value收集到一个名为value的局部变量中,然后将其保存到磁盘中:
% Button pushed function: Save
function save(app, event)
    value = app.InputField.Value;%#ok
    % User selects save location
    saveLocation = uigetdir();
    % Now just save the value variable to the selected location.
    save(fullfile(saveLocation,'settingsValues.mydat'), 'value', '-mat');
end我不知道appdesigner是什么时候添加了这个功能来“运行带有输入的应用程序”的,但是我在2018a中有了这个特性:

我们只输入一个fileName,它需要一个文件名作为字符串(您将在下面看到原因)。因此,添加输入并单击OK。然后我们被发送到startupFcn的“代码视图”。在这里,我们将编写解析输入文件的逻辑。对于我的简单示例应用程序,我将输入文件加载到结构中,然后将值发送到编辑字段:
% Code that executes after component creation
function startupFcn(app, fileName)
    if nargin < 2 % app is itself an argument
        % just continue running the application without error
        return
    end
    % fileName is a string, so let's load it into a struc
    S = load(fileName, '-mat');
    % The value field will be there because that is how we wrote it
    app.InputField.Value = S.value;
end注意,我执行了一次nargin检查来处理第一次运行的情况(只要应用程序从实际的可执行文件中运行)。
MATLAB并不关心matlab文件的扩展名是什么,如果您有一个未知的文件扩展名,例如.mydata,双击windows中的文件将要求您选择应用程序,这对您的部署是有益的:

有几件事要考虑。
当应用程序从.exe打开时,它总是显示默认值。如果要输入其他默认值,可以编辑windows快捷方式目标字段,为所需输入文件提供文件路径(请参阅here)。这样可以使用新的默认值保存重新编译,但文件必须保留在某个位置(您也可以将其打包到应用程序中)。
对不起,这个回答太长了!希望能帮上忙!
发布于 2018-08-03 12:41:29
您不能双击.mat文件并打开整个可执行文件,但是您肯定可以添加一个要求您打开.mat文件的启动函数。不过,我的建议是确保至少有一个模板文件,这样用户在第一次运行没有打开文件的程序时就不会遇到问题。
https://stackoverflow.com/questions/51664266
复制相似问题