דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. הרצת פונקציה מטפלת בארוע

הרצת פונקציה מטפלת בארוע

מתוזמן נעוץ נעול הועבר ארכיון code613m
12 פוסטים 3 כותבים 638 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #1

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

    פורסם במקור בפורום CODE613 ב23/02/2014 20:04 (+02:00)

    תגובה 1 תגובה אחרונה
    0
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #2

      אולי מישהו יכול לתת מידע איך נושא הארועים עובד?
      האם דרך הרפלקציה אפשר לדעת כל אובייקט שיש לו ארועים מה אוסף הפונקציות שמטפלות בכל ארוע?

      פורסם במקור בפורום CODE613 ב06/03/2014 12:26 (+02:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #3

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

        ההגבלה שתוקעת אותך כאן, זה העובדה שאירוע מוגן מפני גישה למתודות שנרשמו אליו, לעניין הסרתם/הפעלתם/קבלת שמותיהם.
        בעוד שבDelegate רגיל כתיבת שמו מפעילה את כל הפונקציות שנרשמו אליו, באירוע יש לך גישה לפונקציות רק אם אתה במחלקה שהכריזה על האירוע (ע"י שמו ובVB ע"י RaiseEvent). כמו"כ אתה יכול לעבור על הרשימה של המתודות וכו'. אבל מחוץ למחלקה שמכריזה על האירוע, אתה יכול להוסיף מתודות, ולהסיר את אותם מתודות שהוספת, ולא יותר.

        תכל'ס לענינך, אם המקרה הוא פקד של WPF ישנה אפשרות כזאת:

        ButtonInstance.RaiseEvent(New RoutedEventArgs(Primitives.ButtonBase.ClickEvent))
        

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

        פורסם במקור בפורום CODE613 ב06/03/2014 18:56 (+02:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        2
        • רחמיםר מנותק
          רחמיםר מנותק
          רחמים מורחק
          כתב ב נערך לאחרונה על ידי
          #4

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

          פורסם במקור בפורום CODE613 ב06/03/2014 20:41 (+02:00)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

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

            עכ"פ, בתור מפתח המחלקה אתה יכול לגשת לרשימת הנרשמים לאירוע ככה

            ClickEvent.GetInvocationList()
            

            כאשר הClick זה שם האירוע והתוספת Event היא לפנות לשדה דלגייט נסתר שהקומפיילר יוצר מאחורי הקלעים.
            ואגב, בגלל ל"מאחורי הקלעים" הזה יש עלות מסויימת בזיכרון, שאיננה בC#. בשביל למנוע את זה במקרה נצרך (ריבוי משמעותי של אירועים שבד"כ לא נרשמים אליהם) יש תחביר מיוחד בשם Custom Event הנה פרטים עליו: http://msdn.microsoft.com/en-us/library/yt1k2w4e.aspx

            פורסם במקור בפורום CODE613 ב06/03/2014 21:49 (+02:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #6

              @דוד ל.ט.

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

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

              @דוד ל.ט.

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

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

              פורסם במקור בפורום CODE613 ב06/03/2014 22:36 (+02:00)

              תגובה 1 תגובה אחרונה
              0
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #7

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

                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)

                תגובה 1 תגובה אחרונה
                0
                • clickoneC מנותק
                  clickoneC מנותק
                  clickone
                  כתב ב נערך לאחרונה על ידי
                  #8

                  אם מה שאתה רוצה זה לממש כל אירוע, אז הדרך היחידה שלך זה רפלקציה (זה לפחות מה שאני יודע, ויכול להיות שאני טועה), אבל אם זה רק קליק, ורק אתה לא יודע (בזמן כתיבת הקוד) מה האובייקט שעליו אתה צריך להפעיל את הקליק נסה להשתמש ב 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)

                  אין טסט כמו פרודקשן.

                  המייל שלי urivpn@gmail.com

                  תגובה 1 תגובה אחרונה
                  1
                  • רחמיםר מנותק
                    רחמיםר מנותק
                    רחמים מורחק
                    כתב ב נערך לאחרונה על ידי
                    #9

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

                    1. הוא שייך רק בלחצנים של System.Windows.Forms.Button ולא בלחצנים של Microsoft.Office.Tools.Ribbon.RibbonButton
                    2. אם הטופס לא מוצג פקודת PerformClick לא תעשה כלום.

                    פורסם במקור בפורום CODE613 ב09/03/2014 08:22 (+02:00)

                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @דוד ל.ט.

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

                      @רחמים

                      במקרה שלי מפתח המחלקה הוא אני 🙂

                      @רחמים

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

                      @רחמים

                      הוא שייך רק בלחצנים של System.Windows.Forms.Button ולא בלחצנים של Microsoft.Office.Tools.Ribbon.RibbonButton

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

                      • על זה עניתי לך שא"א, אלא אם כן אתה הוא מפתח הכפתור, או שמפתח הכפתור עשה לך את הטובה הזו כמו במקרה של WPF/WinForms.
                        ** א. אתה רוצה את הרשימה הזו גם כשהיא איננה קיימת... הרי פונקציות מאזינות לאירוע של מופע, ופה אתה מדבר על רשימה מופשטת שכפי שאמרת לא תמיד קיימת בפועל (אם הכפתור לא מוצג, המחלקה שלו לא קיימת). ב. אינך יודע באיזו טכניקה השתמשו בהאזנה לאירועים, אתה מניח שזה בדרך הדוטנטית שאתה מכיר, וזה ממש לא מוכרח. ג. גם בדוט נט, לא בהכרח שהפוקנציה המאזינה היא המבוקשת, יכול להיות (ובטוח לדעתי במקרה זה) שהיא רק נתבית - מקבלת את האירוע ולפי מזהה השולח מחליטה מה הלאה.

                      פורסם במקור בפורום CODE613 ב09/03/2014 11:49 (+02:00)

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      2
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים מורחק
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @דוד ל.ט.

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

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

                        פורסם במקור בפורום CODE613 ב09/03/2014 13:07 (+02:00)

                        תגובה 1 תגובה אחרונה
                        0
                        • רחמיםר מנותק
                          רחמיםר מנותק
                          רחמים מורחק
                          כתב ב נערך לאחרונה על ידי
                          #12

                          @דוד ל.ט.

                          עדיף שתגיד מה אתה צריך בצורה הכי ישירה (לא בהודעה שלישית) ולא לשאול על דרך תיאורטית שאולי תפתור לך את הבעיה.

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

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

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

                          @דוד ל.ט.

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

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

                          @דוד ל.ט.

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

                          איזה טכניקות יש בזה?
                          @דוד ל.ט.

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

                          למה אתה קורא פונקציה מאזינה? ומה זה נתבית ?

                          פורסם במקור בפורום CODE613 ב09/03/2014 13:40 (+02:00)

                          תגובה 1 תגובה אחרונה
                          0

                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום