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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. תעלומה ב VB.NET - שגרת אירוע שרצה על דעת עצמה...

תעלומה ב VB.NET - שגרת אירוע שרצה על דעת עצמה...

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

    בס"ד

    שלום וברכה לכל החברים היקרים!
    אקדים ואומר, שאלתי היא רק לצורך ההבנה העקרונית - איך זה קורה. איך "לעקוף" בקלות את "הבעייה" אני יודע לבד.

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

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

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

    אלא, שבגלל ריבוי הטסקטבוקסים, כמו גם הרצון "לעבוד נקי", לא כתבתי לשגרה זו Handles עבור כל טקסט בוקס - ידנית,
    אלא כתבתי את שגרת KeyPressed בלי שום Handles שמעיר אותה, ובמקום זה בעליית התוכנה רשמתי את השורה הבאה:

    Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            HandleKeyPress(Me)
    End Sub
    

    שבעצם קוראת לשגרה קטנה נוספת שהכנתי:

    Private Sub HandleKeyPress(container As Control)
            For Each ctrl As Control In container.Controls
                If TypeOf (ctrl) Is TextBox Then AddHandler ctrl.KeyPress, AddressOf KeyPressed
                HandleKeyPress(ctrl)
            Next
    End Sub
    

    עד כאן הכל עבד נפלא!
    אלא שחלה תפנית בעלילה כאשר הייתי צריך להוסיף לתוכנה גם פקדים מסוג NumericUpDown לצורך נושא עיגול סכומים.
    ואז שמתי לב שכאשר אני כותב ידנית בתוך תיבת ה NumericUpDown, השגרה של KeyPressed נכנסת לפעולה למורת רוחי,
    וזה למרות שאין לשגרת KeyPressed שום Handles בכלל, ומי ששולח אליה זה רק ה AddHandler מהדלקת התוכנה, והוא הרי מוגדר רק: "If TypeOf (ctrl) Is TextBox".

    רק אציין, שלשם הבדיקה, הוספתי ל If המדובר שורה נוספת שתוציא לי את השם של הפקד שכעת מטופל ב For Each, ולמותר לציין שה-NumericUpDown לא היה בין הפקדים שטופלו ע"י ה If הזה.

    אז רבש"ע, איך השגרה הזו מופעלת? מי קורא לה?
    תודה רבה!

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

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

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

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

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

        אתה מריץ את הלולאה רקורסיבית על כל פקד.
        לפקד NumericUpDown יש במאפיין Controls שתי פקדים, מהסוגים UpDownButtons, וUpDownEdit, האחרון יורש מTextBox.
        כדי להגיע רק לTextBox ולא ליורשים ממנו יש להשתמש בהשוואה ממש ככה:

         If ctrl.GetType() = GetType(TextBox) Then
        

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

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

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

          @dovid , צדקת! (כמו תמיד...)
          ולכאורה זאת גם ההשערה ש @clickone העלה.

          אגב, יש דרך בפורום לסמן נושא כ"Answered"?

          dovidD clickoneC 2 תגובות תגובה אחרונה
          1
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            השיב לאיש אחד ב נערך לאחרונה על ידי
            #5

            @איש-אחד אמר בתעלומה ב VB.NET - שגרת אירוע שרצה על דעת עצמה...:

            @dovid , צדקת!

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

            אגב, יש דרך בפורום לסמן נושא כ"Answered"?

            לא.

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

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

            תגובה 1 תגובה אחרונה
            2
            • clickoneC מנותק
              clickoneC מנותק
              clickone
              השיב לאיש אחד ב נערך לאחרונה על ידי
              #6

              @איש-אחד אמר בתעלומה ב VB.NET - שגרת אירוע שרצה על דעת עצמה...:

              @dovid , צדקת! (כמו תמיד...)

              אם ככה איך זה לא יצא לך בתוך הIF?

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

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

              dovidD תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לclickone ב נערך לאחרונה על ידי
                #7

                @clickone אמר ב[תעלומה ב VB.NET - שגרת אירוע שרצה על דעת עצמה...]

                אם ככה איך זה לא יצא לך בתוך הIF?

                כי הוא בדק אם הNumeric יותר והוא אכן לא, כי הוא אישית לא יורש TextBox אבל בנו כן.

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

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

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

                  @איש-אחד !!
                  NumericUpDown מתאים מפורש גם לשברים! ולכן ה Value הוא מסוג double.
                  חפש במאפיינים שלו כמה נקודות אחרי האפס יהיו.
                  (לא נעים, אבל גם לי היתה תוכנה שכבר רצה אצל כמה לקוחות, עד שעשיתי עדכון לעניין הזה).

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

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

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

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