RTTI מייצג את Run Time Type Information. התפקיד שלו הוא לתת גישה למידע בכל מחלקה בצורה תכנותית בלי לדעת מראש לאן צריך לגשת. בפסקל המידע של RTTI נשמר ע"י VMT – אשר מייצג את Virtual Method Table, ומספק גישה לאיזור ה Published במחלקה ועוד.
אחד הדברים המדהימים שאפשר לעשות עם הRTTI הוא לקבל מידע על הרבה דברים שבצורה "רגילה" לא כל כך יהיה אפשרי, כמו הדוגמה הבאה:
Type
TMyEnum = (Enum1, Enum2, Enum3);עכשיו נגיד ונרצה לרוץ על כל ערך מניה, ולתת פלט כזה:
Enum1 = 0
Enum2 = 1
Enum3 = 2בצורה רגילה לא נוכל לעשות את זה, אך בעזרת RTTI, נוכל לממש את זה ממש כמו בשפה דינאמית.
תוכנית כזו תראה כך:
program EnumTest;
{$MODE OBJFPC}
uses TypInfo;
type TMyEnum = (Enum1, Enum2, Enum3);
var i : TMyEnum;
begin for i := Low(TMyEnum) to High(TMyEnum) do writeln(GetEnumName(TypeInfo(TMyEnum), ord(i)), ' = ', ord(i));
end.וזהו יש לנו תוכנית שעושה בדיוק את זה.
התוכנית מאוד פשוטה, אנחנו מגדירים יחידה בשם TypInfo אשר מכילה את כלי ה RTTI שאנחנו צריכים. אח"כ אנחנו מגדירים את המניה שאנחנו רוצים ויוצרים לה משתנה שעליו נרוץ (ו).
לאחר מכן, אנחנו יוצרים לולאה לאורך כל המנייה (שימו לב שאם נשנה את גודל המניה, עדיין לא נהיה צריכים לשנות שום דבר אחר בקוד). בתוך הלולאה, אנחנו מדפיסים את המידע שלנו.
עכשיו את שם המנייה עצמה (Enum1 למשל) אנחנו לא יכולים לקבל, אז אנחנו נשתמש בפונקציה GetEnumName.
בעזרת TypeInfo אנחנו מקבלים המרה למצביע מסוג PTypeInfo אשר מכיל את המידע שGetEnumName זקוקה לו, ובעזרת הפונקציה ord אנחנו מחזירים את הערך המספרי של המיקום של המניה שלנו
בצד השני אחרי ה "=", אנחנו מדפיסים את המיקום של המניה שלנו (0, 1, 2).
שימו לב שאת הערך המספרי של המניה שלנו ניתן לקבל באמצעות ה RTTI עם הפונקציה GetEnumValue. הסיבה לקיום הפונקציה היא שבמידה ונשנה את המספרים של המניה כלומר במקום ש Enum3 יהיה 2, נציב לו 3, Ord עדיין יחזיר לנו 2 (כי הוא מחזיר את המיקום של האיבר) ולא 3, ואז כדאי להשתמש בקבל הערך חזרה מהמניה.


29 מאי, 2008 בשעה 11:58 am
אני חושב ש "reclection" זה המושג לתיאור מה ש-TypeINfo עושה.
29 מאי, 2008 בשעה 11:58 am
התכוונתי reflection
29 מאי, 2008 בשעה 7:23 pm
אני זוכר שהערות שמתחילות בדולר הן בעצם הוראות לקומפילר – אתה יכול להסביר מה ההוראה הזאת שאתה נתת?
כמו כן, שלומיל כבר הסביר שהמושג הזה קיים ב־c++ (הוא מרגיש יותר מלכולך מאשר בפסקל אבל יעיל באותה מידה), ואם אתה משתמש ב־Qt4 למשל, חלק גדול מהדברים הללו זמינים לך גם בלי RTTI עבור מחלקות שיורשות את QObject.
בינינו, לא תמיד משתמשים בדברים הללו וזה כמעט מיותר
29 מאי, 2008 בשעה 7:29 pm
הפקודת מהדר שנתתי אומרת שאני אדבר בדיאלקט שנקרא Object FPC, שזה מדבר על תמיכה בתכנות מונחה עצמים לפי איך ש FPC חושב שצריך לדבר (ולדעתי הם הרבה יותר קרובים למקור מאשר דלפי, אם כי הם כמעט לגמרי זהים)
השמוש העיקרי של RTTI בפסקל היא בלזרוס ושאר העורכים הגרפיים.
אתמול במקרה הייתי צריך את זה (במקום לכתוב עוד קוד), אז כבר החלטתי לכתוב על זה טיפ
הבעיה היחידה שאני רואה עם QT, זה ++C
12 יוני, 2008 בשעה 11:26 pm
[...] לירושה במחלקות בפסקל, היא אתחול הזכרון, אשר מספק גם RTTI, דבר שלא קיים באובייקטים בפסקל, ולכן גם אין את חלק ה [...]