从文件存储设置启动应用程序并在启动时加载它们
Start App from file storing settings and load them at startup
我正在应用程序设计器中开发应用程序。在应用程序中,用户将在 运行 一些计算之前 select 一堆选项。
为了简化这个过程,我添加了一个 "Save as..." 菜单,以便用户可以将当前设置保存到一个文件 (.mat
) 并在他们下次打开应用程序时重新加载它们。
我想要实现的是,用户可以双击之前保存的 .mat
文件,这将启动应用程序,应用程序将自动读取双击的文件并加载所有设置.
所有这些都需要在应用程序编译并作为可执行文件分发后发生。
我认为实现此目的的一种方法是启动 window 调用主 window 的应用程序,将文件路径作为参数传递。
如有任何建议,我们将不胜感激。
您不能双击.mat 文件并打开整个可执行文件,但您绝对可以添加要求您打开.mat 文件的启动功能。不过,我的建议是确保您至少有一个模板文件,这样用户就不会 运行 在第一次 运行 没有文件的情况下遇到问题打开。
您好,我想我可能有一个相当简单但复杂的解决方案适合您。
解决方案简要概述 (TL;DR)
使用 而非 .mat
的扩展名保存应用程序的设置,例如.mydat
。添加一个 App Input Argument 并让 startupFcn
将参数视为 *.mydat
文件的文件名并且 一定要处理参数被遗漏的情况。保存第一个输出文件后,使用 windows 打开方式... 到 select 您的应用程序。现在双击 *.mydat
文件将打开您应用程序的 .exe
并将单击文件的文件名提供给 startupFcn
.
中的输入参数
MATLAB 2018a 中的示例作为 windows 10 上的已编译 exe。
好的,开始吧。让我们设置一个简单的应用程序(我称之为 运行AppFromData),它将字符串输入到编辑字段并将其保存在名为 'settingsValues.mydat' 的文件中。看起来像:
保存 按钮的回调将 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
何时将此功能添加到 "run app with inputs" 但我在 2018a:
我们进行单个输入,fileName
需要一个字符串形式的文件名(您将在下面看到原因)。所以添加输入并单击确定。然后我们被送到 startupFcn
的 "code view"。在这里,我们将编写解析输入文件的逻辑。对于我的简单示例应用程序,我将输入文件加载到结构中,然后将值发送到编辑字段:
% 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 快捷方式 Target 字段以提供所需输入文件的文件路径(请参阅 here)。这节省了使用新的默认值重新编译,但文件必须保留在某个地方(您也可以将其与应用程序打包)。
抱歉,这个回答太长了!希望对您有所帮助!
我正在应用程序设计器中开发应用程序。在应用程序中,用户将在 运行 一些计算之前 select 一堆选项。
为了简化这个过程,我添加了一个 "Save as..." 菜单,以便用户可以将当前设置保存到一个文件 (.mat
) 并在他们下次打开应用程序时重新加载它们。
我想要实现的是,用户可以双击之前保存的 .mat
文件,这将启动应用程序,应用程序将自动读取双击的文件并加载所有设置.
所有这些都需要在应用程序编译并作为可执行文件分发后发生。
我认为实现此目的的一种方法是启动 window 调用主 window 的应用程序,将文件路径作为参数传递。
如有任何建议,我们将不胜感激。
您不能双击.mat 文件并打开整个可执行文件,但您绝对可以添加要求您打开.mat 文件的启动功能。不过,我的建议是确保您至少有一个模板文件,这样用户就不会 运行 在第一次 运行 没有文件的情况下遇到问题打开。
您好,我想我可能有一个相当简单但复杂的解决方案适合您。
解决方案简要概述 (TL;DR)
使用 而非 .mat
的扩展名保存应用程序的设置,例如.mydat
。添加一个 App Input Argument 并让 startupFcn
将参数视为 *.mydat
文件的文件名并且 一定要处理参数被遗漏的情况。保存第一个输出文件后,使用 windows 打开方式... 到 select 您的应用程序。现在双击 *.mydat
文件将打开您应用程序的 .exe
并将单击文件的文件名提供给 startupFcn
.
MATLAB 2018a 中的示例作为 windows 10 上的已编译 exe。
好的,开始吧。让我们设置一个简单的应用程序(我称之为 运行AppFromData),它将字符串输入到编辑字段并将其保存在名为 'settingsValues.mydat' 的文件中。看起来像:
保存 按钮的回调将 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
何时将此功能添加到 "run app with inputs" 但我在 2018a:
我们进行单个输入,fileName
需要一个字符串形式的文件名(您将在下面看到原因)。所以添加输入并单击确定。然后我们被送到 startupFcn
的 "code view"。在这里,我们将编写解析输入文件的逻辑。对于我的简单示例应用程序,我将输入文件加载到结构中,然后将值发送到编辑字段:
% 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 快捷方式 Target 字段以提供所需输入文件的文件路径(请参阅 here)。这节省了使用新的默认值重新编译,但文件必须保留在某个地方(您也可以将其与应用程序打包)。
抱歉,这个回答太长了!希望对您有所帮助!