Zeliran

New member
גלעד-גלעד-גלעד

טוב שחזרת, בדיוק בזמן.. אני לא יודע איך שרדתי כאן.. האמתי, לא שרדתי, ובגלל זה בעצם אני כותב את ההודעה הזאת..
יש לי מחלקה שבה יש לי שני פונקציות. אחת לשמירת TreeView והשניה לטעינת TreeView (הן משתמש ב serializaiton) המחלקה עובדת מצויין. הבעיה היא שאם אני נמצא בטופס אחד שאין בו TreeView, ואני רוצה לפנות לפונקציה שתשמור\תטען עץ שנמצא בטופס אחר.. איך אני אמור לגשת לפונקציה? **הערה** הפונקציה מקבלת שני פרמטרים. הראשון הוא ה TreeView שצריך לשמור\לטעון והשני הוא שם הקובץ שאליו צריך לשמור או ממנו לטעון.. תודה תודה תודה
 

Afik17

New member
Tree Tree Tree

מצטער שאני לא יכול לעזור לך, אבל עד שמישהו יציל אותך, אפשר לשאול אותך 2 דברים באותו הקשר בבקשה ?
1. מה הכוונה "הם משתמשות ב Serialization ? מה זה בדיוק, וכיצד זה עוזר לך ? 2. תוכל להעיף מבט כאן בבקשה ?
תודה איש יקר.
 

Zeliran

New member
אהה..

serializaiton היא דרך לשמירת מחלקות, אובייקטים ושאר ירקות.. אני משתמש בה כדי לשמור נתונים של TreeView ובקשר לשאלתך, אני לא משתמש ב asp.net, וגם לא ממש יצא לי להשתמש בפרופרטי הזה.. ככה שאני לא ממש מכיר אותו..
 

Afik17

New member
בהההה

במה אתה כותב ? Window.Forms ? קראתי ב MSDN על serialization קצת, לא ממש הבנתי, אתה יכול לפרט קצת ? מה הכוונה "שמירת מחלקות ואובייקטים", מה בדיוק אתה שומר ?
 

Zeliran

New member
אווווווווו

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

Afik17

New member
איייייייי

אז בעצם Serialize למחלקה זה שמירתה בצורה בינארית, עם כל נתוניה. בדיוק כמו לשמור נתונים בקובץ, פשוט בצורה יותר נוחה
זה שמושי בכלל ?!
 

Zeliran

New member
לא רק..

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

Zeliran

New member
אז זהו... שלא

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

Zeliran

New member
../images/Emo3.gif ../images/Emo3.gif

אני מניח שהפורום הזה תומך בקוד פתוח..
טוב.. אני לא בטוח לאיזה חלק מהקוד התכוונת, אז א ני פשוט אשלח את הכל..
טוב, אז זה המחלקה עם הפונקציות לשמירת\טעינת העץ
using System; using System.Collections; using System.Windows.Forms; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace Rush_Hour { public class LoadSaveTree { #region Save (saveTree, saveNode) /// <param name="tree"></param> /// <param name="filename"></param> public static int saveTree(TreeView tree, string filename) { ArrayList al = new ArrayList(); foreach (TreeNode tn in tree.Nodes) { saveNode(tn, al); } Stream file = File.Open(filename, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); try { bf.Serialize(file, al); } catch (System.Runtime.Serialization.SerializationException e) { MessageBox.Show("Serialization failed : {0}", e.Message); return -1; } file.Close(); return 0; } /// <param name="tn"></param> /// <param name="al"></param> private static void saveNode(TreeNode tn, ArrayList al) { Hashtable ht = new Hashtable(); ht.Add("Tag", tn.Tag); ht.Add("Text", (object)tn.Text); ht.Add("FullPath", (object)tn.FullPath); ht.Add("SelectedImageIndex", (object)tn.SelectedImageIndex); ht.Add("ImageIndex", (object)tn.ImageIndex); al.Add((object)ht); foreach (TreeNode n in tn.Nodes) { saveNode(n, al); } } #endregion #region Load (loadTree, searchNode) /// <param name="tree"></param> /// <param name="filename"></param> public static int loadTree(TreeView tree, string filename) { if (File.Exists(filename)) { Stream file = File.Open(filename, FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); object obj = null; try { obj = bf.Deserialize(file); } catch (System.Runtime.Serialization.SerializationException e) { MessageBox.Show("De-Serialization failed : {0}", e.Message); return -1; } file.Close(); ArrayList alist = obj as ArrayList; foreach (object item in alist) { Hashtable ht = item as Hashtable; TreeNode tn = new TreeNode(ht["Text"].ToString()); tn.Tag = ht["Tag"]; &nbs​
 

Zeliran

New member
המשך..

טוב.. בכל מקרה המחלקה נמשכת, ויש את הפנציות saveTree ו LoadTree חוץ מזה, יש לי מחלקה נפרדת שבתוכה יש אובייקט TreeView שהוא מכיל את כל ה nodes שאמורים להיות בעץ.. בטופס אחר, אני מכניס nodes לאובייקט עץ שבמחלקה האחרת.. אז אחרי שהוספתי את ה node אני רוצה לשמור את כל ה nodes בעזרת הפונקציה לשמירת עץ, רעיונות?
 

Zeliran

New member
לאיזה קוד התכוונת?

סליחה, אבל ממש לא ידעתי לאיזה קטע התכוונת.. כי בעצם אני לא ממש מקבל הודעת שגיאה.. אני פשוט.. לא יודע מה לעשות
אבל ננסה.. יש לי טופס שבו יש TextBox, כשאני לוחת על אישור, הטקסט שנמצא ב textBox נכנס לרשימת ה nodes שבאובייקט TreeView שנמצא במחלקה אחרת.. אחר כך אני שומר את הרשימה וטוען מחדש.. משהו כזה:
clsNodes.tree.Nodes.Add (txtName.Text); frmTree ft = new frmTree(); LoadSaveTree.saveTree(clsNodes.tree, "classes.dat"); LoadSaveTree.loadTree(((frmTree)this.Parent).treeView, "classes.dat"); ft.Dispose(); this.Close();​
מקווה שיותר ברור.. צריך עוד משהו?
 

Zeliran

New member
תיקון

התבלבלתי קצת.. אני דווקא כן מצליח לשמור את העץ.. אבל אחרי זה כשאנה מנסה לטעון מחדש את העץ (השתמשתי ב owner כמו שאתה יכול לראות) אז אני מקבל את הודעת השגיאה:
Additional information: Object reference not set to an instance of an object.​
אבל כשאני מפעיל את התוכנית מחדש, (בקונסטרקטור של הטופס עם העץ יש פקודה שקוראת לפנקציה לטעינת העת..) אז כל ה nodes נטענים ללא בעיה.. מצטער של פרטתי טוב..
 

Zeliran

New member
אז מה אומרים?

את יודע מה הבעיה אולי? או שאני די אבוד בקטע הזה?
 

nattygur

New member
אם תשלח דוגמה קטנה ועובדת

חוץ מהבעיה, כמובן. אני בפנים (כלומר עוזר).
 

nattygur

New member
אפליקציה קטנה אשר שומרת Tree

ןמנסה לשחזר אותו. שני מסכים ומחלקה אחת.
 

Zeliran

New member
טוב.. אז הנה

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