WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Callback Funktion bei Aufruf von KeypressFcn sperren?

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.12.2014, 01:32     Titel: Callback Funktion bei Aufruf von KeypressFcn sperren?
  Antworten mit Zitat      
Hallo goMatlab Forum,

ich programmiere gerade eine GUI mit einer listbox. Die Listbox hat eine Callback funktion zur Steuerungen der Mouse-Gesten. Ebenso hat die Listbox eine KeypressFnc für key shortcuts.

Die Listbox zeigt den Inhalt eines Verzeichnisses an und mit einem Doppelclick lässt sich ein Verzeichnis in der Liste öffnen. Navigiere ich mit den Pfeiltasten auf ein Verzeichnis in der Liste, soll mit Enter ebenfalls das Verzeichnis geöffnet werden können. Das funktioniert soweit auch alles.

Allerdings habe ich ein Problem mit der KeypressFnc, da die Benutzung eines Keys auch gleichzeitig die Callback Funktion aufruft. Somit wird dann beim Öffnen über Enter erst das ausgewählte Verzeichnis geöffnet und wenn enthalten, gleich noch der 1. Eintrag in der neuen Liste (content des geöffneten Verzeichnisses).

Ich müsste also irgendwie steuern, dass nur eine der beiden Funktion, callback oder KeypressFnc aufgerufen wird.

Wie geht man bei so etwas vor?

Vielen Dank für euer Feedback!

Gruß,

DSP
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.12.2014, 14:11     Titel:
  Antworten mit Zitat      
Um mein Problem nochmal etwas besser zu verdeutlichen.

Mein listbox:

Code:

handles.navlist = uicontrol('Style','listbox',...
    'Position',[15 10 275 300],...
    'String','',...
   'Value',[],...
   'BackgroundColor','w',...
   'Callback',@clicknav,...
   'KeyPressFcn',@keypressnav,...
    'Enable','inactive',...
   'Max',2);
 


Die Callback Fcn:

Code:

%% Callback Fcn listbox - handle mouse click action
    function clicknav(varargin)      
        % get selected item in listbox
        value = get(handles.navlist,'Value');
        nval = length(value);
        dbl_click_fcn = @doNothing;

        switch nval            
            case 1
                if handles.dirContent(value).isdir
                    % user selected a folder
                    set([handles.Open handles.rmdir],'Enable','on');
                    dbl_click_fcn = @openDir;
                else
                    % user selected a file
                    set([handles.Open handles.rmdir],'Enable','off');
                end
            otherwise
                set([handles.Open handles.rmdir],'Enable','off');
        end

        if strcmp(handles.currentDir{end,1},'..') && strcmp(handles.dirContent(value).name,'..')
            % user selected '..' folder in root dir -> disable buttons
            set([handles.Open handles.rmdir],'Enable','off');
            dbl_click_fcn = @doNothing;
        end
       
        if strcmp(handles.dirContent(value).name,'..')
            % user selected '..' folder in sub dir -> disable button
            set(handles.rmdir,'Enable','off');
        end

        if strcmp(get(handles.fig,'SelectionType'),'open')
            % user made double-click
            dbl_click_fcn(); % <<<---
        end        
    end
 


Die KeypressFnc:

Code:

%% KeypressFcn listbox - handle key inputs for listbox
    function keypressnav(h,evt) %#ok<INUSL>        
        if strcmp(evt.Key,'backspace') && isequal(evt.Modifier,cell(1,0))
            % Backspace means go to parent folder.
            parentDir()
        elseif strcmp(evt.Key,'f') && isequal(evt.Modifier,'control')
            % Control-F means select all files.
            value = find(~[handlesdirContent.isdir]);
            set(handles.navlist,'Value',value)
        elseif strcmp(evt.Key,'return') && isequal(evt.Modifier,cell(1,0))
            % return key means open directory.
            openDir() % <<<---
        elseif strcmp(evt.Key,'delete') && isequal(evt.Modifier,cell(1,0))
            % delete means remove folder
            removedir()
        elseif strcmp(evt.Key,'n') && isequal(evt.Modifier,'control')
            % CTRL + N key means create new folder
            mkdir()    
        end        
    end
 



Setze ich nun jeweils einen Breakpoint in die mit Pfeil markierten Codezeilen, wird bei Enter Eingabe immer bei Clicknav angehalten. Dann steht oben im Fenster "Function Call Stack" von Matlab = GUI_FTP/Clicknav. Also hat wohl die Callback Fcn vorrang und 'SelectionType' = open trifft nicht nur bei einem Doppelklick sondern auch bei Enter zu. Wähle ich nun bei "Function Call Stack" -> GUI_FTP/Keypressnav funktioniert alles wie es soll.

Gibt es denn keine Möglichkeit die Priorität der Calls zu steuern? Oder irgendeine andere Lösung um den Doppelaufruf von openDir() zu verhindern?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.12.2014, 20:01     Titel:
  Antworten mit Zitat      
Niemand eine Idee wo man das lösen kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.