Το Vb. Net Sender και e Parameters Event

Στο VB6, μια υπορουτίνα συμβάντων, όπως το Button1_Click, ήταν πολύ λιγότερο περίπλοκη επειδή το σύστημα ονομάζεται υπορουτίνα αυστηρά με το όνομα. Εάν υπήρχε ένα συμβάν Button1_Click, το σύστημα το ονόμασε. Είναι άμεση και απλή.

Αλλά στο VB.NET, υπάρχουν δύο σημαντικές αναβαθμίσεις που κάνουν VB.NET SOOPεφοδιασμένο (αυτό είναι "OOP" για Αντικειμενοστραφής προγραμματισμός).

  1. Η ρήτρα "Λαβές" ελέγχει αν το σύστημα καλεί την υπορουτίνα, όχι το όνομα.
  2. Οι παραμέτρους του αποστολέα και του e διαβιβάζονται στην υπορουτίνα.

Χρήση παραμέτρων

Ας δούμε ένα απλό παράδειγμα για να δείτε τη διαφορά που κάνουν οι παράμετροι στο VB.NET.

Private Sub Button1_Click ( 

 ByVal αποστολέας ως σύστημα. Αντικείμενο,

 ByVal e ως σύστημα. EventArgs

 ) Κουμπί λαβών1.Κάντε κλικ

 «Ο κωδικός σου πηγαίνει εδώ

End Sub

Οι υπορουτίνες συμβάντων λαμβάνουν πάντα ένα αντικείμενο "αποστολέα" και μια παράμετρο EventArgs του συστήματος "e". Επειδή η παράμετρος EventArgs είναι ένα αντικείμενο, υποστηρίζει οποιεσδήποτε ιδιότητες και μέθοδοι είναι απαραίτητες. Για παράδειγμα, η παλιά υπορουτίνα συμβάντος MouseMove VB6 που χρησιμοποιήθηκε για να λάβει τέσσερις παραμέτρους:

instagram viewer

  • Κουμπί ως ακέραιο
  • Μετακίνηση ως ακέραιο
  • X ως ενιαίο
  • Y ως ενιαία

Όταν πιο προηγμένα ποντίκια βγήκαν με περισσότερα κουμπιά, το VB6 είχε ένα πραγματικό πρόβλημα να τα υποστηρίξει. Το VB.NET περνά μόνο μία παράμετρο MouseEventArgs, αλλά υποστηρίζει πολύ περισσότερες ιδιότητες και μεθόδους. Και καθένα από αυτά είναι αντικείμενα που υποστηρίζουν ακόμα περισσότερα. Για παράδειγμα, το e. Η ιδιότητα κουμπιού περιέχει όλες αυτές τις ιδιότητες:

  • Αριστερά
  • Μεσαίου
  • σωστά
  • Κανένας
  • XButton1
  • XButton2

Εάν κάποιος δημιουργήσει ένα "μεταβατικό" ποντίκι με ένα "εικονικό" κουμπί, το VB.NET θα χρειαστεί να ενημερώσει μόνο το .NET Framework για να το υποστηρίξει και κανένα προηγούμενο κώδικα δεν θα σπάσει ως αποτέλεσμα.

Υπάρχουν πολλές τεχνολογίες .NET που εξαρτώνται απόλυτα από αυτές τις παραμέτρους. Για παράδειγμα, επειδή ο υπολογιστής σας έχει συνήθως μόνο μία οθόνη για την εμφάνιση γραφικών, ο κώδικας σας πρέπει να συγχωνεύσει τα γραφικά που δημιουργεί στην ίδια εικόνα που χρησιμοποιείται από τα Windows. Για το λόγο αυτό, πρέπει να μοιραστεί ένα ενιαίο αντικείμενο "γραφικών". Ο κύριος τρόπος με τον οποίο ο κώδικάς σας μπορεί να χρησιμοποιήσει αυτό το αντικείμενο "γραφικών" είναι να χρησιμοποιήσει την παράμετρο e που είναι πέρασε στο συμβάν OnPaint με το αντικείμενο PaintEventArgs.

Προστατευμένες αντικαταστάσεις SubPaint (

 ByVal e ως σύστημα. Windows. Έντυπα. PaintEventArgs)

 Dim g ως γραφικά = e. Γραφικά

Άλλα παραδείγματα

Τι άλλο μπορείτε να κάνετε με αυτές τις παραμέτρους; Για να το δείξουμε, ας υποθέσουμε ότι θέλετε να βρείτε αν μια συμβολοσειρά, ίσως κάτι που εισήγατε σε ένα πλαίσιο κειμένου, υπάρχει σε οποιαδήποτε από μια συλλογή από άλλα πλαίσια κειμένου όταν κάνετε κλικ σε ένα. Θα μπορούσατε να κωδικοποιήσετε μερικές δωδεκάδες ουσιαστικά όμοιες υπορουτίνες για κάθε Γραμματοκιβώτιο:

Εάν TextBox42.Text. IndexOf (

 SearchString. Κείμενο) = -1 

 Στη συνέχεια, η NotFound. Text = 

 "Δεν βρέθηκε"

Αλλά είναι πολύ πιο εύκολο να κωδικοποιήσετε μόνο ένα και αφήστε το να χειριστεί όλα αυτά. Η παράμετρος αποστολέα θα αποκαλύψει σε ποιο πλαίσιο κειμένου έγινε κλικ.

Ιδιωτικό Υποσύστημα (

 ByVal αποστολέας ως σύστημα. Αντικείμενο,

 ByVal e ως σύστημα. EventArgs

 ) Χειριστές TextBox1.Enter, 

 TextBox2.Enter, 

... και επάνω και επάνω.. .

 TextBox42.Enter

 Dim myTextbox ως TextBox

myTextbox = αποστολέας

 Dim IndexChar ως ακέραιο = 

 myTextbox. Κείμενο. IndexOf ( 

 SearchString. Κείμενο)

 Αν IndexChar = -1 Στη συνέχεια _

 Δεν βρέθηκε. Κείμενο = "Δεν βρέθηκε" _

 Άλλο _

 Δεν βρέθηκε. Κείμενο = "Βρέθηκε!"

 End Sub

Πρόσφατα, ένας προγραμματιστής με ρώτησε για έναν καλύτερο τρόπο "να διαγράψω τη γραμμή στην οποία έγινε κλικ σε οποιαδήποτε από τις έξι καθορισμένες λίστες". Το είχε δουλέψει σε μερικές δεκάδες γραμμές κώδικα που με απλά μπερδευόταν. Αλλά χρησιμοποιώντας αποστολέα, ήταν πραγματικά πολύ απλό:

Ιδιωτική υπο-λίσταBox_Click ( 

 ByVal αποστολέας ως αντικείμενο, 

 ByVal e ως σύστημα. EventArgs

 ) Λαβές ListBox1.Click, ListBox2.Click

 Dim myListBox ως νέο κατάλογο λιστών

 myListBox = αποστολέας

 myListBox. Στοιχεία. RemoveAt (myListBox. SelectedIndex)

End Sub

Ένα ακόμη παράδειγμα για να καρφώσει το σημείο είναι μια ερώτηση που στάλθηκε από τον Pierre στο Βέλγιο. Ο Pierre δοκιμάζει την ισότητα του Button1 και του αποστολέα χρησιμοποιώντας το Είναι χειριστής για αντικείμενα:

Αν ο αποστολέας είναι Button1 Στη συνέχεια ...

Αυτό είναι συντακτικά σωστό επειδή ο αποστολέας και το Button1 είναι και τα δύο αντικείμενα που μπορούν να αναφερθούν. Και επειδή ο αποστολέας είναι όμοιος με τον Button1, γιατί δεν λειτουργεί;

Η απάντηση εξαρτάται από μια λέξη-κλειδί που βρίσκεται λίγο νωρίτερα στη δήλωση. Πρώτον, ας ελέγξουμε την τεκμηρίωση της Microsoft για το Είναι χειριστής.

Visual Basic συγκρίνει δύο μεταβλητές αναφοράς αντικειμένου με τον Is Operator. Αυτός ο φορέας καθορίζει εάν δύο μεταβλητές αναφοράς αναφέρονται στην ίδια εμφάνιση αντικειμένου.

Παρατηρήστε ότι ο αποστολέας έχει περάσει ByVal. Αυτό σημαίνει ότι έχει περάσει ένα αντίγραφο του Button1, όχι το ίδιο το ίδιο το αντικείμενο. Έτσι όταν ο Pierre δοκιμάζει για να δει αν ο αποστολέας και ο Button1 είναι το ίδιο παράδειγμα, το αποτέλεσμα είναι ψευδές.

Για να ελέγξετε αν έχει γίνει κλικ στο κουμπί Κουμπί1 ή Κουμπί2, πρέπει να ενεργοποιήσετε τον αποστολέα σε ένα πραγματικό αντικείμενο κουμπιού και στη συνέχεια να δοκιμάσετε μια ιδιότητα αυτού του αντικειμένου. Συνήθως χρησιμοποιείται κείμενο, αλλά μπορείτε να δοκιμάσετε μια τιμή στην ετικέτα ή ακόμα και στην ιδιότητα Τοποθεσία.

Ο κώδικας αυτός λειτουργεί:

Dim myButton As Button

myButton = αποστολέας

Εάν μου myButton. Text = "Button1" Στη συνέχεια

instagram story viewer