כתיבת ממשקי משתמש בסיסיים ללא שימוש ב C או Glade

שלומי ישראלי הציג אתמול פוסט כיצד ניתן בקוד פתוח ליצור ממשקי משתמש בסיסיים באמצעות C ו Glade.

לדעתי האישית הצגות כאלו, רק מוכיחות לאנשים המתנגחים בקוד הפתוח כל מה שרע בקוד הפתוח, אז החלטתי להציג דרך בקוד פתוח נוחה, מהירה ונקיה יותר, ללא קשר אם ה toolkit שלנו הוא GTK, Qt, אנדרואיד או IOS. הכל אצלנו נשאר אותו הדבר. מה שמשתנה זו הצורה שאנחנו מהדרים את הקוד.

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

עבור תוכנה גרפית, נתחיל בכך שנעבוד עם Lazarus. ונתחיל שם פרוייקט חדש:

הממשק בנוי ממספר חלונות, אשר את חלקם אתם רואים בתמונה. והוא נועד לסייע לנו לכתוב תוכנות בצורה כמה שיותר פשוטה, נוחה וכמה שפחות מאמץ, וכמה שפחות חזרה על קוד. בנוסף, הוא בנוי להיות חוצה פלטפורמות או סביבות גרפיות, ובכך מציג לנו API אחיד עבור כל סוג ממשק, ולמעשה לא אכפת לנו אם אנחנו עובדים ב GTK או Qt. זה לא חשוב לנו.

אז ניצור אפליקציה חדשה על ידי שימוש בתפריט File ושם נבחר ב …New:

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

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

אז נזרוק רכיב שנקרא TLabel ורכיב שנקרא TButton. חשוב לבחור קודם את TLabel אשר יקבל את שם ברירת המחדל Label1, ולספק לתכונה הנקראת Align את הערך alTop. זה יבטיח לנו שהתווית תישאר למעלה, ותשנה את גודלה בהתאם לגודל החלון.

לאחר מכן, נבחר את TButton אשר קיבל את השם בברירת המחדל Button1 ונגיד לו ב Align להיות alClient, כלומר לתפוס את כל המרווח הקיים, ולשנות את הגודל בהתאם:

לאחר שנזין את התכונות של ה Caption כפי ששלומי עשה, נעשה עוד צעד קטן, ונבחר בטופס עצמו הנקרא form1, ונגיד לו כי התכונה AutoSize הופכת ל True.

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

הצעד הבא יהיה ללחוץ לחיצה כפולה על הכפתור, וזה יפתח לנו עורך טקסט המאפשר לנו לכתוב קוד בתוך מתודה הנקראת Button1Click.

אנחנו נכתוב את הקוד הבא:

code

  ShowMessage('The IP Address is 127.0.0.1');

וזהו, זה כל הקוד שאנחנו צריכים לכתוב בעצמנו על מנת שהתוכנה תעבוד.

אם אתם ממש רוצים, אתם מוזמנים ליצור חלון חדש אשר יהיה חלון דו-שיח (דיאלוג), כפי ששלומי עשה, אבל למעשה ShowMessage כבר עושה את זה עבורינו.
השלב הבא יהיה ללחוץ בתפריט הראשי על Run ושם לבחר את האפשרות Run. ואנחנו נראה כי התכנה עושה בדיוק את מה ששלומי הציג לנו, רק עם שורת קוד אחת בלבד.

תוצר:

קוד המקור – רישיון MIT
ערכת הצבעים של לזרוס איתה אני משתמש

רשומה זו פורסמה בקטגוריה FPC, Lazarus, Object Pascal, טכנולוגיה, פיתוח, קוד פתוח, תוכנה, תכנות, עם התגים , , , , . אפשר להגיע ישירות לרשומה זו עם קישור ישיר.

16 תגובות על כתיבת ממשקי משתמש בסיסיים ללא שימוש ב C או Glade

  1. נדב הגיב:

    ממש בדיחת 1 באפריל.

    זה פיתרון מצוין לו רק זה היה מיועד לפסקל.

    לדעתי אם היו מפתחים שפה בשם P, שהיא פסקל בלי סמנים מזהים מעצבנים כמו begin זה היה תופס מציין ונהייה דיי נפוץ

    • ik_5 הגיב:

      פרט לתאריך, מה הקשר ל1 באפריל ?
      ויש לך שפת פסקל 3, שנקראת go של גוגל, שלקחה המון דברים שקיימים בפסקל כתחביר.

      ולפי מה שאתה מציג, זה אומר כי הקוד שכתבת בפיתון בשביל GUI יעבוד גם על תוכנת C שלך בלי שתריץ פיתון ? לא נראה לי בדיוק.

  2. נדב הגיב:

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

  3. levdev הגיב:

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

    ההבדל היחיד הוא, שבמקרה שלך, רוב הקוד מיוצר אוטומטית ע"י סביבת פיתוח, דבר שאולי מקל לפעמים, אבל לא תמיד טוב (יצא לך אי פעם לעבוד עם VS ו-MFC?).

    בכל מקרה, מחוללי קוד אוטומטיים קיימים גם ל-C ושפות אחרות רבות.
    אבל אם לא נכתוב מידי פעם בעצמנו איזה main, בייחוד כשזה למטרת לימוד, איך נמשיך להיות בכושר?

  4. גיא דפני (עוץליגוץלי) הגיב:

    אפשר גם קצר יותר, ללא IDE, ללא C וללא שפה ;-) (נכתב במיוחד עבורך ועבור שלומי).

    http://www.tapuz.co.il/forums2008/viewmsg.aspx?forumid=236&messageid=160711231

    • ik_5 הגיב:

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

      • ik_5 הגיב:

        ד"א, ככה נראה גם קוד פסקל לעשות בדיוק אותו הדבר, למעט ה event handler שהוא פשוט סוג של callback . ו #C הומצאה על ידי מי שהמציא את דלפי. ואם זה לא מספיק, מיקרוסופט תמיד עושים חיקוי של דלפי ב VS ובתפיסת התכנות שלהם, כל פעם מחדש.

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

        • גיא דפני (עוץליגוץלי) הגיב:

          עידו, כל השפות הללו אותו דבר. לא משנה אם אתה כותב בדלפי, בgtk# או בגרסה הויזואלית של oOk. (עדיין בשלבי פרה-עז, אבל יש שמועות שעובדים על זה, ברגע שיסיימו את הגרסה של Brain fuck ויזואלי ומונחה ארז-טל).

          בכל מקרה – חג שמח! http://xkcd.com/378/

          • ik_5 הגיב:

            אם השפה לא כל כך משנה, למה אתם כל כך מתנגדים להשתמש בObject Pascal ומביעים בו זלזול ?

          • גיא דפני (עוץליגוץלי) הגיב:

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

          • ik_5 הגיב:

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

  5. levdev הגיב:

    לא יכול לדבר בשם אחרים שהגיבו כאן, אבל אני אישית לא מתנגד לשימוש ב-Object Pascal וכלל לא הבאתי זלזול בה.

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

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

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

    אז, למה ההטפות והמתקפה?

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

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

    • ik_5 הגיב:

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

      יש לך מספר קבצים:
      קובץ lpi מכיל מידע עבור לזרוס וכלי כדוגמת lazbuild לקמפל את הקוד (נגיד סוג של Makefile רק שמכיל הגדרות ולא קוד).
      קובץ lpr זה קובץ הפרוייקט שלך שמכיל את המקביל של C ל main.
      קובץ pas מכיל יחידה של החלון שלך. זה הקוד של החלון. אתה יכול לשים את זה בקובץ lpr, אבל אז אתה לא עוב בגישה של dry. זה reuse.

      קובץ lfm זה קובץ המקביל לטמפלייט של glade. בברירת מחדל, הוא מהודר לתוך קובץ הריצה, אבל לא חייבים. הוא כולל התכונות של כל הרכיבים. אתה יכול גם לטעון אותו בזמן ריצה אם צריך,
      ד"א אם אתה עושה את הכל לפי קוד מקור, אז לא צריך את ה template בכלל.
      אתה גם לא חייב את הקובץ lpi, ויכול להיפתר ממנו, זה אומר אבל שצריך ליצור או קובץ makefile או לכתוב בשורת פקודה כמעט הגדרות.

      • levdev הגיב:

        ראשית, תודה על ההסבר.

        Glade בהחלט חוסך כתיבת קוד.

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

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

        אבל אני לא חושב שזה הופך אותו למסובך יותר מעורך GUI אחר, אלא רק פחות "Feature complete".

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

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

        ואכן, הרבה מאוד אנשים מעדיפים שלא לגעת לעולם בממשק CLI ולהשתמש רק ב-GUI.
        אבל, האם זה אומר שאנחנו צריכים להכריז על BASH כחולה רעה ולשאוף להיפתר ממנו?

        • ik_5 הגיב:

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

          בקשר לחלון DOS השחור, אני לרוב מדגים לאנשים את הכוח שלו, והם נשארים פעורי פה, אבל לא מסוגלים לברוח מהרעיון שגרפי = ידידותי, כי זה השיווק שגם התפוח וגם רדמונד עשו להם הרבה מאוד שנים.

          ולדעתי Bash הוא כלי חשוב מאוד, וzsh גם כלי מאוד חשוב, ואין להם תחליף. כל כך אין להם תחליף, שאפילו רדמונד התחילו לבנות כלים בסגנון.

  6. פינגבק: הוליווד פורצת | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s