Обмен значениями свойств между объектами - PullRequest
1 голос
/ 15 июля 2011

Я создал два текстовых поля с помощью аннотации (.) На рисунке.Большинство их свойств были определены;и функция обратного вызова позволяет перетаскивать движение в окне.Я создал uicontextmenu для коробок.При щелчке правой кнопкой мыши список функций можно выбрать для последующих действий.

Одно из действий, которые я пытаюсь добавить, включает в себя перестановку строк между двумя полями.Мне нужно получить строку поля, в котором я в данный момент щелкнул правой кнопкой мыши, который должен поменяться со строкой в ​​поле, которое я впоследствии щелкнул левой кнопкой мыши.Могу ли я получить совет о том, как расширить функцию uimenu, чтобы она регистрировала последующий щелчок левой кнопкой мыши?

1 Ответ

1 голос
/ 15 июля 2011

Вам нужно будет вручную сохранить последнее нажатое поле. Если вы используете GUIDE для разработки GUI, используйте структуру handles, которая передается функциям обратного вызова. В противном случае, если вы программно сгенерируете компоненты, тогда вложенные функции обратного вызова получат доступ к переменным, определенным внутри их вмещающих функций.

EDIT

Вот полный пример: щелкните правой кнопкой мыши и выберите «Поменять» в контекстном меню, затем выберите другое текстовое поле для обмена строками (щелкните левой кнопкой мыши). Обратите внимание, что я должен был отключить / включить текстовые поля между двумя шагами, чтобы иметь возможность запустить ButtonDownFcn (см. Объяснение на этой странице )

function myTestGUI
    %# create GUI
    hLastBox = [];          %# handle to textbox initiating swap
    isFirstTime = true;     %# show message box only once
    h(1) = uicontrol('style','edit', 'string','1', 'position',[100 200 60 20]);
    h(2) = uicontrol('style','edit', 'string','2', 'position',[400 200 60 20]);
    h(3) = uicontrol('style','edit', 'string','3', 'position',[250 300 60 20]);
    h(4) = uicontrol('style','edit', 'string','4', 'position',[250 100 60 20]);

    %# create context menu and attach to textboxes
    hCMenu = uicontextmenu;
    uimenu(hCMenu, 'Label','Swap String...', 'Callback', @swapBeginCallback);
    set(h, 'uicontextmenu',hCMenu)

    function swapBeginCallback(hObj,ev)
        %# save the handle of the textbox we right clicked on
        hLastBox = gco;

        %# we must disable textboxes to be able to fire the ButtonDownFcn
        set(h, 'ButtonDownFcn',@swapEndCallback)
        set(h, 'Enable','off')

        %# show instruction to user
        if isFirstTime
            isFirstTime = false;
            msgbox('Now select textbox you want to switch string with');
        end
    end
    function swapEndCallback(hObj,ev)
        %# re-enable textboxes, and reset ButtonDownFcn handler
        set(h, 'Enable','on')
        set(h, 'ButtonDownFcn',[])

        %# swap strings
        str = get(gcbo,'String');
        set(gcbo, 'String',get(hLastBox,'String'))
        set(hLastBox, 'String',str)
    end
end

screenshot

...