TListBox ו- TComboBox של Delphi מציגים רשימת פריטים - מחרוזות ברשימה "לבחירה". TListBox מציג רשימה הניתנת לגלילה, TComboBox מציג רשימה נפתחת.
רכוש משותף לכל הפקדים לעיל הוא פריטים תכונה. פריטים מגדירים רשימת מחרוזות שיופיעו בבקרה למשתמש. בזמן העיצוב, כאשר אתה לוחץ פעמיים על המאפיין פריטים, "עורך רשימת המיתרים" מאפשר לך לציין פריטי מחרוזת. המאפיין פריטים הוא למעשה צאצא מסוג TStrings.
שני מחרוזות לפריט ברשימה בוקס?
ישנם מצבים שרוצים להציג א רשימת המיתרים למשתמש, למשל בבקרת תיבת הרשימה, אך יש להם גם דרך אחסן מחרוזת נוספת אחת לאורך זו המוצגת למשתמש.
מה שכן, ייתכן שתרצה לאחסן / לצרף יותר מאשר רק מחרוזת "רגילה" למיתר, אולי תרצה צרף אובייקט לפריט (מחרוזת).
קופסת רשימה. פריטים - TStrings "יודע" חפצים!
תן לאובייקט TStrings מבט נוסף במערכת העזרה. יש את חפצים מאפיין המייצג קבוצה של אובייקטים המשויכים לכל אחד מה- מיתרים במאפיין מיתרים - כאשר נכס המיתרים מתייחס למיתרים בפועל ברשימה.
אם ברצונך להקצות מחרוזת שנייה (או אובייקט) לכל מחרוזת בתיבת הרשימה, עליך לאכלס את המאפיין פריטים בזמן ריצה.
בזמן שאתה יכול להשתמש ב-
קופסת רשימה. פריטים. הוסף שיטה להוסיף מחרוזות לרשימה, כדי לשייך אובייקט לכל מחרוזת, תצטרך להשתמש בגישה אחרת.ה קופסת רשימה. פריטים. AddObject השיטה מקבלת שני פרמטרים. הפרמטר הראשון, "פריט" הוא טקסט הפריט. הפרמטר השני, "AObject" הוא האובייקט המשויך לפריט.
שים לב שתיבת הרשימה חושפת את הוסף פריט שיטה שעושה את אותו הדבר כמו פריטים. AddObject.
שני מיתרים למיתר אחד
מכיוון ששני הפריטים. AddObject ו- AddItem מקבלים משתנה מסוג TObject עבור הפרמטר השני שלהם, שורה כמו:
// שגיאת קומפילציה!
ListBox1.Items. AddObject ('zarko', 'gajic');
תביא לשגיאת קומפילציה: E2010 סוגים שאינם תואמים: 'TObject' ו- 'string'.
אינך יכול פשוט לספק מחרוזת לאובייקט מכיוון שדלפי עבור Win32 ערכי מחרוזת אינם אובייקטים.
כדי להקצות מחרוזת שנייה לפריט תיבת הרשימה, אתה צריך "להפוך" משתנה מחרוזת לאובייקט - אתה צריך אובייקט TString מותאם אישית.
מספר שלם למיתר
אם הערך השני שאתה צריך לאחסן יחד עם פריט המחרוזת הוא ערך מספר שלם, למעשה אינך זקוק לשיעור TInteger מותאם אישית.
ListBox1.AddItem ('זרקו גאג'יץ', TObject (1973));
השורה שמעל מאחסנת את המספר השלם "1973" יחד עם המחרוזת "Zarko Gajic" שנוספה.
למעלה ישירות typecast ממספר שלם לאובייקט. הפרמטר "AObject" הוא למעשה המצביע בן ה -4 בתים של האובייקט שנוסף. מכיוון שב- Win32 מספר שלם תופס 4 בתים - ליהוק קשה כזה אפשרי.
כדי להחזיר את המספר השלם המשויך למחרוזת, עליך להחזיר את "האובייקט" לערך המספר השלם:
// שנה == 1973
שנה: = מספר שלם (ListBox1.Items. אובייקטים [ListBox1.Items. IndexOf ('זרקו גאג'יץ')]);
בקרת דלפי למיתר
למה לעצור כאן? הקצאת מיתרים ומספרים שלמים למיתר בתיבת רשימה היא, כפי שחוויתם זה עתה, חתיכת עוגה.
מכיוון שפקדי Delphi הם למעשה אובייקטים, אתה יכול לצרף שליטה לכל מחרוזת המוצגת בתיבת הרשימה.
הקוד הבא מוסיף לכותרות ListBox1 (תיבת רשימה) של כל פקדי ה- TButton בטופס (מקם זאת במטפל האירועים OnCreate של הטופס) יחד עם ההתייחסות לכל כפתור.
var idx: מספר שלם; התחלל idx: = 0 ל -1 + רכיב רכיב לעשותהתחלאם רכיבים [idx] הוא טבוטון לאחר מכן ListBox1.AddObject (TButton (רכיבים [idx]). כיתוב, רכיבים [idx]); סוף; סוף;
כדי "ללחוץ" על כפתור "שני" באופן פרוגרמטי, אתה יכול להשתמש בהצהרה הבאה:
TButton (ListBox1.Items. אובייקטים [1]) .קליק;
אני רוצה להקצות את החפצים המותאמים אישית שלי לפריט המיתר
במצב כללי יותר היית מוסיף מופעים (אובייקטים) של מחלקות מותאמות אישית משלך:
סוג TStudent = מעמדפרטי fName: מחרוזת; שנת: מספר שלם; ציבוריתכונה שם: מחרוזת לקרוא fName; תכונה שנה: מספר שלם לקרוא שנה; בנאי צור (const שם: מחרוזת; const שנה: מספר שלם); סוף;... בנאי TStudent. צור (const שם: מחרוזת; const שנה: מספר שלם); התחל fName: = שם; שנת: = שנה; סוף; התחל// הוסף שני מחרוזות / אובייקטים -> תלמידים לרשימה ListBox1.AddItem ('ג'ון', TStudent. צור ('ג'ון', 1970)); ListBox1.AddItem ('ג'ק', TStudent. צור ('ג'ק', 1982)); // לתפוס את התלמיד הראשון - ג'ון סטודנט: = ListBox1.Items. אובייקטים [0] כפי ש TStudent; // הצגת השנה של ג'ון ShowMessage (IntToStr (סטודנט. שנה)); סוף;
מה שאתה יוצר עליך לשחרר
להלן מה שיש לעזרה לומר על אובייקטים בצאצאי TStrings: האובייקט TStrings אינו הבעלים של האובייקטים שאתה מוסיף בדרך זו. חפצים שנוספו לאובייקט TStrings עדיין קיימים גם אם מופע TStrings נהרס. הם חייבים להיות הרוס במפורש על ידי האפליקציה.
כשאתה מוסיף חפצים למיתרים - חפצים שאתה יוצר - עליך לוודא שאתה משחרר את הזיכרון תפוס, או שיהיה לך א דליפת זיכרון
הליך מותאם אישית גנרי FreeObjects מקבל משתנה מסוג TStrings כפרמטר היחיד שלו. FreeObjects ישחרר כל אובייקט הקשור לפריט ברשימת המחרוזות בדוגמה שלמעלה, "תלמידים" (כיתת TStudent) מצורפים ל מחרוזת בתיבת רשימה, כאשר היישום עומד להיסגר (אירוע OnDestroy, למשל,) אתה צריך לשחרר את הזיכרון כבוש:
FreeObjects (ListBox1.Items);
הערה: אתה קורא להליך זה רק כאשר נוצרו על ידיך אובייקטים שהוקצו לפריטי מחרוזת.