How to save all state in my App Designer app?

42 次查看(过去 30 天)
I have built an app for a specialized scientific analysis using App Designer. It is a complex interface with 8 tabs, and well over 100 controls. And it will grow.
It would be very helpful if I could provide my users with a "Save all settings" button. Question: is there a good way to programmatically enumerate all Components (as distinct from other properties or methods) in the app? And then, to read or set the value for each?

回答(2 个)

Ken
Ken 2024-4-21
移动:Voss 2024-4-21
That example was half the answer, but it required enumerating the components to be saved, which doesn't grow well. I wanted to automatically traverse the app data structure and FIND programmatically all components whose values should be saved. Here's what worked for me. This solution will restore all components that match, leave alone all components that are not found in the saved data, and warn (in the Matlab window) of any saved state that did not match a component in the program.
This creates a robust save/load mechanism that will not crash even in the presence of version changes that add or delete components.
function SaveSettings(app)
state = struct();
props = properties(app);
for i = 1:length(props)
name = props{i};
comp = app.(name); % May be a component or a property, so far...
c = string(class(comp));
if c == "matlab.ui.control.NumericEditField" ...
|| c == "matlab.ui.control.EditField" ...
|| c == "matlab.ui.control.CheckBox"
state.(name)= comp.Value;
elseif c == "matlab.ui.control.DropDown"
% These are weird, had to be specially handled to save a string
% instead of an index into the list:
v = comp.Value;
state.(name)= comp.Items{v};
end
end
save('SavedSettings.mat','state');
end
function LoadSettings(app)
load('SavedSettings.mat', 'state')
fields = fieldnames(state);
for i = 1:length(fields)
name = fields{i};
try % or could use isprop(app, name) to test presence
comp = app.(name);
comp.Value = state.(name);
catch err
disp(['Did not use saved field', name, ': ', err.identifier])
end
end
end
  1 个评论
Nils Wiesendahl
Nils Wiesendahl 2024-11-14,13:39
编辑:Nils Wiesendahl 2024-11-14,13:42
Slight Addition to Ken's Version. I have added CheckBoxTrees, ListBox and UITables as well now!
function SaveAppStateButtonPushed(app)
state = struct();
props = properties(app);
for i = 1:length(props)
name = props{i};
comp = app.(name); % May be a component or a property, so far...
c = string(class(comp));
if c == "matlab.ui.control.NumericEditField" ...
|| c == "matlab.ui.control.EditField" ...
|| c == "matlab.ui.control.CheckBox"
state.(name)= comp.Value;
elseif c == "matlab.ui.control.DropDown"
% These are weird, had to be specially handled to save a string
% instead of an index into the list:
v = comp.Value;
if ~isempty(v)
id = find(strcmp(comp.Items,v));
state.(name)= comp.Items{id};
end
elseif c == "matlab.ui.container.CheckBoxTree"
for ii = 1:size(comp.CheckedNodes,1)
tag(ii) = string(app.(name).CheckedNodes(ii).Tag);
end
if exist('tag','var')
state.(name) = tag;
end
elseif c == "matlab.ui.control.ListBox"
state.(name) = comp.Items;
elseif c == "matlab.ui.control.Table"
state.(name) = comp.Data;
end
end
save('SavedSettings.mat','state');
end
function LoadAppStateButtonPushed(app)
load('SavedSettings.mat', 'state')
fields = fieldnames(state);
for i = 1:length(fields)
name = fields{i};
try % or could use isprop(app, name) to test presence
comp = app.(name);
if class(comp) == "matlab.ui.container.CheckBoxTree"
tags = state.(name);
for ii = 1:size(tags,2)
checkedNodes(ii) = findall(0,'tag',tags(ii));
end
app.(name).CheckedNodes = checkedNodes;
elseif class(comp) == "matlab.ui.control.ListBox"
comp.Items = state.(name);
elseif class(comp) == "matlab.ui.control.Table"
comp.Data = state.(name)
else
comp.Value = state.(name);
end
catch err
disp(['Did not use saved field', name, ': ', err.identifier])
end
end
end

请先登录,再进行评论。


Taylor
Taylor 2024-4-18

类别

Help CenterFile Exchange 中查找有关 Dialog Boxes 的更多信息

产品


版本

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by