דלפי "בעיה": TForm. צור () - בטל, עצמי או יישום?

כשאתה יוצר דלפי מתנגד לדינמיות שיורשים מ- TControl, כגון TForm (המייצג טופס / חלון ביישומי דלפי), הקבלן "צור" מצפה לפרמטר "בעלים":

בנאי צור (AOwner: TComponent);

הפרמטר AOwner הוא הבעלים של אובייקט TForm. בעל הטופס אחראי לשחרור הטופס - כלומר זיכרון שהוקצה על ידי הטופס - בעת הצורך. הטופס מופיע במערך הרכיבים של בעליו והוא נהרס באופן אוטומטי כאשר בעליו נהרס.

יש לך שלוש אפשרויות לפרמטר AOwner: אפס, עצמי, ו יישום.

כדי להבין את התשובה עליכם לדעת תחילה את המשמעות של "אפסי", "עצמי" ו"יישום ".

  • אפס מציין שאף אובייקט אינו הבעלים של הטופס ולכן המפתח אחראי לשחרור הטופס שנוצר (על ידי קורא ל- myForm. חינם כשאינך זקוק עוד לטופס)
  • עצמי מציין את האובייקט בו נקראת השיטה. אם, למשל, אתה יוצר מופע חדש של טופס TMyForm מתוך מטפל OnClick של כפתור (שם כפתור זה ממוקם על MainForm), עצמי מתייחס ל- MainForm. לפיכך, כאשר MainForm ישוחרר, הוא גם ישחרר את MyForm.
  • יישום מציין משתנה גלובלי מסוג TApplication שנוצר בעת הפעלת היישום שלך. "יישום" מכסה את היישום שלך ומספק פונקציות רבות המתרחשות ברקע התוכנית.

דוגמאות:

  1. צורות מודאליות. כשאתה יוצר טופס שיוצג באופן מודאלי ומשוחרר כאשר המשתמש סוגר את הטופס, השתמש "nil" כבעלים:
    instagram viewer
    var myForm: TMyForm; התחל myForm: = TMyForm. צור (אפס); נסה את MyForm. ShowModal; סוף סוף myForm. חינם; סוף; סוף;
  2. צורות חסרות צורה. השתמש ב"יישום "כבעלים:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. צור (יישום);

כעת, כשתסיים (יציאה) מהיישום, האובייקט "יישום" ישחרר את המופע "myForm".

מדוע ומתי TMyForm. צור (יישום) לא מומלץ? אם הטופס הוא טופס מודאלי ויהרס, עליך להעביר "אפס" לבעלים.

אתה יכול להעביר "בקשה", אך עיכוב הזמן שנגרם על ידי שיטת ההודעה שנשלחת לכל רכיב וטופס שבבעלות היישום או בבעלות עקיפה עלול להוות שיבוש. אם היישום שלך מורכב מטפסים רבים עם רכיבים רבים (באלפים), והטופס שאתה יוצר מכיל בקרות רבות (במאות), עיכוב ההודעות יכול להיות משמעותי.

העברת "אפס" כבעלים במקום "אפליקציה" תגרום לטופס להופיע מוקדם יותר ולא יפגע אחרת בקוד.

עם זאת, אם הטופס שאתה צריך ליצור אינו מודאלי ואינו נוצר מהטופס הראשי של היישום, אז כשאתה מציין "עצמי" כבעלים, סגירת הבעלים תשחרר את הטופס שנוצר. השתמש ב"עצמי "כשאינך רוצה שהטופס יחיה את היוצר שלו.

אזהרה: כדי להפעיל באופן דינמי רכיב דלפי ולשחרר אותו מפורשות מתישהו אחר כך, העביר תמיד את "nil" כבעלים. כישלון בכך עלול להכיל סיכון מיותר, כמו גם בעיות ביצוע ותחזוקת קוד.

בתוך יישומי SDI, כאשר משתמש סוגר את הטופס (על ידי לחיצה על כפתור [x]) הטופס עדיין קיים בזיכרון - הוא מסתתר רק. ביישומי MDI, סגירת טופס ילד MDI ממזערת אותה רק.
ה OnClose האירוע מספק פעולה פרמטר (מסוג TCloseAction) בו תוכלו להשתמש כדי לקבוע מה קורה כאשר משתמש מנסה לסגור את הטופס. הגדרת פרמטר זה ל- "caFree" תשחרר את הטופס.

מנווט טיפים של דלפי:
»קבל את ה- HTML המלא ממרכיב TWebBrowser
«כיצד להמיר פיקסלים למילימטרים

instagram story viewer