يعرض كل من TListBox و TComboBox من Delphi قائمة بالعناصر - سلاسل في قائمة "قابلة للتحديد". يعرض TListBox قائمة قابلة للتمرير ، ويعرض TComboBox قائمة منسدلة.
خاصية مشتركة لجميع الضوابط أعلاه هي العناصر خاصية. تحدد العناصر قائمة السلاسل التي ستظهر في عنصر التحكم للمستخدم. في وقت التصميم ، عند النقر المزدوج فوق خاصية العناصر ، يتيح لك "محرر قائمة السلاسل" تحديد عناصر السلسلة. خاصية العناصر هي في الواقع سلالة نوع TStrings.
سلسلتين لكل عنصر في ListBox؟
هناك حالات عندما تريد عرض قائمة السلاسل للمستخدم ، على سبيل المثال في عنصر تحكم مربع القائمة ، ولكن لديك أيضًا طريقة قم بتخزين سلسلة إضافية واحدة على طول السلسلة المعروضة للمستخدم.
ما هو أكثر من ذلك ، قد ترغب في تخزين / إرفاق أكثر من مجرد سلسلة "عادي" إلى السلسلة ، قد ترغب في ذلك إرفاق كائن بالعنصر (سلسلة).
ListBox. العناصر - TStrings كائنات "يعرف"!
امنح كائن TStrings نظرة أخرى في نظام التعليمات. هناك شاء الخاصية التي تمثل مجموعة من الكائنات المرتبطة بكل من سلاسل في خاصية السلاسل - حيث تشير خاصية السلاسل إلى السلاسل الفعلية في القائمة.
إذا كنت تريد تعيين سلسلة ثانية (أو كائن) لكل سلسلة في مربع القائمة ، فأنت بحاجة إلى ملء خاصية العناصر في وقت التشغيل.
بينما يمكنك استخدام ListBox. العناصر. أضف طريقة لإضافة سلاسل إلى القائمة ، لربط كائن بكل سلسلة ، ستحتاج إلى استخدام نهج آخر.
ال ListBox. العناصر. AddObject تقبل الطريقة معلمتين. المعلمة الأولى ، "العنصر" هي نص العنصر. المعلمة الثانية ، "AObject" هي الكائن المرتبط بالعنصر.
لاحظ أن مربع القائمة يكشف اضافة عنصر الطريقة التي تفعل نفس العناصر. AddObject.
سلسلتان لسلسلة واحدة
منذ كلا البندين. يقبل كل من AddObject و AddItem متغيرًا من نوع TObject لمعلمتهم الثانية ، وهو سطر مثل:
//تجميع خطأ!
ListBox1.Items. AddObject ('zarko'، 'gajic')؛
سيؤدي إلى خطأ في الترجمة: E2010 الأنواع غير المتوافقة: "TObject" و "سلسلة".
لا يمكنك ببساطة توفير سلسلة للكائن لأن قيم سلسلة Win32 في دلفي ليست كائنات.
لتعيين سلسلة ثانية إلى عنصر مربع القائمة ، تحتاج إلى "تحويل" متغير سلسلة إلى كائن - تحتاج إلى كائن TString مخصص.
عدد صحيح لسلسلة
إذا كانت القيمة الثانية التي تحتاج إلى تخزينها مع عنصر السلسلة هي قيمة صحيحة ، فأنت في الواقع لا تحتاج إلى فئة TInteger مخصصة.
ListBox1.AddItem ('Zarko Gajic'، TObject (1973)) ؛
يخزن الخط أعلاه الرقم الصحيح "1973" مع سلسلة "Zarko Gajic" المضافة.
يتم إجراء تلبيس مباشر من عدد صحيح إلى كائن أعلاه. إن المعلمة "AObject" هي في الواقع مؤشر (عنوان) 4 بايت للكائن المضاف. نظرًا لأن العدد الصحيح في Win32 يشغل 4 بايتات - من الممكن استخدام مثل هذا الصب الصلب.
لاستعادة العدد الصحيح المرتبط بالسلسلة ، تحتاج إلى إعادة "الكائن" إلى قيمة العدد الصحيح:
// year == 1973
السنة: = عدد صحيح (ListBox1.Items. كائنات [ListBox1.Items. IndexOf ('Zarko Gajic')]) ؛
تحكم دلفي لسلسلة
لماذا تتوقف هنا؟ يعد تعيين السلاسل والأعداد الصحيحة إلى سلسلة في مربع قائمة ، كما جربت للتو ، قطعة من الكعكة.
بما أن عناصر تحكم دلفي هي في الواقع كائنات ، يمكنك إرفاق عنصر تحكم لكل سلسلة معروضة في مربع القائمة.
يضيف التعليمة البرمجية التالية إلى تعليق ListBox1 (مربع القائمة) لجميع عناصر التحكم TButton في نموذج (ضع هذا في معالج الأحداث OnCreate للنموذج) مع الإشارة إلى كل زر.
فار idx: عدد صحيح ؛ ابدأإلى عن على معرف: = 0 إلى -1 + ComponentCount فعلابدأإذا مكونات [idx] يكون زر ثم ListBox1.AddObject (TButton (Components [idx]). Caption، Components [idx]) ؛ النهاية; النهاية;
برمجيًا "انقر" الزر "الثاني" ، يمكنك استخدام العبارة التالية:
TButton (ListBox1.Items. كائنات [1]).
أريد تعيين كائناتي المخصصة لعنصر السلسلة
في موقف أكثر عمومية ، يمكنك إضافة مثيلات (كائنات) لفئاتك المخصصة:
اكتب الطالب = صف دراسينشر fName: string؛ السنة: عدد صحيح ؛ عامةخاصية اسم: قراءة السلسلة fName ؛ خاصية السنة: عدد صحيح اقرأ السنة ؛ البناء خلق(مقدار ثابت اسم: خيط; مقدار ثابت السنة: عدد صحيح) ؛ النهاية;... البناء الطالب. خلق(مقدار ثابت اسم: خيط; مقدار ثابت السنة: عدد صحيح) ؛ ابدأ fName: = name؛ السنة: = السنة ؛ النهاية; ابدأ// إضافة سلسلتين / كائنين -> الطلاب إلى القائمة ListBox1.AddItem ('John'، TStudent. إنشاء ("جون" ، 1970)) ؛ ListBox1.AddItem ('Jack'، TStudent. إنشاء ("جاك" ، 1982)) ؛ // أمسك بالطالب الأول - جون الطالب: = ListBox1.Items. كائنات [0] مثل الطالب ؛ // عرض سنة جون ShowMessage (IntToStr (طالب. عام))؛ النهاية;
ما تقوم بإنشائه يجب أن تتحرر
إليك ما يجب أن تقوله المساعدة عن الكائنات في أحفاد TStrings: لا يمتلك كائن TStrings الكائنات التي تضيفها بهذه الطريقة. لا تزال الكائنات التي تمت إضافتها إلى كائن TStrings موجودة حتى إذا تم تدمير مثيل TStrings. يجب أن يكونوا دمرت بشكل صريح بواسطة التطبيق.
عند إضافة كائنات إلى سلاسل - كائنات تقوم بإنشائها - يجب عليك التأكد من تحرير الذاكرة المشغولة ، أو سيكون لديك تسريب ذاكرة
الإجراء المخصص العام FreeObjects يقبل متغير من نوع TStrings كمعلمة فقط. سيحرر FreeObjects أي كائنات مرتبطة بعنصر في قائمة السلسلة في المثال أعلاه ، يتم إرفاق "الطلاب" (فئة TStudent) بـ سلسلة في مربع قائمة ، عندما يكون التطبيق على وشك الإغلاق (حدث OnDestroy النموذج الرئيسي ، على سبيل المثال) ، تحتاج إلى تحرير الذاكرة احتل:
FreeObjects (ListBox1.Items) ؛
ملاحظة: يمكنك استدعاء هذا الإجراء فقط عندما يتم إنشاء الكائنات المخصصة لعناصر السلسلة.