Gtk3, GObject Introspection ו Free Pascal

קראתי פוסט מעניין על מצב ה binding של GTK3 בעולם הפסקל, וגיליתי משהו מאוד מעניין: הוא נעשה לגמרי ללא התערבות מתכנתים. זהו סוג של תרגום לפוסט.

ביצוע הBinding משתמש למעשה בפרויקט שקהילת GTK יצרה בשם GObject Introspection.
אם להסביר על רגל אחת את מהות הפרוייקט, אז הוא לוקח את ה API של פרוייקט GTK וממיר את המידע לקבצי XML אותם ניתן לקרוא בכל שפת תכנות.

אז מה שעשו אנשים בעולם הפסקל הוא ליצור מערכת שיודעת לתרגם את אותו קובץ XML אשר קיבל את הסיומת gir, וממירים אותו לקוד פסקל. הפרוייקט אשר ממיר לפסקל נקרא gir2pascal.

קובץ כזה יראה כך:

אבל זה לא כל העניין. השיפור הכי משמעותי מבחינת ה Binding לפסקל, הוא בכך שבמקום להשתמש ב record, משתמשים בObject (לא class).  זה אומר כי במקום להשתמש בגישה המקורית של GObjects כ C quasi-object, השימוש הוא לא שטוח, אלא תכנות מונחה עצמים כפי שהתחביר מאפשר לו להיות.

התרגום של תוכן הxml לפסקל נראה ככה:

וכפי שניתן לראות זהו אובייקט במקום רשומה. עבוד GTK2 התרגום נעשה "בזמנו" בצורה הבאה:

השימוש בתרגום הנ"ל היה נראה ככה:

procedure Foo;
var
  Button: PGtkWidget;
begin
  Button := gtk_button_new;
  gtk_button_set_label(PGtkButton(Button), 'Hello World!');
end;

אבל בגישה הנוכחית עם GTK3, הוא נראה כזה:

procedure Foo;
var
  Button: PGtkButton;
begin
  Button := TGtkButton.new;
  Button^.label_ := 'Hello World!';
end;

כמו שניתן לראות, זה מעט פשוט יותר. אבל בזכות כך שפונקציות "נמוכות" יותר עדיין קיימות, אפשר עדיין להשתמש גם בגישה הישנה.
אבל היתרונות האמיתיים כאן, הן בכך שיש שימוש באובייקטים, אשר בעצם מאפשרות לנו לרשת מידע מאובייקטים.
Button בהדגמה כאן, יורש בעצם מGtkWidget אשר מכיל תכונה בשם tooltip_text. כך שניתן עבור הכפתור בלבד, להוסיף לאובייקט את התכונה ואז הקוד שלנו יראה כך:

Button^.tooltip_text := 'Don''t click me unless you want to!';

כאשר בעבר, הוא היה נראה רק בצורה הזו:

gtk_widget_set_tooltip_text(PGtkWidget(Button) ,'Don''t click me unless you want to!');

כך נראת התוצאה:

Gtk3-Button

* פוסט זה דורש Javascript בשביל להצליח לראות אותו כמו שצריך

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s