سؤال

أقوم ببناء دليل MATLAB المباشر باستخدام دليل. لدي قائمة من العناصر. في معظم الأوقات ، يعمل كما هو متوقع ، ولكن في بعض الأحيان (عادة بعد تحرير الشكل مع دليل) ، يؤدي ملء صندوق القائمة إلى اختفائه ، إلى جانب هذه الرسالة:

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

هذا السلوك يتحدى تصحيح الأخطاء! عندما أتجول ، يعمل كما هو متوقع (أظن أنه نوع من سباق الخيوط أو شيء من هذا القبيل). علاوة على ذلك ، عادة ما يختفي بعد إعادة تشغيل بيئة MATLAB ، في ظل ظروف مماثلة.

تشير جميع الوثائق الموجودة في هذا الخطأ إلى الإصدارات السابقة/القديمة من MATLAB (أنا أستخدم R2010A).

أي أفكار أو معلومات حول هذا الموضوع سيكون موضع تقدير كبير!


تحرير: بفضل ميخائيل ، يبدو أنني حللت المشكلة. أقوم بنشر الكود الخاص بي هنا للرجوع إليه في المستقبل.

بعد الكثير من طباعة التصحيح والنقر فوق البرية ، وجدت أنه في بعض الأحيان عندما تسأل Listbox ما هو محدد ، ستحصل على نتيجة فارغة. هذه المشاكل وغيرها من المشاكل جعلت الأمور تسير على الأسرار. لقد نقلت جميع تفاعلات الكتابة الخاصة بي إلى صندوق القائمة إلى وظيفة مركزية ، وكتبت بعض رمز الاختبار لضمان بقاء الأمور بالطريقة التي ينبغي.

يرجى ملاحظة أنه تم اختبار هذا في بيئتي الخاصة (على R2010A) وليس على نطاق واسع. أيضا ، الكود زائد بعض الشيء ، لكنه جعلني أشعر أنني بحالة جيدة على أي حال. (بمعنى آخر. itemcount لا يمكن أن يكون أقل من 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
هل كانت مفيدة؟

المحلول

هذا هو برمجة معروفة ولا علاقة له بحالة العرق!

هذه هي الطريقة التي يجب أن تعمل بها:

لقائمة المنبثقة والرقص الفردي string يجب أن تكون العقار غير فارغ ، أي أن لديك بعض المحتوى. لكنه فارغ بشكل افتراضي لذلك يجب أن يتم تعريفه دائمًا.

في المنبثقة المعروضة (في القائمة المميزة) ، يتم تعريف العنصر بواسطة خصائصين string (كصفيف الخلايا من السلاسل) و value (الذي 1 بشكل افتراضي).

من الواضح أن أخذ العنصر الأول في صفيف فارغ لا يعمل ، وبالتالي لا يمكن تقديم التحكم!

التحكم في صندوق القائمة الخاص بك هو اختيار واحد - خصائصه min < max و value هو القياسي و> 0. يمكن أن يكون Listbox (ولكن ليس منبثقًا) متعدد الاختيار إذا كان الخاصية min > max, ، في هذه الحالة value يمكن أن تكون صفيفًا (مما يعني أيضًا فارغًا) وفارغًا string لن يسبب مشاكل.

اقرأ Matlab Help for Uicontrol Properties string, value, min, max, listboxtop

في براكسيس

  • أنت تقول أنها تتجلى بعد التحرير مع دليل. دليل إنشاء رمز behind. بعد تحرير الكود القديم يبقى في بعض الأحيان في مكانه.
  • في بعض الأحيان يكون Matlab حساسًا للطلب داخل بيان واحد ، أي set(hlist, 'value', 2, 'string', {'aa','bb'}) مجموعات بسذاجة value إلى 2 قبل string طويل بما فيه الكفاية ويبطل uicontrol.
  • MATLAB هو عربات التي تجرها الدواب ، كل إصدار جديد مرتين في السنة يزيل القديم ويجلب الأخطاء الجديدة. إذا كنت متأكدًا من أن وضع تصحيح الأخطاء يعمل ليس كما ينبغي ، فهو حالة لدعم MATLAB. لدي نفس الرمز الذي يعمل كـ m-code و p-code و exe المترجمة-نفس الرمز يتصرف بشكل مختلف ، وخاصة في كيفية عمل واجهة المستخدم الرسومية.

نصائح أخرى

في تجربتي ، يحدث هذا الخطأ في أغلب الأحيان عندما يكون value الخاصية أكبر من عدد الإدخالات في صندوق القائمة. وبالتالي ، كلما قمت بإعادة تخصيص مربع القائمة ، يجب عليك تحديث value الممتلكات - اضبطها على 1 لأسباب تتعلق بالسلامة.

بخلاف ذلك ، تحقق من التعليقات الممتازة mikhail.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top