كيفية تحميل مجموعة كبيرة من السلاسل في MFC عنصر التحكم تحرير وسرد سريع ممكن ؟

StackOverflow https://stackoverflow.com/questions/229395

سؤال

لدي مجموعة من 1000 سلاسل التحميل في مربع التحرير والسرد.ما هي أسرع طريقة تحميل مجموعة من السلاسل في مربع التحرير والسرد?

هل هناك طريقة أخرى غير بالتكرار على قائمة السلاسل ، ووضع كل السلسلة في مربع التحرير والسرد في آن واحد ؟

وكيفية نسخ مربع التحرير والسرد البيانات مرة واحدة تحميلها إلى نحو 10 آخرين مربعات التحرير والسرد?

هل كانت مفيدة؟

المحلول

إذا كان لديك 1000 سلاسل متكررة في 10 comboboxes, قد ترغب في النظر في استخدام مالك رسمها تحرير وسرد التي توجه السلاسل على الطاير على أساس مؤشرات إلى الصفيف الخاص بك بدلا من تخزينها في مربع تحرير وسرد في كل شيء.طريقة أسرع طريقة أكثر كفاءة الذاكرة.تحقق من DrawItem طريقة DRAWITEMSTRUCT هيكل في مساعدة على الخط.أساسا كنت تفعل شيئا مثل استخدام InitStorage و InsertString (كما ذكر NuSonic) لإنشاء 1000 فارغة البنود في combobx, وتجاوز DrawItem لاستخراج واستخلاص المطلوبة سلسلة استنادا إلى مؤشر ، كما أنه يحتاج إلى الانتباه.

نصائح أخرى

أنا لست على علم بأي طريقة تحميل سلاسل متعددة الذرة, ولكن هناك بعض الأشياء التي يمكنك القيام به لجعل العملية أكثر كفاءة:

  • دعوة CComboBox::InitStorage قبل إضافة عناصر إلى ما قبل تخصيص الذاكرة
  • استخدام InsertString بدلا من AddString لمنع اثار نوعا على كل ذلك (على افتراض CBS_SORT الاسلوب هو تمكين)

وربما أسرع من CComboBox مع DrawItem سيكون مالك البيانات CListCtrl . وهذا من شأنه أيضا هدفك من تكرار مجموعة فرعية من العناصر في قوائم أخرى، منذ مصدر بيانات مشتركة يمكن أن تستخدم.

وأقترح هذا لأن CComboBox 1000 البند لن تكون صالحة للاستعمال للغاية.

وسوف تنظر في استخدام قائمة اختيار بدلا من مربع التحرير والسرد للأداء.

وهناك قاعدة عامة من الإبهام لتحسين الأداء عند إدخال العديد من العناصر في القائمة UI هو استدعاء قبل الإدراج وتحديد إعادته إلى true بعد.

إليك بناء الجملة الصحيح

#define NB_ITEM 1000
#define ITEM_LENGTH 10

void CMFCComboDlg::InitMyCombo()
{
    CString _strData;
    m_cbMyCombo.SetRedraw( FALSE );

    m_cbMyCombo.Clear();

    m_cbMyCombo.InitStorage(NB_ITEM, ITEM_LENGTH); 

    for( int i = 0; i < NB_ITEM; i++ )
    {
        _strData.Format( L"Test %ld", i );
        m_cbMyCombo.InsertString( i, _strData );
    }

    m_cbMyCombo.SetCurSel(0);

    m_cbMyCombo.SetRedraw( TRUE );
}

وتحرير: تحسين الحل لتشمل اقتراح smacl

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

وكبيرة جدا # البنود: قدم مربع التحرير والسرد يكون مجرد بسيط / المعاقين مع SetWindowText لوضع سلسلة الأولية، وزر صغير بجانبه فتح الحوار التي تمكنك من اختيار عنصر من عنصر تحكم قائمة في تقرير وضع البيانات التي من شأنها أن كنا في التحرير والسرد مربع (يمكن أن يكون أي شيء فعله في الحوار).

والمعتدلة # البنود: جعل العرف فئة مشتقة منسدل أن يتجاوز AddString، SelectString، ويتعامل مع OnDropDown. عند إضافة عناصر، فإنه يضع لهم في ناقلات مؤقت، ومن ثم على SelectString (يمكن أن تفعل SetCurSel تجاوز أيضا)، وتضيف عنصر واحد يجدها ويختار. عندما تعطل، ومن ثم إعادة تعيين منسدل، ويضيف كل البنود في ويختار المحدد حاليا واحدة. هناك تباطؤ طفيف على اسقاط منسدل، ولكن على كميات قليلة من العناصر لا يمكن ملاحظتها.

وجعلت لي الحوارات تحميل أسرع بكثير ويكون لا يزال تعمل بكامل طاقتها دون التعادل المالك.

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