Синтаксис компоновки компонента Edit Field в MATLAB App Designer в родительском элементе сетки

Я хотел бы указать макет в сетке поля редактирования, как только создам его в MATLAB App Designer.

app.villes1 = uieditfield(app.GHIetPOA_grid, 'text', 'HorizontalAlignment', 'center', ...
              'Editable', 'on', 'Layout', **???**);

Я пытался использовать просто [r,c], но этот синтаксис не кажется правильным. Я погуглил свою проблему, только найдя способы указать строку и столбец, создав поле редактирования и указав строку и столбец после точечной индексации:

app.villes1.Layout.Row = 2; 
app.villes1.Layout.Column = i+2; 

Однако я не могу использовать это, потому что я фактически генерирую поле редактирования в цикле for, а точечная индексация запрещена таким образом:

function initVilles1(app)
    for i=1:8
        app.villes1(i) = uieditfield(app.GHIetPOA_grid, 'text', 'HorizontalAlignment', ...
        'center', 'Editable', 'on');
        app.villes1(i).Layout.Row = 2; 
        app.villes1(i).Layout.Column = i+2; 
     end
end

Спасибо уже! (:


person abreaultg    schedule 24.11.2019    source источник


Ответы (1)


Вам нужно инициализировать villes1 как массив gobjects.
См. Графические массивы.

Пример:

properties (Access = private)
    GHIetPOA_grid  matlab.ui.container.GridLayout
    villes1 = gobjects(1, 8);
end

Я могу только догадываться, что вы использовали следующий синтаксис: villes1 = zeros(1, 8);
Приведенный выше синтаксис создает массив из double элементов.
Затем app.villes1(i) = uieditfield(...) создает числовой дескриптор «старого стиля» вместо создания объекта.
Точечная запись запрещено при использовании числовых дескрипторов.

Вместо этого вам нужно использовать следующий синтаксис: villes1 = gobjects(1, 8);.
Теперь точечная индексация должна работать.


Вот полный код (включая сгенерированный код):

classdef app1 < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure  matlab.ui.Figure
    end


    properties (Access = private)
        Panel          matlab.ui.container.Panel
        GHIetPOA_grid  matlab.ui.container.GridLayout
        villes1 = gobjects(1, 8);
    end

    methods (Access = private)

        function initVilles1(app)
            for i=1:8
                app.villes1(i) = uieditfield(app.GHIetPOA_grid, 'text', 'HorizontalAlignment', ...
                'center', 'Editable', 'on');
                app.villes1(i).Layout.Row = 2; 
                app.villes1(i).Layout.Column = i+2; 
             end            
        end
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            % Create Panel
            app.Panel = uipanel(app.UIFigure);
            app.Panel.Title = 'Panel';
            app.Panel.Position = [42 198 1026 464];

            % Create GridLayout
            app.GHIetPOA_grid = uigridlayout(app.Panel);
            app.GHIetPOA_grid.RowHeight = {'1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x'};

            %app.villes1 = uieditfield(app.GHIetPOA_grid, 'text', 'HorizontalAlignment', 'center', 'Editable', 'on');
            initVilles1(app);
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 1118 692];
            app.UIFigure.Name = 'UI Figure';

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = app1

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

Примечание. В следующий раз, когда вы зададите вопрос, постарайтесь опубликовать весь соответствующий код.

person Rotem    schedule 24.11.2019
comment
Вы правильно догадались, я использовал синтаксис: villes1 = zeros(1, 8); Большое спасибо! Теперь работает так, как я хотел :D - person abreaultg; 25.11.2019