elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  [MATLAB] Problema con errodlg y buttondownfcn
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [MATLAB] Problema con errodlg y buttondownfcn  (Leído 1,779 veces)
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
[MATLAB] Problema con errodlg y buttondownfcn
« en: 3 Diciembre 2015, 20:10 pm »

Trabajando en Matlab R2010a.

Tengo el siguiente problema. Tengo una interfaz gráfica con varios componentes. Entre ellos tengo un edit y un axes.

Lo que estoy tratando de hacer es controlar que lo único que se escriba en el edit sean números. Lo hago con una función y funciona bien. Una vez que el edit pierde el foco o se presiona ENTER si el dato entrado es un numero se realiza una función y sino se muestra un msgbox (modal).

Ahora, quiero aclarar que tengo una función llamada mousedraw, que se encarga de permitir al usuario dibujar con el mouse en el axes. Utilizando los eventos: buttondownfcn, windowbuttonmotionfcn y windowbuttonupfcn.

Aquí el código:

Código
  1. function mousedraw(handles)
  2.  
  3. A=handles.axesToDrawOn; % axesToDrawOn es el handle al axes
  4.  
  5.  
  6.  
  7. set(A,'buttondownfcn',{@start_pencil, handles})
  8.  
  9.  
  10.  
  11. function start_pencil(src,eventdata, handles)
  12.  
  13. cla(handles.axesToDrawOn);
  14.  
  15. coords=get(src,'currentpoint'); %scomo este es el callback del axes, src=gca
  16.  
  17. x=coords(1,1,1);
  18.  
  19. y=coords(1,2,1);
  20.  
  21.  
  22.  
  23. global lineCoords;
  24.  
  25. newPoint = [coords(1,1,1) coords(1,2,1)];
  26.  
  27. lineCoords = newPoint;
  28.  
  29.  
  30.  
  31. r=line(x, y, 'color', [0 .5 1], 'LineWidth', 2, 'hittest', 'off'); %Poniendo hittset off nos permite dibujar una linea que comience encima de una linea que ya este dibujada
  32.  
  33.  
  34.  
  35. set(gcf,'windowbuttonmotionfcn',{@continue_pencil,r})
  36.  
  37. set(gcf,'windowbuttonupfcn',@done_pencil)
  38.  
  39.  
  40.  
  41. function continue_pencil(src,eventdata,r)
  42.  
  43. %src es ahora el handle del figure, y no del axes, por lo tanto necesitamos usar gca.
  44.  
  45. coords=get(gca,'currentpoint'); %esto actualiza cada vez que mueva el mouse
  46.  
  47. x=coords(1,1,1);
  48.  
  49. y=coords(1,2,1);
  50.  
  51.  
  52.  
  53. global lineCoords;
  54.  
  55.  
  56.  
  57. newPoint = [coords(1,1,1) coords(1,2,1)];
  58.  
  59. D = [lineCoords; newPoint];
  60.  
  61. lineCoords = D;
  62.  
  63.  
  64.  
  65. %obtener las coordenadas de la linea existente y agregarle las nuevas
  66.  
  67. lastx=get(r,'xdata');
  68.  
  69. lasty=get(r,'ydata');
  70.  
  71. newx=[lastx x];
  72.  
  73. newy=[lasty y];
  74.  
  75. set(r,'xdata',newx,'ydata',newy);
  76.  
  77.  
  78.  
  79. function done_pencil(src,evendata)
  80.  
  81.  
  82.  
  83. %Desactiva la función e movimiento
  84.  
  85. global lineCoords
  86.  
  87. set(gcf,'windowbuttonmotionfcn','')
  88.  
  89. set(gcf,'windowbuttonupfcn','')

Mi problema es que si la manera en que el edit perdió el foco es haciendo un click sobre el axes, como que se queda colgado el evento buttondownfcn, pues se reconoce que lo entrado no es válido (osea, no es un número), se muestra el errordlg, pero al hacer click en aceptar, pues como que se ejecuto el evento y se comenzó a dibujar desde que se hizo click en el axes para hacer al edit perder el foco, y entonces esta dibujando con el mouse levantado, sin hacer click.

Espero que me haya explicado bien, sino que alguien me diga y explico mejor.

Gracias de antemano.

PD: El callback del edit es el siguiente:

Código
  1. function xMinEdit_Callback(hObject, eventdata, handles)
  2.  
  3. Val=get(hObject,'String');
  4.  
  5.  
  6.  
  7. if(isnan(IsNumber(Val)))
  8.  
  9.    set(hObject, 'String', handles.xMin);
  10.  
  11. else
  12.  
  13.    NewVal=str2num(Val);
  14.  
  15.    handles.xMin=NewVal;
  16.  
  17.  
  18.  
  19.    axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);
  20.  
  21. end
  22.  
  23. guidata(hObject, handles);
  24.  
  25.  
  26.  
  27. function [varargout] = IsNumber( x )
  28.  
  29. num=str2num(x);
  30.  
  31.  
  32.  
  33. if (isempty(num)==0)
  34.  
  35.    varargout{1}=num;
  36.  
  37. else
  38.  
  39.    varargout{1} = NaN;
  40.  
  41.    errordlg('Debes insertar un numero', 'Error de entrada', 'modal');
  42.  
  43. end
  44. end

Salu2s


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Matlab
Programación General
Gm3z 0 2,387 Último mensaje 26 Noviembre 2012, 18:33 pm
por Gm3z
Problema con instalación de matlab.
Mac OS X
kondrag_X1 1 5,238 Último mensaje 27 Mayo 2014, 23:12 pm
por kondrag_X1
Problema para instalar matlab
GNU/Linux
Fox_Neo 4 4,192 Último mensaje 9 Mayo 2014, 15:26 pm
por Gh057
PRoblema con ejercicio en Matlab
Programación General
Baphomet2204 2 2,576 Último mensaje 16 Octubre 2019, 17:24 pm
por Baphomet2204
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines