Verfasst am: 06.12.2014, 01:32
Titel: Callback Funktion bei Aufruf von KeypressFcn sperren?
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.
%% 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
case1 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
ifstrcmp(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
ifstrcmp(handles.dirContent(value).name,'..') % user selected '..' folder in sub dir -> disable button set(handles.rmdir,'Enable','off');
end
ifstrcmp(get(handles.fig,'SelectionType'),'open') % user made double-click
dbl_click_fcn(); % <<<--- end end
%% KeypressFcn listbox - handle key inputs for listbox function keypressnav(h,evt) %#ok<INUSL>
ifstrcmp(evt.Key,'backspace') && isequal(evt.Modifier,cell(1,0)) % Backspace means go to parent folder.
parentDir() elseifstrcmp(evt.Key,'f') && isequal(evt.Modifier,'control') % Control-F means select all files.
value = find(~[handlesdirContent.isdir]);
set(handles.navlist,'Value',value) elseifstrcmp(evt.Key,'return') && isequal(evt.Modifier,cell(1,0)) % return key means open directory.
openDir()% <<<--- elseifstrcmp(evt.Key,'delete') && isequal(evt.Modifier,cell(1,0)) % delete means remove folder
removedir() elseifstrcmp(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?
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
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.