Σάββατο, 9 Ιουνίου 2018

Χρήση γεγονότων σε ομάδες με εξωτερικές συναρτήσεις εξυπηρέτησης γεγονότων

Σε αυτό το παράδειγμα (υπάρχει παρόμοιο στα αγγλικά εδώ με την διαφορά ότι όταν εμφανίστηκαν αυτού του τύπου τα γεγονότα, δεν υπήρχαν δείκτες σε ομάδες) θα δούμε τα "ελαφριά γεγονότα". Τώρα επειδή υπάρχουν δείκτες θα δούμε ότι και οι δείκτες σε ομάδες μπορούν να καλέσουν μεθόδους (τμήματα) σε ομάδες και αυτές να καλέσουν τις συνδεδεμένες συναρτήσεις (αν υπάρχουν). Η κλήση σε γεγονότα μπορεί να γίνει και με πέρασμα με αναφορά, όπως η &Μ. Επίσης και έχει σημασία εδώ, οι συναρτήσεις εξυπηρέτησης γεγονότων δεν ανήκουν σε ένα αντικείμενο γεγονός αλλά είναι "Δεμένες" με το τμήμα όπου φτιάξαμε την αρχική "Επώνυμη" ομάδα άλφα. και από αυτήν συνδέσαμε τα γεγονότα "α" και "β" στις συναρτήσεις Άλφα_α και Άλφα_β. (παρόμοιο τρόπο σύνδεσης συναρτήσεων εξυπηρέτησης έχουμε και στις φόρμες χρήστη GUI, και τα στοιχεία ελέγχου σε αυτές).
Κάνουμε δοκιμές σε αντίγραφα της άλφα σε έναν πίνακα, τον οποίο τον περνάμε με αντιγραφή σε ένα άλλο τμήμα. Επίσης φτιάχνουμε ένα δείκτη σε ένα στοιχείο του πίνακα και μετά φτιάχνουμε ένα νέο πίνακα όπου στο στοιχείο 1 βάζουμε ένα δείκτη από στοιχείο του πρώτου πίνακα, Το δεύτερο πίνακα τον περνάμε με αναφορά σε ένα άλλο τμήμα και εκεί καλούμε δυο φορές το ΈλεγχοςΑ το οποίο καλεί το γεγονός Άλφα_α (που βρίσκεται σε άλλο τμήμα). Αυτό το γεγονός εκτελείται σε μια συνάρτηση που "πιστεύει" ότι είναι μέρος του τμήματος, και όχι χωριστή συνάρτηση, και έτσι βλέπει και τροποποιεί την Μ, μια μεταβλητή με ίδιο όνομα όπως η Μ στο τμήμα ΈλεγχοςΑ, αλλά διαφορετική. Η Μ στην ΈλεγχοςΑ είναι τοπική, που σημαίνει ότι στο πέρας εκτέλεσης του τμήματος θα χαθεί. Δείτε όμως ότι κατά την κλήση του γεγονότος "α" δίνουμε την τιμή του Χ (έχει μια τελεία στην αρχή) και αυτό είναι μέλος της ομάδας, και αμέσως μετά αυξάνουμε κατά ένα την τιμή του (και αυτό μένει στην ομάδα, γιατί η Χ δεν είναι τοπική αλλά μέλος της ομάδας, δηλαδή κρατάει μια "κατάσταση" όπως λέμε).
Κάθε φορά που καλούμε το γεγονός "α" από οποιοδήποτε αντίγραφο της Άλφα θα αυξάνει το Μ, στο τμήμα που βρίσκεται η αρχική ομάδα Άλφα.


Άδειασε ' αδειάζουμε το σωρό για να δείξουμε παρακάτω ότι δεν "γεμίζει"
\\ η χρήση γεγονότων χρειάζεται όταν το αντικείμενο δεν ξέρει,
\\ με τι συνδέεται το γεγονός, αλλά ότι πρέπει να το καλέσει!
\\ ακόμα και αν δεν είναι συνδεδεμένο (δεν βγαίνει λάθος)
\\ στην ουσία προγραμματίζουμε το αντικείμενο, χωρίς να πειράζουμε το κώδικά του!
Ομάδα ΜεΓεγονότα Άλφα {
      Γεγονότα "α", "β"
      Χ=10
      Τμήμα ΈλεγχοςΑ {
            Κάνε Μ ως Μακρύς
            Κάλεσε Γεγονός "α", ,
            ++
            \\ ο σωρός είναι 0 και το Μ είναι 101, στην πρώτη κλήση
            Τύπωσε Μέγεθος.Σωρού, Μ
       }
       Τμήμα ΈλεγχοςΒ(τι$) {
            Κάλεσε Γεγονός "β", τι$
      }
}
Μ=100
α_τιμή=500
β_τιμή=4000

\\ αν αλλάξουμε τα ονόματα των Αλφα_α και Αλφα_β
\\ με τα Αλφα_α1 και Αλφα_β1
\\ το πρόγραμμα θα τρέξει χωρίς να κληθούν οι συναρτήσεις
\\ και χωρίς να βγει λάθος
\\ τα γεγονότα δηλαδή καλούνται ανεξάρτητα αν έχουν συνάρτηση εξυπηρέτησης.
\\ στην Άλφα_α βάζουμε το Νέο για να δηλώσουμε ότι η αναφορά θα γίνει, ακόμα και αν υπάρχει ήδη μια α, την οποία θα σκιάσουμε πρόσκαιρα.
Συνάρτηση Άλφα_α(Νέο &α_τιμή,β_τιμή) {
      \\ η συνάρτηση είναι όπως οι συναρτήσεις γεγονότων για φόρμες
      \\ έχουν ίδιο όνομα κατά την εκτέλεση με το τμήμα που ανήκουν
      \\ έτσι η Μ είναι φανερή και μπορεί να αλλάξει
      Μ++
      α_τιμή=Μ
      Τύπωσε "ok", α_τιμή, β_τιμή, Μ
      Βάλε 500 ' η τιμή θα χαθεί γιατί ο σωρός τιμών είναι προσωρινός και στην επιστροφή διαγράφεται
}
Συνάρτηση Άλφα_β(α_τιμή$) {
      Τύπωσε "Από Γεγονός:"; α_τιμή$
}
Άλφα.ΈλεγχοςΑ
Σωρός ' απλά αφήνει μια γραμμή γιατί δεν έχει τίποτα ο σωρός
\\ φτιάχνουμε ένα πίνακα με δέκα ομάδες όπως η άλφα
Τύπωσε Αλφα.χ ' δίνει 11
Πίνακας πινακ(10)=Αλφα
Τμήμα Ζ_τμήμα (M()){
      Για ι=0 έως 9 {
                  Για M(ι) {
                        \\ καλούμε σε κάθε στοιχείο του Μ την έλεγχοςΑ
                        \\ η οποία θα καλέσει το γεγονός
                        .ΈλεγχοςΑ
                  }
      }
      M(5).ΈλεγχοςΒ "Αυτό είναι το Μ(5)"
}
\\ εδώ ο πίνακας πινακ() πέρασε με αντιγραφή
Ζ_τμήμα πινακ()
Βήτα=πινακ(3)
Βήτα.ΈλεγχοςΒ "Γεια Χαρά!"
Τύπωσε α_τιμή, β_τιμή ' δεν έχουν αλλάξει!
Δ1->Βήτα
Δ1=>ΈλέγχοςΒ "Δ1"
Πίνακας πιν1(5)
πιν1(1)->πινακ(1)
πιν1(1)=>ΈλεγχοςΒ "πιν(1)"
Τμήμα κάτι_αλλο (&π()) {
      π(1).ΈλεγχοςΑ ' το π(1).χ γίνεται 12
      π(1).ΈλεγχοςΑ ' το π(1).χ γίνεται 13
}
κάτι_αλλο &πιν1()
\\ το παρακάτω δίνει 13, γιατί;
\\ επειδή το π(1) είναι δείκτης του πινακ(1)
\\ ο οποίος ξεκίνησε με αντίγραφα του Αλφα που είχε το Αλφα.Χ = 11
Τύπωσε πινακ(1).Χ