מבנה נפוץ ביותר בא דלפי היישום יהיה נוהל או פונקציה. ידועים כשיגרה, נהלים או פונקציות הם חסימות הצהרה שאתה מתקשר ממקומות שונים בתוכנית.
במילים פשוטות, הנוהל הוא שגרה שלא מחזירה ערך ואילו פונקציה מחזירה ערך.
ערך החזרה מפונקציה מוגדר על ידי סוג ההחזרה. ברוב המקרים הייתם כותבים פונקציה להחזיר ערך יחיד זה יהיה מספר שלם, מחרוזת, בוליאנית או סוג פשוט אחר, גם סוגים חוזרים יכולים להיות מערך, רשימת מחרוזות, מופע של אובייקט מותאם אישית או כאחד.
שים לב שגם אם הפונקציה שלך מחזירה רשימת מחרוזות (אוסף של מיתרים) הוא עדיין מחזיר ערך יחיד: מופע אחד מרשימת המחרוזות.
יתרה מזאת, לשגרה של דלפי באמת יכולות להיות הרבה פנים: שגרה, שיטה, מצביע שיטה, נציג אירועים, שיטה אנונימית ...
האם פונקציה יכולה להחזיר ערכים מרובים?
התשובה הראשונה שעולה בראש היא לא, פשוט מכיוון שאנו חושבים על פונקציה, אנו חושבים על ערך החזר יחידה.
בהחלט, התשובה לשאלה הנ"ל היא, עם זאת, כן. פונקציה יכולה להחזיר מספר ערכים. בוא נראה איך.
פרמטרים Var
כמה ערכים יכולה הפונקציה הבאה להחזיר, אחד או שניים?
פונקציה חיובי הדדי (const valueIn: מספר שלם; var valueOut: אמיתי): בוליאני;
הפונקציה מחזירה כמובן ערך בוליאני (נכון או לא נכון). מה דעתך על הפרמטר השני "valueOut" שהוכרז כפרמטר "VAR" (משתנה)?
פרמטרים Var מועברים לפונקציה על ידי הפניה כלומר שאם הפונקציה משנה את ערך הפרמטר - משתנה בגוש הקוד הקורא - הפונקציה תשנה את ערך המשתנה המשמש לפרמטר.
כדי לראות כיצד האמור לעיל עובד, להלן היישום:
פונקציה חיובי הדדי (const valueIn: מספר שלם; var valueOut: אמיתי): בוליאני;
התחל
תוצאה: = valueIn> 0;
אם תוצאה לאחר מכן valueOut: = 1 / valueIn;
סוף;
"ValueIn" מועבר כפרמטר קבוע - הפונקציה אינה יכולה לשנות אותו, והיא מתייחסת כאל קריאה בלבד.
אם "valueIn" או גדול מאפס, הפרמטר "valueOut" מוקצה לערך ההדדי של "valueIn" ותוצאת הפונקציה נכונה. אם valueIn הוא <= 0, הפונקציה מחזירה כוזבת ו" valueOut "לא משתנה בשום דרך.
להלן השימוש:
var
b: בוליאני;
r: אמיתי;
התחל
r: = 5;
b: = חיובי הדדי (1, r);
//here:
// b = true (מאז 1> = 0)
// r = 0.2 (1/5)
r: = 5;
b: = חיובי הדדי (-1, r);
//here:
// b = שווא (מאז -1
סוף;
לכן ה- PositiveReciprocal למעשה יכול "להחזיר" 2 ערכים! באמצעות פרמטרים של var תוכל לקבל החזר שגרתי ביותר מערך אחד.
פרמטרים מחוץ
יש דרך נוספת להגדיר פרמטר לפי הפניה - באמצעות מילת המפתח "החוצה", כמו:
פונקציה חיובי הדדי חיובי (const valueIn: מספר שלם; בחוץ valueOut: אמיתי): בוליאני;
התחל
תוצאה: = valueIn> 0;
אם תוצאה לאחר מכן valueOut: = 1 / valueIn;
סוף;
היישום של PositiveReciprocalOut זהה לזה ב- PositiveReciprocal, יש רק הבדל אחד: "valueOut" הוא פרמטר OUT.
עם פרמטרים שהוכרזו כ- "out", הערך הראשוני של המשתנה המופנה "valueOut" מושלך.
להלן השימוש והתוצאות:
var
b: בוליאני;
r: אמיתי;
התחל
r: = 5;
b: = PositiveReciprocal Out (1, r);
//here:
// b = true (מאז 1> = 0)
// r = 0.2 (1/5)
r: = 5;
b: = PositiveReciprocal Out (-1, r);
//here:
// b = שווא (מאז -1
סוף;
שימו לב כיצד בשיחה השנייה הערך של המשתנה המקומי "r" מוגדר ל- "0". הערך של "r" נקבע ל 5 לפני שיחת הפונקציה אך מכיוון שהפרמטר המוצהר כ- "out", כאשר "r" הגיע לפונקציה הערך הושלך וערך ברירת המחדל "ריק" נקבע עבור הפרמטר (0 לממש סוג).
כתוצאה מכך, אתה יכול לשלוח בבטחה משתנים לא מאוישים עבור פרמטרים החוצה - דבר שאסור לעשות עם פרמטרים "var". פרמטרים משמשים כדי לשלוח משהו לשגרה, למעט כאן עם פרמטרים "החוצה" :), ולכן משתנים לא מאוישים (המשמשים לפרמטרים של VAR) יכולים להיות בעלי ערכים מוזרים.
חוזר רשומות?
היישומים לעיל בהם פונקציה תחזיר יותר מערך אחד אינם נחמדים. הפונקציה מחזירה למעשה ערך יחיד, אך גם מחזירה, טוב יותר לומר alter, את הערכים של הפרמטרים var / out.
מסיבה זו, יתכן ורק לעיתים רחוקות תרצה להשתמש בפרמטרים של הפניות. אם נדרשות תוצאות נוספות מפונקציה, תוכל להחזיר פונקציה א סוג הקלטה משתנה.
שקול את הדברים הבאים:
סוג
TLatitudeLongitude = תקליט
קו רוחב: אמיתי;
קו אורך: אמיתי;
סוף;
ותפקוד היפותטי:
פונקציה איפה אני(const עיר שם: מחרוזת): TLatitudeLongitude;
הפונקציה WhereAmI תחזיר את קו רוחב ואורך עבור עיר מסוימת (עיר, אזור, ...).
היישום יהיה:
פונקציה איפה אני(const עיר שם: מחרוזת): TLatitudeLongitude;
התחל// השתמש באיזה שירות כדי לאתר "townName", ואז להקצות את תוצאת הפונקציה:
תוצאה. קו רוחב: = 45.54;
תוצאה. קו אורך: = 18.71;
סוף;
וכאן יש לנו פונקציה שמחזירה 2 ערכים אמיתיים. אוקיי, זה אמנם מחזיר רשומה אחת, אבל לרשומה זו יש שני שדות. שימו לב שתוכלו לקבל רשומה מורכבת מאוד המערבבת סוגים שונים שיוחזרו כתוצאה מפונקציה.
זהו זה. לכן כן, פונקציות דלפי יכולות להחזיר ערכים מרובים.