Share information between two (app disigner) apps

Can anyone please tell me how can i make my main app open a secondary app which will capture some values and then send them back to my main app?

I'm aware that this issue is tackled in app designer documentation, but I have been unable to implement those steps successfully. Also, I tried to run the example but Matlab says the file doesn't exists. If anyone could please share that example it would be also very helpful.

Upvotes: 1

Views: 308

Answers (2)

sco1
sco1

Reputation: 12214

MATLAB's App Designer generates class-based GUI's rather than GUIDE's function-based GUIs. The advantage of this approach is that we can pass the GUIs around as objects rather than having to get creative with things like function returns or searching for objects by tag.

Here's a simple programmatic example that illustrates one approach to this concept. The main figure window opens a secondary prompt window, which provides two inputs. When the prompt window is closed, the primary GUI prints the input values to the command window and exits.

The main window:

classdef mainwindow < handle
    properties
        mainfig
        butt
    end

    methods
        function [self] = mainwindow()
            % Build a GUI
            self.mainfig = figure('Name', 'MainWindow', 'Numbertitle', 'off', ...
                                  'MenuBar', 'none', 'ToolBar', 'none');
            self.butt = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
                                  'Units', 'Normalized', 'Position', [0.1 0.1 0.8 0.8], ...
                                  'String', 'Push Me', 'Callback', @(h,e) self.buttoncallback);
        end

        function buttoncallback(self)
            tmpwindow = subwindow();  % Open popupwindow
            uiwait(tmpwindow.mainfig);  % Wait for popup window to be closed
            fprintf('Parameter 1: %u\nParameter 2: %u\n', tmpwindow.parameter1, tmpwindow.parameter2);

            close(self.mainfig);
        end
    end
end

The sub window:

classdef subwindow < handle
    properties
        mainfig
        label1
        box1
        label2
        box2
        closebutton

        parameter1
        parameter2
    end

    methods
        function [self] = subwindow()
            % Build a GUI
            self.mainfig = figure('Name', 'SubWindow', 'Numbertitle', 'off', ...
                                  'MenuBar', 'none', 'ToolBar', 'none');
            self.label1 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
                                    'Units', 'Normalized', 'Position', [0.4 0.7 0.2 0.05], ...
                                    'String', 'Parameter 1');
            self.box1 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
                                  'Units', 'Normalized', 'Position', [0.4 0.6 0.2 0.1], ...
                                  'String', '10');
            self.label2 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
                                    'Units', 'Normalized', 'Position', [0.4 0.4 0.2 0.05], ...
                                    'String', 'Parameter 2');
            self.box2 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
                                  'Units', 'Normalized', 'Position', [0.4 0.3 0.2 0.1], ...
                                  'String', '10');
            self.closebutton = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
                                         'Units', 'Normalized', 'Position', [0.4 0.1 0.2 0.1], ...
                                         'String', 'Close Window', 'Callback', @(h,e) self.closewindow);
        end

        function closewindow(self)
            % Drop our input parameters into this window's properties
            self.parameter1 = str2double(self.box1.String);
            self.parameter2 = str2double(self.box2.String);

            % Close the window
            close(self.mainfig);
        end
    end
end

Upvotes: 0

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23685

I have never tried to implement this on my own, but I often wandered myself how I could accomplish this if facing a complex apps architecture.

Actually, if you instantiate two GUIs in the same script/function, or if you have one GUI creating another GUI inside one of its functions, the simplest way would be to play with function handles. For example, the first GUI can pass a function handle defined among its functions to the target GUI's constructor and, this way, the target GUI can invoke it in order to modify the first GUI's data and/or properties when necessary.

The standard approach, anyway, which is considered as a best practice, works as follows. Let's assume that you have two GUIs named G1 and G2 and that they are distinct (you are not running two instances of the same GUI). If they are both visible (HandleVisibility set to on) and they both have a Tag identifier defined (G1 and G2 in our example), you can search for them within the Matlab "workspace". Hence:

% This is a G2 event handler
function pushbutton1_Callback(hObject, eventdata, handles)
    g1_h = findobj('Tag','G1');

    if (~isempty(g1_h))
        % get all data associated to G1
        g1_data = guidata(g1_h);

        % modify a G2 object based on a G1 object
        set(handles.MyTextBox,'String',get(g1_data.MyEditBox,'String'));
    end
end

Upvotes: 1

Related Questions