לרוב כשאתה מתכנת בדלפי אינך צריך ליצור רכיב דינמי. אם תפיל רכיב בטופס, דלפי מטפל ביצירת הרכיבים באופן אוטומטי בעת יצירת הטופס. מאמר זה יסקור את הדרך הנכונה ליצירת רכיבים באופן תכנותי בזמן ריצה.
יצירת רכיב דינמי
ישנן שתי דרכים ליצור רכיבים באופן דינמי. דרך אחת היא להפוך טופס (או TComponent אחר) לבעלים של הרכיב החדש. זהו נוהג נפוץ בעת בניית רכיבים מורכבים בהם מיכל חזותי יוצר ובעלות רכיבי המשנה. פעולה זו תבטיח שהרכיב החדש שנוצר ייהרס עם הרס הרכיב הבעלים.
כדי ליצור מופע (אובייקט) של כיתה, אתה קורא לשיטת "צור". הקבלן צור הוא א שיטת כיתהלעומת כל השיטות האחרות שתיתקלו בהן בתכנות דלפי, שהן שיטות אובייקט.
לדוגמה, TComponent מצהיר על בניית Create באופן הבא:
בנאי צור (AOwner: TComponent); וירטואלי;
יצירה דינמית עם בעלי
הנה דוגמה ליצירה דינמית, היכן עצמי הוא צאצא TComponent או TComponent (למשל, מופע של TForm):
עם TTimer. צור (עצמי) לעשות
התחל
מרווח: = 1000;
מופעל: = שווא;
OnTimer: = MyTimerEventHandler;
סוף;
יצירה דינמית עם קריאה מפורשת בחינם
הדרך השנייה ליצור רכיב היא השימוש אפס כבעלים. שים לב שאם תעשה זאת, עליך גם לשחרר במפורש את האובייקט שאתה יוצר ברגע שאתה כבר לא צריך אותו (או שתייצר
עם טבלט. צור (אפס) לעשות
נסה
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
פתוח;
עריכה;
FieldByName ('עסוק'). AsBoolean: = נכון;
הודעה;
סוף סוף
חינם;
סוף;
יצירה דינמית והפניות לאובייקטים
ניתן לשפר את שתי הדוגמאות הקודמות על ידי הקצאת התוצאה של יצירת השיחה למשתנה מקומי לשיטה או שייכת לכיתה. זה רצוי לעתים קרובות כאשר הפניות ל- רכיב צריך להשתמש מאוחר יותר, או מתי סקופ יש להימנע מבעיות שעלולות להיגרם על ידי חסימות "עם". להלן קוד היצירה של TTimer מלמעלה, תוך שימוש במשתנה שדה כהפניה לאובייקט TTimer המיידי:
FTimer: = TTimer. צור (עצמי);
עם FTimer לעשות
התחל
מרווח: = 1000;
מופעל: = שווא;
OnTimer: = MyInternalTimerEventHandler;
סוף;
בדוגמה זו "FTimer" הוא משתנה שדה פרטי של הטופס או המיכל החזותי (או מה ש"אני "הוא). כשאתה ניגש למשתנה FTimer משיטות בכיתה זו, כדאי מאוד לבדוק אם ההתייחסות תקפה לפני השימוש בו. זה נעשה באמצעות הפונקציה Assigned של דלפי:
אם הוקצה (FTimer) אז FTimer. מופעל: = נכון;
יצירה דינמית והפניות לאובייקטים ללא בעלים
וריאציה לכך היא ליצור את הרכיב ללא בעלים, אך לשמור על ההתייחסות להרס מאוחר יותר. קוד הבנייה של ה- TTimer ייראה כך:
FTimer: = TTimer. צור (אפסי);
עם FTimer לעשות
התחל
...
סוף;
וקוד ההרס (ככל הנראה בהשחתת הטופס) ייראה כך:
FTimer. חינם;
FTimer: = אפסי;
(*
או השתמש בהליך FreeAndNil (FTimer), המשחרר הפניה לאובייקט ומחליף את הפניה באפס.
*)
הגדרת ההתייחסות לאובייקט לאפס היא קריטית בעת שחרור אובייקטים. הקריאה ל- Free בודקת תחילה אם ההתייחסות לאובייקט אפס או לא, ואם היא לא, היא מכנה את השמדת האובייקט הרס.
יצירה דינמית והפניות לאובייקטים מקומיים ללא בעלים
להלן קוד היצירה של TTable מלמעלה, תוך שימוש במשתנה מקומי כהפניה לאובייקט TTable המיידי:
localTable: = לוח שולחן. צור (אפסי);
נסה
עם localTable do
התחל
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
סוף;
...
// מאוחר יותר, אם ברצוננו לציין במפורש את ההיקף:
לוח מקומי. פתוח;
לוח מקומי. עריכה;
לוח מקומי. FieldByName ('עסוק'). AsBoolean: = נכון;
לוח מקומי. הודעה;
סוף סוף
לוח מקומי. חינם;
לוח מקומי: = אפסי;
סוף;
בדוגמה שלמעלה, "localTable" הוא א משתנה מקומי מוצהרת באותה שיטה המכילה קוד זה. שים לב שאחרי שחרור כל אובייקט, באופן כללי כדאי מאוד להגדיר את ההתייחסות לאפס.
מילת אזהרה
חשוב: אל תערבב שיחה בחינם עם העברת בעל תוקף לבנאי. כל הטכניקות הקודמות יעבדו ותקפות, אך להלן אמור לעולם אל תופיע בקוד שלך:
עם טבלט. צור (עצמי) עשה
נסה
...
סוף סוף
חינם;
סוף;
דוגמת הקוד למעלה מציגה להיטי ביצועים מיותרים, משפיעה מעט על הזיכרון ויש לה פוטנציאל להציג באגים שקשה למצוא. גלה מדוע.
הערה: אם לרכיב שנוצר באופן דינמי יש בעלים (שצוין על ידי הפרמטר AOwner במבנה Create), אז הבעלים זה אחראי להשמדת הרכיב. אחרת, עליך להתקשר במפורש בחינם כאשר אינך זקוק עוד לרכיב.
מאמר שנכתב במקור על ידי מארק מילר
תוכנת מבחן נוצרה בדלפי כדי ליצור זמן דינמי של 1000 רכיבים עם ספירת רכיבים התחלתית משתנה. תוכנית הבדיקה מופיעה בתחתית עמוד זה. התרשים מציג קבוצת תוצאות מתוכנית הבדיקה, ומשווה את הזמן שלוקח ליצירת רכיבים הן עם הבעלים והן ללא. שימו לב שזה רק חלק מהלהיט. ניתן לצפות לעיכוב ביצועים דומה בעת השמדת רכיבים. הזמן ליצור באופן דינמי רכיבים עם הבעלים הוא 1200% עד 107960% איטי יותר מזה ליצור רכיבים ללא בעלים, תלוי במספר הרכיבים בטופס והרכיב שהוא נוצר.
תוכנית המבחן
אזהרה: תוכנית בדיקה זו אינה עוקבת ומשחררת רכיבים הנוצרים ללא בעלים. על ידי אי מעקב ושחרור של רכיבים אלה, זמנים שנמדדו עבור קוד היצירה הדינמית משקפים בצורה מדויקת יותר את הזמן האמיתי ליצירת רכיב באופן דינמי.
הורד את קוד המקור
אזהרה!
אם ברצונך להפעיל באופן דינמי רכיב דלפי ולשחרר אותו במפורש מתישהו אחר כך, העבר תמיד לאפס כבעלים. כישלון זה עלול להכיל סיכון מיותר, כמו גם בעיות תחזוקה של ביצועים וקוד. קרא את המאמר "אזהרה על הפעלת דינמי של רכיבי דלפי" למידע נוסף ...