צפייה בעץ חלק ראשון

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

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

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

אז איך מתחילים בעצם ? הולכים ללשונית Common Controls וזורקים במקום המתאים את הפקד של TTreeView. בתכונות שלו אפשר לשחק איתו בשביל שיתאים לצרכים שלנו. בנוסף יש לו תכונה בשם Items. התכונה הזו מאפשרת לנו גם בצורה תכנותית וגם בצורה וויזואלית להוסיף בעצם את האיברים ברשימה. אני אדגים כאן כיצד יוצרים את האיברים בצורה תכנותית, הרי וויזואלית זה מאוד פשוט.

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

בקוד של החלון ב OnCreate יצרתי את הקוד הבא:

procedure TForm1.FormCreate ( Sender : TObject ) ;
var
  i : byte;
  Node : TTreeNode;
begin
  for i := 1 to 20 do
    begin
      Node := TreeView1.Items.Add(nil, 'Test ' + IntToStr(i));
    end;
end;

הקוד עושה פעולה מאוד פשוטה, רץ על כל המספרים מ1 ועד 20 ומוסיף את האיברים אל הרשימה עם מספור של האיבר עצמו. אנחנו שומרים את האיבר שנוצר ב TTreeNode לשימוש עתידי. שמתי בפרמטר הראשון של Add את הערך nil בשביל לציין שהאיבר שנוצר אינו אח של איבר אחר (שגם הוא מסוג המחלקה של TTreeNode).

אבל עכשיו יש לנו רשימה של 20 איברים, אבל הם עריריים ללא ילדים. בשביל לדאוג לכך שיהיו להם ילדים נגיד לItems להוסיף ילד לאיבר שיצרנו באמצעות AddChild אשר דומה מאוד ל Add הרגיל, אבל יוצרת בן. בשביל להשיג את התוצאה כמו בתמונה למעלה, הקוד המלא נכתב בצורה הבאה:

procedure TForm1.FormCreate ( Sender : TObject ) ;
var
  i : byte;
  Node : TTreeNode;
begin
  for i := 1 to 20 do
    begin
      Node := TreeView1.Items.Add(nil, 'Test ' + IntToStr(i));
      if i mod 2 = 0 then
        begin
          TreeView1.Items.AddChild(Node, 'Sub Test');
          if i mod 4 = 2 then
            Node.Expand(False);
        end;
    end;
end;

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

12 מחשבות על “צפייה בעץ חלק ראשון

  1. ik_5 מאת

    לצערי לא, אבל מעולם לא ניסיתי עד לשאלה שלך את bidimode ואנסה לפחות ב GTK ו Qt לפתור את זה. אני לא יודע אם בWindows זה נתמך כבר או לא.

    1. עידו גנדל

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

  2. meir

    לפי הכתוב בוויקי שלהם אין תמיכה לזה (להבדיל מתמיכה בטולקיט ספציפי):
    http://wiki.lazarus.freepascal.org/BidiMode

    לא אהבתי את ה-API: שתי מתודות להוספה, באופן אישי מעדיף שמוסיפים ילדים ל-node האב ולא דרך אובייקט העץ. נראה מה יהיה עם הפקד השני🙂

    1. ik_5 מאת

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

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

      1. meir

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

        בכל מקרה דיברתי על תכנון ה-API של העץ, BiDi סביר בכל הרכיבים נראה אבוד, ומשאבים שגם כך מוגבלים לא אשקיע בכך.

  3. אבי

    לא קשור ישירות לנושא , אבל מצחיק שדווקא ++ Dev C נכתבה ב- delphi…
    http://www.bloodshed.net/devcpp.html
    http://en.wikipedia.org/wiki/Dev-C%2B%2B

    למה לא ב- ++C / C ?

    לפי מחקרים שאני עושה ברשת לאחרונה, בעקבות רצון לפתח תוכנת חלונות כלשהי, אני מוצא שדלפי עדיין חיי וקיים ועם יתרונות לא מעטים מול #C למשל, ועם חסרונות כמובן כמו העובדה שלא מעט עוברים ל- #C … (דרישת השוק כנראה – צריך להתפרנס)

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

    1. ik_5 מאת

      זה לא רק העברית, והשפה כן חשובה.

      העצוב הוא, שכל התכונות שהיו לדלפי לפני 15 שנה, נכנסו רק לאחרונה ל #C מבחינת יכולות עבודה וזה לא מפריע לאנשים להגיד ש #C היא הסביבה הכי טובה לפיתוח, למרות שגם דלפי התקדמה מאז הרבה מאוד…

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

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

      ד"א למה לא כתבו את Dev-C++ ב ++C ? כי קל יותר לעשות את זה בפסקל מאשר ב ++C.

      1. אבי

        יותר קל לפתח בדלפי מאשר ב- ++C – זה נכון, מנסיון (לא בשנים האחרונות) בשתי הסביבות, השאלה מה יותר נכון לפרוייקט. אפשר כמובן לפתח ממשק ב- Delphi ולהפעיל משם את כל ה- API הנדרשים וגם לכתוב DLL בשפת C ולהפעיל אותו בדלפי (את זה קראתי עוד לא יישמתי – נראה לי שסקייפ עושים משהו דומה). בשורה התחתונה יוצא שיש מוצר עובד כמו שצריך, שיצא בזמן סביר וגם נהנים מהעבודה. מה שכן אני יודע שהרבה מאוד תוכנות, כמו דפדפנים למשל, נכתבים ב- ++C עם ספריות מתאימות כמו QT, GTK והתוצאה לא רעה בכלל (חוץ מה- FF שנתקע לי אחת ליומים עם בעיות הזיכרון שלו…, אבל אני לא אחליף אותו אלא יעבור לגרסה 4, רק כדי לא לעבוד עם גוגל, אני גם אנסה את XP 9 החדש של מיקרוסופט). מה שיוצר התלבטויות במה לבחור ++C או דלפי.

        1. ik_5 מאת

          יש לך גם דפדפנים שכתובים בפסקל, לפחות כאלו שמנתחים HTML ו CSS.
          למשל הנה מימוש מלא של EmcaScript 5 שכתוב בפסקל:
          http://besen.sourceforge.net/

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

  4. פינגבק: צפייה ברשימה « לראות שונה

  5. פינגבק: צפייה בעץ חלק שני | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s