2017-01-02 13 views
0

Ich habe einen Text in einer MATLAB GUI bearbeiten. Ich möchte, dass der Benutzer nur Zahlen schreiben kann und wann immer er ein Textzeichen schreibt, wird dieses letzte Zeichen sofort gelöscht. Darüber hinaus weiß ich nicht, in welcher Art von Funktion, diesen Code (Rückruf, Tastendruck, etc) zu setzen.Nur numerische in Bearbeitungstext MATLAB GUI

Vielen Dank!

Antwort

2

Dies ist unmöglich, ohne auf Java zurückgreifen zu müssen. Das liegt daran, dass MATLAB keinen Zugriff auf eine typisierte Zeichenfolge hat; Sie können nur auf die aktuelle Zeichenfolge zugreifen (d. h. nach Drücken von Geben Sie ein oder ändern Sie den Fokus).

Unten ist eine unvollständige Problemumgehung. Es verwendet zwei identische Eingabefelder übereinander, aber die oberste Box ist zunächst ausgeblendet. Die KeyPressFcn des sichtbaren Bearbeitungsfeld:

  1. filtert die Tastendrücke auf nur numerische
  2. ansammelt gültig Drücken von Tasten in einer Reihe mit globalen Speicher
  3. Sätze, dass String in der aktuellen Zeichenfolge des unsichtbaren Bearbeitungsfeld
  4. macht das unsichtbare Eingabefeld sichtbar, so dass es die eine verschliesst in Sie schreiben

Seine CallBack Funktion dann

  1. nimmt die Zeichenfolge der normalerweise unsichtbaren Box Sets
  2. die immer sichtbare Box‘string gleich diesen String
  3. Blendet die normalerweise unsichtbare Box wieder

Hier ist die Umsetzung (liberal entlehnt here):

function GUI_tst 

    % Create new GUI 
    G.fh = figure('menubar' , 'none',... 
        'units' , 'normalized', ... 
        'position', [.4 .4 .2 .2]); 

    % The actual edit box 
    G.eh1 = uicontrol('style'  , 'edit',... 
        'units'  , 'normalized', ... 
        'position' , [.1 .4 .8 .2],... 
        'string'  , '',... 
        'KeyPressFcn', @kpr,... 
        'Callback' , @cll); 

    % The "fake" edit box  
    G.eh2 = copyobj(G.eh1, G.fh); 
    set(G.eh2, 'Visible', 'off'); 

    % Its string (global)  
    G.eh_str = ''; 


    guidata(G.fh, G); 

end 


% "Real" edit box' KeyPressFcn() 
function kpr(~, evt) 

    if isempty(evt.Character) 
     return; end 

    G = guidata(gcbf); 

    % Occlude the "real" editbox with the "fake" one 
    set(G.eh2, 'visible', 'on'); 

    % Accumulate global string if keys are numeric 
    if strcmp(evt.Key,'backspace') 
     G.eh_str = G.eh_str(1:end-1); 

    elseif isempty(evt.Modifier) && ... 
      any(evt.Character == char((0:9)+'0')) 

     G.eh_str = [G.eh_str evt.Character];   
    end 

    % Set & save new string 
    set(G.eh2, 'string', G.eh_str); 
    guidata(gcbf,G); 

end 


% "Real" edit box' CallBack() 
function cll(~,~)  
    G = guidata(gcbf); 

    % Set the "real" box' string equal to the "fake" one's, 
    % and make the "fake" one invisible again 
    set(G.eh1, 'String', get(G.eh2, 'String')); 
    set(G.eh2, 'visible', 'off'); 
end 

Diese recht gut funktioniert, aber es hat einige Nachteile:

  • weil Sie tippen irgendwo kann man nicht sehen, wird der Cursor versteckt
  • Auswählen von Text und drücken Backspace/Löschen nicht
  • funktioniert es ist nicht sehr ressourceneffiziente

Obwohl Es ist möglich, Java zu verwenden (siehe von MATLAB-Gott Yair Altman), die einfachere und gebräuchlichere Methode ist es, einfach zu akzeptieren, dass der Benutzer ungültige Eingaben eingibt, und diese nur in der Callback Funktion überprüft/korrigiert (dh nach Drücken von Geben Sie ein).

+0

Vielen Dank – chsafouane

+0

@chsafouane Sie sind herzlich willkommen! –