6

Estoy construyendo una GUI sencilla de MATLAB utilizando GUÍA. Tengo una lista de elementos. La mayor parte del tiempo, funciona como se espera, pero a veces (por lo general después edito la figura con GUIDE) poblar el cuadro de lista provoca que desaparezca, junto con este mensaje:GUÍA DE MATLAB cuadro de diálogo GUI desaparece intermitentemente con error aparentemente obsoleto

Warning: single-selection listbox control requires a scalar Value 
Control will not be rendered until all of its parameter values are valid 

Este comportamiento desafía depuración! Cuando paso, funciona como se esperaba (sospecho que es una especie de carrera de subprocesos o algo así). Además, generalmente desaparece después de reiniciar el entorno MATLAB, en condiciones idénticas.

Toda la documentación encontrada en este error hace referencia a versiones anteriores/antiguas de MATLAB (estoy usando R2010a).

¡Cualquier idea o información sobre este tema sería muy apreciada!


EDIT: gracias a Mikhail, parece que he resuelto el problema. Estoy publicando mi código aquí para referencia futura.

Después de mucha impresión de depuración y clics desenfrenados, encontré que a veces cuando se le pregunta a la lista de selección qué es lo que se selecciona, se obtiene un resultado vacío. Este y otros problemas hicieron que las cosas se descontrolaran. Trasladé todas mis interacciones de escritura al cuadro de lista en una función centralizada, y escribí un código de prueba para asegurarme de que las cosas se mantengan como deberían.

Tenga en cuenta que esto ha sido probado en mi propio entorno (en R2010a) y no exhaustivamente. Además, el código es un poco redundante, pero de todos modos me hizo sentir bien. (Es decir. itemcount no puede ser inferior a 0 ...)

function ensure_listbox_ok(handles) 

%check to make sure it does not suck - ask what it has 
thestrings = get(handles.listbox_files, 'String'); 
selection = get(handles.listbox_files, 'Value'); 

itemcount = length(thestrings); 

betterselection = selection; 

if(itemcount <= 0) 
    betterselection = 1; 
else 
    if(selection > itemcount) 
     betterselection = itemcount; 
    end 
end 

%never use zero!!!! even if 1 is out of bounds. 
if(isempty(betterselection) || betterselection <= 0) 
    betterselection = 1; 
end 

%uncomment for debug logging 
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]); 

%update if we are out of bounds. 
if(isempty(selection) || betterselection ~= selection) 
    set(handles.listbox_files, 'Value', betterselection); 
end 

Respuesta

2

Ésta es una programación error conocido y no tiene nada que ver con la condición de carrera!

Esta es la forma en que debería funcionar:

Para emergente y de selección única lista string propiedad debe ser no-vacío, es decir, tener algo de contenido. Pero está vacío por defecto, por lo tanto, siempre debe definirse.

En emergente que aparece (en la Lista de resaltado) elemento está definido por dos propiedades string (como matriz de células de cadenas) y value (que es 1 por defecto).

Tomar el primer elemento en una matriz vacía, obviamente, no funciona, por lo tanto, el control no se puede representar!

El control Listbox tiene una sola selección: sus propiedades min < max y value son escalares y> 0. Listbox (pero no Popup) puede ser multiselección si la propiedad min>max, en este caso value puede ser una matriz (que implica también vacía) y vacía string no causará problemas.

facilitar la lectura de MATLAB para las propiedades uicontrol string, value, min, max, listboxtop

En la praxis

  • Usted dice que se manifiesta después de editar con un GUÍA. GUIDE crea código subyacente. Después de editar código antiguo atrás algunas veces permanece en su lugar.
  • veces MATLAB es sensible al orden dentro de una declaración, es decir, conjuntos set(hlist, 'value', 2, 'string', {'aa','bb'}) ingenuamente value a 2 antes string es lo suficientemente larga e invalida uicontrol.
  • MATLAB tiene errores, cada nueva versión dos veces al año quita viejos y trae nuevos errores. Si está seguro de que el modo de depuración no funciona como debería, entonces es un caso para el soporte de MATLAB. Tengo el mismo código ejecutándose como m-code, p-code y exe compilado; el mismo código se comporta de manera diferente, principalmente en la forma en que funciona la GUI.
+0

Hola Mikhail, ¡gracias por responder! Todavía me gustaría obtener más información. Usted dice que listbox está vacío por defecto, pero NO debe estar vacío ... ¿cómo funciona eso? ¿Cómo es que funciona a veces, pero no todo el tiempo? ¿Cómo es que no puedo solucionar este error? Estoy bastante seguro de seguir todas las pautas para este uicontrol, y sin embargo, A veces se bloquea en mí, en condiciones idénticas. ¡Gracias por ayudar! – eli

+0

Gracias por los excelentes consejos. Obviamente tienes mucha experiencia con este tipo de cosas. Me apuntaste en la dirección correcta, y ahora hago una lista de cosas mucho más cuidadosa. Estoy publicando otra respuesta con mi código, pero obtienes el premio =) – eli

2

En mi experiencia, este error ocurre más a menudo cuando la propiedad value es más grande que el número de entradas en el cuadro de lista. Por lo tanto, cada vez que vuelva a llenar el cuadro de lista, debe actualizar la propiedad value; establézcalo en 1 por razones de seguridad.

Aparte de eso, verifique los excelentes comentarios por @Mikhail.

Cuestiones relacionadas