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

KeyReleaseFcn

 

Bibre_de_Noele

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2010, 16:08     Titel: KeyReleaseFcn
  Antworten mit Zitat      
Hallo,

ich würde gerne für ein Textfeld eine KeyReleasefcn einbinden. Leider kriege ich das mithilfe des Inspectors nicht hin. Kann mir hier vll jemand eine Möglichkeit sagen, wie ich für ein beliebiges textfeld eine solche Funktion einbinden kann?

MfG
Bibre


Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2010, 16:27     Titel:
  Antworten mit Zitat      
Wenn ich dich richtig verstehe, suchen wir nach derselben Funktion...
...ich brauche sowas für eine Valedierung des Textfeldinhalts, während des Schreibens...habe aber noch nicht die optimale Lösung gefunden (wenn Du sie irgendwann kennst, sag mir Bescheid)...

Eine suboptimale Lösung ist das simple Nutzen der Callback funktion. Die löst nur aus, wenn sich etwas geändert hat (so lange man schnell schreibt oder gedrückt hält, sollte nichts passieren). Hört man aufzuschreiben, wird die Funktion ausgeführt...

Es kommt sicherlich drauf an, was Du insgesamt vor hast...
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.04.2010, 17:30     Titel:
  Antworten mit Zitat      
Hallo

Speziell für Textfelder gibt es keine KeyReleaseFcn,
aber dass kann man über WindowsKeyReleaseFcn nachbilden
Code:

function figure_key_release
fig     = figure();
handles.matedit1 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [20 320 100 20]);

 
handles.matedit2 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [140 320 100 20]);

handles.fig       = fig;  

guidata(fig,handles);

% Release Function setzen
set(handles.fig,'WindowKeyReleaseFcn', {@my_key_fcn,guidata(fig)})



% in der Funktion dann abfagen, welcher GUI-Object ist gerade ausgewählt
function my_key_fcn(hObject, eventdata, handles)

cur_obj = get(hObject,'CurrentObject');
 
if  cur_obj==handles.matedit1
   edit1_key_press(handles)  
end

if  cur_obj==handles.matedit2
   edit2_key_press(eventdata,handles)  
end


% Abfragen von Tastatur kann man über Fenster
function edit1_key_press(handles)
Key = get(handles.fig,'CurrentKey');
M   = get(handles.fig,'CurrentModifier');
Ch  = get(handles.fig,'CurrentCharacter');
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');    
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');      
   case '.'
      fprintf('Komma\n');  
   otherwise

end % switch

% oder eventdata, das  ist aber abhängig von version
function edit2_key_press(eventdata,handles)

Key = eventdata.Key;
M   = eventdata.Modifier;
Ch  = eventdata.Character;
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
   case '.'
      fprintf('Komma\n');
   otherwise
     
end % switch
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2010, 07:51     Titel:
  Antworten mit Zitat      
Hi denny,

das schaut ja wirklich gut aus...aber es funktioniert anscheinend nicht mit der R2006b (die kennt meines Wissens WindowKeyReleaseFcn gar nicht)...

Was muss ich ändern damit es damit funktionieren kann? Geht es überhaupt?

Danke Dir!

============================================
EDIT: Habs jetzt raus: Ich nutze gleich die KeyPressFcn der Editbox!

Endlich funktionierts...werde jetzt mal versuchen die Validierungsfunktion zu schreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2010, 10:07     Titel:
  Antworten mit Zitat      
Es funktioniert mit der KeyPressFcn ganz gut, nur gibt es ein Problem...
woher kann ich den aktuellen Inhalt des Feldes bekommen?

'String' ist solange leer bis ich aus der Editbox rausklicke...gerade wenn irgendwer auf die Idee kommt mit den Pfeiltasten zu arbeiten und dann auch noch Entf zu drücken brauche ich das ganze...oder hat da jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.04.2010, 10:34     Titel:
  Antworten mit Zitat      
Hallo Zenon,

habe den Code unter 2009b gemacht. Habe jetzt unter 2007b ausprobiert, dort gibt es auch noch keine WindowsKeyReleaseFcn.

Also dann muss du es irgend wie über Java lösen, aber das mit einer gewissen Komplexität und einem gewissen Risiko verbunden.
Ich bin aber auf diesem Gebiet noch blutiger Anfänger.



1) Ein java handle deines Texteditors holen:

Code:

function figure_key_release3
fig     = figure();
handles.matedit1 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [20 320 100 20]);

 
handles.matedit2 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [140 320 100 20]);

handles.fig       = fig;  

handles.javaedit  = findjobj(fig,'class','edit');


guidata(fig,handles);

set(handles.javaedit(2),'KeyReleasedCallback', {@edit1_key_release,guidata(fig)})
set(handles.javaedit(1),'KeyReleasedCallback', {@edit2_key_release,guidata(fig)})


function edit1_key_release(hObject, eventdata, handles)
Key = eventdata.getKeyCode;
Ch  = eventdata.getKeyChar;
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
   case '.'
      fprintf('Komma\n');
   otherwise
     
end % switch


function edit2_key_release(hObject, eventdata, handles)

Key = eventdata.getKeyCode;
Ch  = eventdata.getKeyChar;
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
   case '.'
      fprintf('Komma\n');
   otherwise
     
end % switch
 



2) oder gleich java text felder verwenden:


Code:

function figure_key_release2
import javax.swing.*
fig     = figure();
handles.javaedit1  = JTextField('');
[handles.javaedit1,ec] = javacomponent(handles.javaedit1,[20 320 100 20],fig);

handles.javaedit2     = JTextField('');
[handles.javaedit2,ec2] = javacomponent(handles.javaedit2,[140 320 100 20],fig);

handles.fig       = fig;  

guidata(fig,handles);

set(handles.javaedit1,'KeyReleasedCallback', {@edit1_key_release,guidata(fig)})
set(handles.javaedit2,'KeyReleasedCallback', {@edit2_key_release,guidata(fig)})



function edit1_key_release(hObject, eventdata, handles)
Key = eventdata.getKeyCode;
Ch  = eventdata.getKeyChar;
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
   case '.'
      fprintf('Komma\n');
   otherwise
     
end % switch


function edit2_key_release(hObject, eventdata, handles)

Key = eventdata.getKeyCode;
Ch  = eventdata.getKeyChar;
switch Ch
   case '['
      fprintf('Klammer auf\n');
   case ']'
      fprintf('Klammer zu\n');
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
   case '.'
      fprintf('Komma\n');
   otherwise
     
end % switch
 



PS: schaue dir auch diesen Blog von Yair Altman an. http://undocumentedmatlab.com/

EDIT: @Zenon
Was du vor hast , kannst du auch über KeyPressFcn nicht lösen.
Habe schon letzte Woche probiert, das kann man nur über Java lösen.
Du brauchst komplett eigenen Java Text Feld

hier was ich letzte Woche probiert habe, bekomme aber immer noch Null Point Exception:

Apropos für beide Felder habe ich unterschiedliche Wege probiert:
bei 2 Variante habe ich immer das Problem mit Cursor


Code:

function figure_keypress
fig     = figure();
handles.matedit1 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [20 320 100 20]);

%warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');    
 
handles.matedit2 = uicontrol(fig,'Style', 'edit',...
       'String', '',...
       'Position', [140 320 100 20]);

handles.fig       = fig;    
handles.javaedit1 = findjobj(handles.matedit1);
handles.javaedit2 = findjobj(handles.matedit2);

guidata(fig,handles);


set(handles.matedit1,'KeyPressFcn', {@my_key_fcn1,guidata(fig)})
set(handles.matedit2,'KeyPressFcn', {@my_key_fcn2,guidata(fig)})






function my_key_fcn1(hObject, eventdata, handles)
Key = get(handles.fig,'currentkey');
M   = get(handles.fig,'currentmodifier');
Ch  = get(handles.fig,'currentcharacter');
handles.javaedit1.Caret.setDot(0);
switch Ch
   case '['
      fprintf('Klammer auf\n');

      handles.javaedit1.setText(handles.javaedit1.getText());
      handles.javaedit1.Caret.setDot(handles.javaedit1.getText().length());
   case ']'
      fprintf('Klammer zu\n');
     
      handles.javaedit1.setText(handles.javaedit1.getText());
      handles.javaedit1.Caret.setDot(handles.javaedit1.getText().length());
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
     
      handles.javaedit1.setText(handles.javaedit1.getText());
      handles.javaedit1.Caret.setDot(handles.javaedit1.getText().length());
   case '.'
      fprintf('Komma\n');
     
      handles.javaedit1.setText(handles.javaedit1.getText());
      handles.javaedit1.Caret.setDot(handles.javaedit1.getText().length());
   otherwise
      if ~isempty(Ch) && ~strcmpi(Key,'backspace')
         str_j = handles.javaedit1.getText();
         str_j = char(str_j);
         str_j = java.lang.String(str_j(1:end-1));
         handles.javaedit1.setText(str_j);
         handles.javaedit1.Caret.setDot(0);
         handles.javaedit1.Caret.setDot(str_j.length());
      end
end % switch


function my_key_fcn2(hObject, eventdata, handles)
Key = eventdata.Key;
M   = eventdata.Modifier;
Ch  = eventdata.Character;
switch Ch
   case '['
      fprintf('Klammer auf\n');
       str = get(handles.matedit2,'String')
       set(handles.matedit2,'String',[str,Ch]);
   case ']'
      fprintf('Klammer zu\n');
       str = get(handles.matedit2,'String')
       set(handles.matedit2,'String',[str,Ch]);
   case {'0','1','2','3','4','5','6','7','8','9'}
      fprintf('Zahl\n');
       str = get(handles.matedit2,'String')
       set(handles.matedit2,'String',[str,Ch]);
   case '.'
      fprintf('Komma\n');
       str = get(handles.matedit2,'String')
       set(handles.matedit2,'String',[str,Ch]);
   otherwise
      if ~isempty(Ch) && ~strcmpi(Key,'backspace')
         Ch = '';
         %set(handles.fig,'CurrentCharacter',Ch);
         str = get(handles.matedit2,'String')
         set(handles.matedit2,'String',[str,Ch]);
      end
end % switch
 
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 - 2025 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.