הרצת פונקציה מטפלת בארוע
-
אירוע זה Delegate עם כמה הגבלות קטנות (שכאן בדיוק עומדות לרעתך...).
איך זה עובד כתבתי פעם במדריך.ההגבלה שתוקעת אותך כאן, זה העובדה שאירוע מוגן מפני גישה למתודות שנרשמו אליו, לעניין הסרתם/הפעלתם/קבלת שמותיהם.
בעוד שבDelegate רגיל כתיבת שמו מפעילה את כל הפונקציות שנרשמו אליו, באירוע יש לך גישה לפונקציות רק אם אתה במחלקה שהכריזה על האירוע (ע"י שמו ובVB ע"י RaiseEvent). כמו"כ אתה יכול לעבור על הרשימה של המתודות וכו'. אבל מחוץ למחלקה שמכריזה על האירוע, אתה יכול להוסיף מתודות, ולהסיר את אותם מתודות שהוספת, ולא יותר.תכל'ס לענינך, אם המקרה הוא פקד של WPF ישנה אפשרות כזאת:
ButtonInstance.RaiseEvent(New RoutedEventArgs(Primitives.ButtonBase.ClickEvent))
אז למה כל ההקדמה? כדי להדגיש שבלי עזרה ממפתח המחלקה אין אפשרות כזו (בלי להיכנס לreflection, זה כבר אני לא יודע אבל כמעט בטוח שגם שם א"א).
פורסם במקור בפורום CODE613 ב06/03/2014 18:56 (+02:00)
-
תודה,
במקרה שלי מפתח המחלקה הוא אני
העינין הוא כזה, יש לי הרבה סרגלים של תוספים לוורד, וכעת אני מנסה לפתח תוסף שיהיה אפשר להגדיר איתו קיצורי מקשים במקלדת עבור פקודות שיש בסרגלים, בשביל זה אני רוצה לעבור בלולאה על כל הלחצנים שבכל הסרגלים ולהציג למשתמש רשימה של לחצנים ושיבחר קיצורי מקש עבור לחצנים שיבחר, אחר כך ע''י קוד שהעלתי לכאן לא מזמן אני 'תופס' את הלחיצות של המקלדת ואני יודע שהגיע הזמן להפעיל את הפקודה שלחצן מסויים מפעיל בעת לחיצה, ובשביל זה אני צריך לדעת איזה פונקציה רשומה לטפל בארוע לחיצה של אותו לחצן.
יש רעיונות לנסיבות אלו?פורסם במקור בפורום CODE613 ב06/03/2014 20:41 (+02:00)
-
לא בטוח שלגמרי הבנתי.
הרי ברור שאתה שומר את כל המידע להפעלה הבאה של האפליקציה, וממילא אתה מחזיק את הרשימה במקום אחד מאשר באירוע.עכ"פ, בתור מפתח המחלקה אתה יכול לגשת לרשימת הנרשמים לאירוע ככה
ClickEvent.GetInvocationList()
כאשר הClick זה שם האירוע והתוספת Event היא לפנות לשדה דלגייט נסתר שהקומפיילר יוצר מאחורי הקלעים.
ואגב, בגלל ל"מאחורי הקלעים" הזה יש עלות מסויימת בזיכרון, שאיננה בC#. בשביל למנוע את זה במקרה נצרך (ריבוי משמעותי של אירועים שבד"כ לא נרשמים אליהם) יש תחביר מיוחד בשם Custom Event הנה פרטים עליו: http://msdn.microsoft.com/en-us/library/yt1k2w4e.aspxפורסם במקור בפורום CODE613 ב06/03/2014 21:49 (+02:00)
-
@דוד ל.ט.
לא בטוח שלגמרי הבנתי.
הרי ברור שאתה שומר את כל המידע להפעלה הבאה של האפליקציה, וממילא אתה מחזיק את הרשימה במקום אחד מאשר באירוע.אני שומר בקובץ טקסט פשוט את שם הלחצן ושם הסרגל שאליו הוא שייך ומה קיצור מקשים שבחר המשתמש
אבל כדי להגיב ללחיצת המשתמש על קיצור המקשים אני צריך להפעיל את אותה הפונקציה שמטפלת בארוע קליק של אותו לחצן
וזה העינין שאני עובר בלולאה על כל הסרגלים ועל כל הלחצנים שלהם אבל את הפונקציות המטפלות אני לא יודע איך לקבל.@דוד ל.ט.
כאשר הClick זה שם האירוע והתוספת Event היא לפנות לשדה דלגייט נסתר שהקומפיילר יוצר מאחורי הקלעים.
לא הצלחתי ליישם את זה, אני מדבר על ארוע קליק שמגיע מוכן עם הלחצן גם אתה מתכוון לזה או לארוע שאני בעצמי יוצר?
פורסם במקור בפורום CODE613 ב06/03/2014 22:36 (+02:00)
-
ראיתי ברפלקטור דבר מעניין והוא שעבור כל לחצן המהדר יוצר מאפיין שרושם את הפונקציה לטיפול בארוע וזה נראה כך:
internal virtual RibbonButton Button1 { [DebuggerNonUserCode] get { return this._Button1; } [DebuggerNonUserCode] [MethodImpl(MethodImplOptions.Synchronized)] set { RibbonControlEventHandler value2 = new RibbonControlEventHandler(this.Button1_Click); bool flag = this._Button1 != null; if (flag) { this._Button1.Click -= value2; } this._Button1 = value; flag = (this._Button1 != null); if (flag) { this._Button1.Click += value2; } } }
פורסם במקור בפורום CODE613 ב08/03/2014 19:54 (+02:00)
-
אם מה שאתה רוצה זה לממש כל אירוע, אז הדרך היחידה שלך זה רפלקציה (זה לפחות מה שאני יודע, ויכול להיות שאני טועה), אבל אם זה רק קליק, ורק אתה לא יודע (בזמן כתיבת הקוד) מה האובייקט שעליו אתה צריך להפעיל את הקליק נסה להשתמש ב PerformClick(), הוא מיועד בשביל זה.
לדוגמא:
נגיד שאתה יודע שלכפתור קוראים Btn אתה יכול להשתמש ככה:Dim BtnName As String = "Btn" ' תכניס למשתנה מהקובץ איך קוראים לפקד Dim btn As System.Windows.Forms.Button btn = Me.Controls(BtnName) btn.PerformClick()
פורסם במקור בפורום CODE613 ב09/03/2014 00:47 (+02:00)
-
בפרוייקט הנוכחי אני צריך לממש רק את ארוע קליק, ולזה באמת הפתרון שהבאת הוא מצויין אלא שיש בו שתי מגבלות:
- הוא שייך רק בלחצנים של System.Windows.Forms.Button ולא בלחצנים של Microsoft.Office.Tools.Ribbon.RibbonButton
- אם הטופס לא מוצג פקודת PerformClick לא תעשה כלום.
פורסם במקור בפורום CODE613 ב09/03/2014 08:22 (+02:00)
-
@דוד ל.ט.
שבלי עזרה ממפתח המחלקה אין אפשרות כזו
במקרה שלי מפתח המחלקה הוא אני
אני מדבר על ארוע קליק שמגיע מוכן עם הלחצן גם אתה מתכוון לזה או לארוע שאני בעצמי יוצר?
הוא שייך רק בלחצנים של System.Windows.Forms.Button ולא בלחצנים של Microsoft.Office.Tools.Ribbon.RibbonButton
ממש נחמד ככה לשוחח..
אם אתה רוצה עזרה, תפרט, ותקרא היטב מה שכותבים לך.
אני הבנתי כעת מה אתה רוצה, ואני לא יודע איך עשים זאת אך אכן בטוח שזה אפשרי. מסתבר מאו שיש מקום בו רשומים הלחצנים המוגדרים להצגה והפקודות שהם מפעילים. אבל אתה חכם, לא שאלת אפי' אם יש כזה מקום, אלא האם אפשר להפעיל פונקציות שרשומות לאירוע הכפתור*. כשתתבונן בשאלתך תבין עד כמה היא בנויה על הנחות**, עדיף שתגיד מה אתה צריך בצורה הכי ישירה (לא בהודעה שלישית) ולא לשאול על דרך תיאורטית שאולי תפתור לך את הבעיה.- על זה עניתי לך שא"א, אלא אם כן אתה הוא מפתח הכפתור, או שמפתח הכפתור עשה לך את הטובה הזו כמו במקרה של WPF/WinForms.
** א. אתה רוצה את הרשימה הזו גם כשהיא איננה קיימת... הרי פונקציות מאזינות לאירוע של מופע, ופה אתה מדבר על רשימה מופשטת שכפי שאמרת לא תמיד קיימת בפועל (אם הכפתור לא מוצג, המחלקה שלו לא קיימת). ב. אינך יודע באיזו טכניקה השתמשו בהאזנה לאירועים, אתה מניח שזה בדרך הדוטנטית שאתה מכיר, וזה ממש לא מוכרח. ג. גם בדוט נט, לא בהכרח שהפוקנציה המאזינה היא המבוקשת, יכול להיות (ובטוח לדעתי במקרה זה) שהיא רק נתבית - מקבלת את האירוע ולפי מזהה השולח מחליטה מה הלאה.
פורסם במקור בפורום CODE613 ב09/03/2014 11:49 (+02:00)
- על זה עניתי לך שא"א, אלא אם כן אתה הוא מפתח הכפתור, או שמפתח הכפתור עשה לך את הטובה הזו כמו במקרה של WPF/WinForms.
-
@דוד ל.ט.
שבלי עזרה ממפתח המחלקה אין אפשרות כזו
אה, התכוונת למפתח המחלקה של הלחצן, אני חשבתי שאתה מדבר על מפתח המחלקה של הסרגל או הטופס שמכיל את הלחצן.
בכל מקרה אני מנסה כעת ללכת על כיון של רפלקציה מצאתי כאן משהו מאוד נחמד, שיכול לתת לי את הקוד שרושם פונקציה לטיפול בארוע שזה בעצם הקוד שהעלתי לעיל מהרפלקטר.פורסם במקור בפורום CODE613 ב09/03/2014 13:07 (+02:00)
-
@דוד ל.ט.
עדיף שתגיד מה אתה צריך בצורה הכי ישירה (לא בהודעה שלישית) ולא לשאול על דרך תיאורטית שאולי תפתור לך את הבעיה.
אני העדפתי ללמוד על נושא רישום פונקציות לארועים בצורה מקיפה יותר אבל לאחר שהתברר כמו שאמרת: @דוד ל.ט.
אירוע מוגן מפני גישה למתודות שנרשמו אליו, לעניין הסרתם/הפעלתם/קבלת שמותיהם.
אז הצגתי את הבעיה הנקודתי עם הפרוייקט העכשיו שאולי לפחות נגיע לאיזה פתרון מקומי.
@דוד ל.ט.
א. אתה רוצה את הרשימה הזו גם כשהיא איננה קיימת... הרי פונקציות מאזינות לאירוע של מופע, ופה אתה מדבר על רשימה מופשטת שכפי שאמרת לא תמיד קיימת בפועל (אם הכפתור לא מוצג, המחלקה שלו לא קיימת).
אני רוצה לציין שהפקודה PerformClick לא עובדת גם כאשר יש מופע של טופס בזיכרון אלא שלא קראת לפקודה Show וממילא הטופס לא מופיע על המסך.
דבר שני בדרך הרפלקציה אני פשוט קורא את הקוד ושם יש את הרשימה הזו תמיד.@דוד ל.ט.
ב. אינך יודע באיזו טכניקה השתמשו בהאזנה לאירועים, אתה מניח שזה בדרך הדוטנטית שאתה מכיר, וזה ממש לא מוכרח.
איזה טכניקות יש בזה?
@דוד ל.ט.ג. גם בדוט נט, לא בהכרח שהפוקנציה המאזינה היא המבוקשת, יכול להיות (ובטוח לדעתי במקרה זה) שהיא רק נתבית - מקבלת את האירוע ולפי מזהה השולח מחליטה מה הלאה.
למה אתה קורא פונקציה מאזינה? ומה זה נתבית ?
פורסם במקור בפורום CODE613 ב09/03/2014 13:40 (+02:00)