כאשר מבצעים תכנות גרפי (וויזואלי), הרבה פעמים אנחנו מוצאים את עצמנו צריכים ליצור היררכיה כלשהי בצורת עץ של מידע.
לשם כך נוצר פקד מאוד מוכר בשם TreeView אשר לפחות ב GTK הוא גם הבסיס לכל שאר הרכיבים מבוססי הרשימות למינהם. התפקיד של הרכיב הוא לקחת רשימה של עצמים ולהציג אותם, כאשר עצמים מסויימים יכולים גם להציג בנים שונים, ואפילו תמונות שונות בהתאם לצורך.
בלזרוס ודלפי הפקד נקרא 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;
וזו הגישה הפשוטה ועם פחות העצמה שיש לעבודה בעצים. בחלק הבא נכיר עוד פקד לעצים הקיים ללזרוס ודלפי שהוא עם הרבה יותר עצמה ויותר מעניין.
ידוע לך אולי על דרך לגרום לרכיב שכזה להציג את העץ מימין לשמאל? זאת אומרת, בלי לשכתב את כל הקוד שלו?
לצערי לא, אבל מעולם לא ניסיתי עד לשאלה שלך את bidimode ואנסה לפחות ב GTK ו Qt לפתור את זה. אני לא יודע אם בWindows זה נתמך כבר או לא.
תודה. TTreeView הוא רכיב ממשק כל כך שימושי ונוח עבור יישומים מסוימים, שזה פשוט פשע שאי אפשר להשתמש בו בעברית כמו שצריך (אני חושב שגם בדלפי XE החדש האופציה לא קיימת).
לפי הכתוב בוויקי שלהם אין תמיכה לזה (להבדיל מתמיכה בטולקיט ספציפי):
http://wiki.lazarus.freepascal.org/BidiMode
לא אהבתי את ה-API: שתי מתודות להוספה, באופן אישי מעדיף שמוסיפים ילדים ל-node האב ולא דרך אובייקט העץ. נראה מה יהיה עם הפקד השני 🙂
איך אני אוהב את המשפטי םשל "אם היה איקס אז זה היה יותר טוב", בייחוד מאנשים שלא יתרמו כלום לדבר הזה, אבל יש להם רעיון איך הדברים יהיו טובים יותר.
דבר ראשון אני יודע על 3 אנשים שעובדים על דו כיווניות, אני זאהר וג'וחה, כך שאם זה לא נתמך "אצלהם", אז יש לך 3 אנשים שכנראה יטפלו בזה (לפחות אחד מהם). דבר שני, נראה אותך מתכנן מערכת API שלא רק תואמת לדלפי, אלא גם יודעת להתמודד עם כל השגעונות של מגוון אין סופי של מערכות גרפיות שכל אחת הולכת לכיוון אחר לגמרי. זה לא דבר כזה פשוט וכל מימוש צריך לקחת בחשבון המון גורמים. אני כבר כמה שנים מתעסק עם הקוד של LCL ואני עדיין לפעמים לא מבין עד כמה זה מסובך עד שאני מגיע לממש את הדברים, ועוד צריך לחשוב גם על כמות הביטים שאתה תומך בה, ואיך אתה יוצר התנהגות אחידה בכולם.
כבר אמרתי שמטרת התאימות שלהם לדלפי כובלת את התפרוייקט במקום לתת לו להמריא. אני מבין שזה הרצון של בעילי הפרוייקט, אך החלטה תמוהה לדעתי (במיוחד בימינו אנו, כל כך הרבה שנים אחרי השיא של דלפי) וכמובן שאפשר להעביר ביקורת.
בכל מקרה דיברתי על תכנון ה-API של העץ, BiDi סביר בכל הרכיבים נראה אבוד, ומשאבים שגם כך מוגבלים לא אשקיע בכך.
לא קשור ישירות לנושא , אבל מצחיק שדווקא ++ Dev C נכתבה ב- delphi…
http://www.bloodshed.net/devcpp.html
http://en.wikipedia.org/wiki/Dev-C%2B%2B
למה לא ב- ++C / C ?
לפי מחקרים שאני עושה ברשת לאחרונה, בעקבות רצון לפתח תוכנת חלונות כלשהי, אני מוצא שדלפי עדיין חיי וקיים ועם יתרונות לא מעטים מול #C למשל, ועם חסרונות כמובן כמו העובדה שלא מעט עוברים ל- #C … (דרישת השוק כנראה – צריך להתפרנס)
לגבי עברית, בסיס המשתמשים כל כך קטן כנראה שלא כדאי להשקיע בזה.
זה לא רק העברית, והשפה כן חשובה.
העצוב הוא, שכל התכונות שהיו לדלפי לפני 15 שנה, נכנסו רק לאחרונה ל #C מבחינת יכולות עבודה וזה לא מפריע לאנשים להגיד ש #C היא הסביבה הכי טובה לפיתוח, למרות שגם דלפי התקדמה מאז הרבה מאוד…
העולם לא בודק דברים בצורה רציונאלית, אלא לגבי באז ומכירות. אתמול הזכרתי שהתעסקתי בדלפי בכנס בנושא אסטריסק. ואז הזכרתי שאני תורם קוד לפרוייקט בשם לזרוס שמשתמש ב FPC שזה FreePascal Compiler והתשובה היתה "אף אחד לא מתעסק בפסקל, אבל דלפי זו הסביבה הכי טובה לפתח מערכות בווינדוז גם כיום".
התשובה היתה מעט שונה, אבל יש הפרדה בין דלפי לפסקל אצל הרבה אנשים.
ד"א למה לא כתבו את Dev-C++ ב ++C ? כי קל יותר לעשות את זה בפסקל מאשר ב ++C.
יותר קל לפתח בדלפי מאשר ב- ++C – זה נכון, מנסיון (לא בשנים האחרונות) בשתי הסביבות, השאלה מה יותר נכון לפרוייקט. אפשר כמובן לפתח ממשק ב- Delphi ולהפעיל משם את כל ה- API הנדרשים וגם לכתוב DLL בשפת C ולהפעיל אותו בדלפי (את זה קראתי עוד לא יישמתי – נראה לי שסקייפ עושים משהו דומה). בשורה התחתונה יוצא שיש מוצר עובד כמו שצריך, שיצא בזמן סביר וגם נהנים מהעבודה. מה שכן אני יודע שהרבה מאוד תוכנות, כמו דפדפנים למשל, נכתבים ב- ++C עם ספריות מתאימות כמו QT, GTK והתוצאה לא רעה בכלל (חוץ מה- FF שנתקע לי אחת ליומים עם בעיות הזיכרון שלו…, אבל אני לא אחליף אותו אלא יעבור לגרסה 4, רק כדי לא לעבוד עם גוגל, אני גם אנסה את XP 9 החדש של מיקרוסופט). מה שיוצר התלבטויות במה לבחור ++C או דלפי.
יש לך גם דפדפנים שכתובים בפסקל, לפחות כאלו שמנתחים HTML ו CSS.
למשל הנה מימוש מלא של EmcaScript 5 שכתוב בפסקל:
http://besen.sourceforge.net/
ניסיתי אותו והוא עובד ממש יפה עם קוד JS שכתבתי. אנשים והשוק בכלל לא בוחר מה שטוב הוא בוחר מה שנמכר טוב יותר. זו הסיבה גם שקונים לך איפון, ואיפאד וכו'
ושמעתי ממקורות יודעי דבר שהסיבה היחידה שn900 לא נמכר בארץ הוא בגלל שהחברות סלולריות פחדו שהוא יפגע במכירות של איפון באות הזמן, אז הם יצרו קואליציה ממש חזקה נגד היבוא שלו.
פינגבק: צפייה ברשימה « לראות שונה
פינגבק: צפייה בעץ חלק שני | לראות שונה