2010-12-05 71 views
5

que tienen esta línea de código:¿Cómo crear devoluciones de llamada dinámicas en MATLAB?

delete_btn = uicontrol(rr_ops, 'Style', 'pushbutton', 'String', 'Delete Graphic', 'Position', [13 135 98 20], ... 
'Callback', 'delete_graphic'); 

y un poco superior a esta función:

function delete_graphic 
global rr_list 
selected = get(rr_list, 'Value'); 
selected 
return; 

por qué este código no está funcionando? Realmente no entiendo ...

¿Qué necesito? Creo un botón y un cuadro de lista, haciendo clic en el botón - eliminar el elemento seleccionado de un cuadro de lista.

Thx para obtener ayuda.

PS siempre recibiendo este error:

??? Undefined function or variable 'delete_graphic'. 
??? Error while evaluating uicontrol Callback 

aquí es todo mi código: http://paste.ubuntu.com/540094/ (línea 185)

Respuesta

10

La forma generalmente preferida para define a callback function es utilizar un function handle lugar de una cadena. Cuando utiliza una cadena, el código en la cadena se evalúa en el área de trabajo base. Esto significa que todas las variables y funciones utilizadas en la cadena deben existir en el espacio de trabajo base cuando se evalúa la devolución de llamada. Esto hace que el diseño de la GUI sea deficiente, ya que realmente no desea que la operación de su GUI dependa del espacio de trabajo base (que el usuario puede modificar fácilmente, lo que puede romper su GUI).

Esto también explica el error que está recibiendo. La función delete_graphic se define como subfunction en su archivo rr_intervals.m. Las subfunciones solo pueden ser llamadas por otras funciones definidas en el mismo archivo m, por lo que delete_graphic no está visible en el espacio de trabajo base (donde se evalúa la devolución de llamada de cadena). El uso de una devolución de llamada con función de manejo es una mejor alternativa. He aquí cómo lo haría:

  • Cambiar la devolución de llamada de su botón (línea 216) 'delete_graphic'-@delete_graphic.
  • Cambiar la definición de función de delete_graphic (línea 185) a:

    function delete_graphic(hObject,eventdata) 
    

    donde hObject es el identificador del objeto de emitir la devolución de llamada y eventdata es datos opcionales proporcionan cuando se emite la devolución de llamada.

EDIT:

Si desea pasar otros argumentos para delete_graphic, puede realizar los pasos siguientes:

  • Añadir los argumentos de entrada adicionales al final de la función definición. Por ejemplo:

    function delete_graphic(hObject,eventdata,argA,argB) 
    
  • utiliza una matriz de células cuando se establece la devolución de llamada para su botón, donde la primera celda contiene el identificador de función y las células posteriores cada una contiene un argumento de entrada.Por ejemplo:

    set(delete_btn,'Callback',{@delete_graphic,A,B}); 
    

    Hay una advertencia a esto, y es que los valores A y B almacenados en la matriz celular son fija en lo que son cuando se establece la devolución de llamada. Si cambia A o B en su código, no cambiará los valores almacenados en la devolución de llamada de la matriz de celdas.

Si usted no es capaz de utilizar la solución anterior (es decir, si A y B necesidad de cambiar el valor), hay algunas otras opciones para que pueda share data among a GUI's callbacks:

  • Puede reelabore la organización de su código para hacer uso de nested functions. Esto hace que sea muy fácil de compartir datos entre devoluciones de llamadas. Algunos buenos ejemplos del uso de funciones anidadas para crear GUI se pueden encontrar en el envío MathWorks File ExchangeGUI Examples using Nested Functions por Steven Lord.
  • Puede almacenar datos en el UserData property de un objeto uicontrol. Para acceder o actualizarlo, solo necesita el control del objeto.
  • Puede usar las funciones SETAPPDATA/GETAPPDATA para adjuntar datos a un objeto gráfico de control (es decir, uicontrol).
  • Como parece que su código fue creado usando GUIDE, puede hacer uso de la estructura handles que GUIDE crea para almacenar datos usando la función GUIDATA.
+0

gracias. funcionó, pero ¿cómo puedo pasar otros parámetros a la función delete_graphic? – AndrewShmig

+0

@Andrew: Agregué más detalles a mi respuesta explicando cómo puede pasar otros argumentos a su función. – gnovice

Cuestiones relacionadas