Τετάρτη 2 Μαρτίου 2016

Παραδείγματα με Γεγονότα και Αντικείμενα (ανανέωση)

Ακόμα ανιχνεύω τις δυνατότητες των Γεγονότων όπως τα έφτιαξα στη Μ2000.

Σε αυτό το παράδειγμα δημιουργούμε ένα αντικείμενο Άλφα και ένα Βήτα. Μετά δημιουργούμε το Δέλτα και Έψιλον από το Βήτα, και μετά τα τρία τελευταία αναβαθμίζονται κατά τάξη Άλφα. Δηλαδή δεν μπαίνει η ομάδα άλφα στο καθένα αλλά δημιουργείται η δομή της μέσα στα τρία αντικείμενα, και αν βρεθούν όμοια πεδία τότε έχουμε αλλαγή τιμής, και για το λόγο αυτό θα χρησιμοποιούμε την λέξη Συγχώνευση, και την διαδικασία αυτή ως Συγχώνευση του Άλφα στο Βήτα, στο Δέλτα και στο Έψιλον.

Αν κάνουμε πρώτα συγχώνευση του Άλφα στο Βήτα και μετά κάνουμε δημιουργίες του Δέλτα και Έψιλον, τότε το πρόγραμμα θα τρέξει, με την μόνη διαφορά πως η όλαμαζί που αλλάζει τιμή θα είναι στο Έψιλον! Πάντως μέχρι να δω γιατί γίνεται αυτό...ας το αποφεύγουμε, αν και το πρόγραμμα βγαίνει, αφού το όλαμαζί το ζητάμε μέσω γεγονότος και μας επιστρέφει σωστά σε οποιοδήποτε από τα Βήτα, Δέλτα, Έψιλον με την Όλαμαζί(&Αλφα), όπου το &Αλφα σημαίνει πέρασμα με αναφορά του γεγονότος στη συνάρτηση Όλαμαζί() που έχουν και τα τρία αντικείμενα Βήτα, Δέλτα και Έψιλον.

Στην Ομάδα άλφα έχω το όλαμαζι ιδιωτικό. Μπορώ να τη διαβάσω με την δημόσια συνάρτηση ΤιΈχω(). Έχω φτιάξει δυο γεγονότα, δημόσια, το Κ και το Μ. Το Κ δηλώνει ότι θα διαβάζει το Μ και το Ποιος$. Αυτό θα το κάνει και για τις δικές μας συναρτήσεις που θα του δώσουμε, αλλά εκεί θα βάλουμε τη δική μας διάβασε όπως θέλουμε. Το Κ όμως έχει μια δική του Συνάρτηση, όπως και το Μ, χωρίς όνομα! Σε αυτές αντιγράφεται  η Διάβασε που περιέχεται στο κάθε Γεγονός. Όμως και οι δύο συναρτήσεις, αν και δεν έχουν όνομα, θα πάρουν πρόσκαιρα το Α(). Αυτές οι συναρτήσεις δεν μπορούν να αφαιρεθούν από την κλήση γεγονότος.(το raise event εδώ λέγεται Κάλεσε Γεγονός).
Η λειτουργία του Γεγονότος απαιτεί να έχουν γραφτεί σε αυτό συναρτήσεις (όχι αλφαριθμητικές ή ακεραίων), που δεν επιστρέφουν τιμή. Όταν καλέσουμε το γεγονός με κάποιες παραμέτρους τότε θα κληθεί κάθε γραμμένη συνάρτηση με τις ίδιες παραμέτρους.(αυτό λέγεται multicast, εξαγωγή μηνύματος/τιμών προς πολλούς παραλήπτες).

Γράφουμε νέες συναρτήσεις με την Γεγονός όνομα_γεγονότος Νέο συναρτησηΑ()  [,συνάρτησηΟτιδήποτε()]. Μπορούμε να γράψουμε δυο ή περισσότερες φορές μια συνάρτηση. Μπορούμε να αφαιρέσουμε μια συνάρτηση (αν την έχουμε γράψει δυο φορές θα αφαιρεθεί μία), με την εντολή  Γεγονός όνομα_γεγονότος Πέτα συναρτησηΑ()  [,συνάρτησηΟτιδήποτε()].
Μπορούμε να καθαρίσουμε το γεγονός, και ταυτόχρονα το απενεργοποιούμε. Αυτό σημαίνει ότι αν κληθεί δεν θα απαντήσει, και θα σβήσει τα δεδομένα που του δίνουμε.
Η πρώτη καθαρίζει και κάνει κράτηση, η επόμενη το αφήνει ελεύθερο, και η τελευταία το κρατάει (έτσι οι Κάλεσε Γεγονός δεν ανταποκρίνονται)
Γεγονός Άλφα Καθαρό


Γεγονός Άλφα Άφησε


Γεγονός Άλφα Κράτησε

Η εντολή Κάλεσε Γεγονός παίρνει τα δεδομένα ως έχουν στο σωρό  (έχουν μπει πριν καλέσουμε το γεγονός) ή κατά τη κλήση, αλλά όπως και να έχει μετά δεν θα υπάρχουν ακόμα και αν δεν έχει τίποτα γραμμένο για να εκτελεστεί με την Κάλεσε Γεγονός (Δείτε το δεύτερο παράδειγμα παρακάτω)

Ομάδα Άλφα {
Ιδιωτικό:
      όλαμαζί=100
Δημόσιο:
      Γεγονός Κ {
            Διάβασε Μ, Ποιός$
            Συνάρτηση {
                  Τύπωσε Ποιός$, Μ, .όλαμαζί
                  .ολαμαζί++
            }
      }
      Γεγονός Πάρε_Όλαμαζί {
            Διάβασε
            Συνάρτηση {
                Μ= .ολαμαζί
            }
       }
      Συνάρτηση ΤιΈχω {
            =.Όλαμαζί
      }
}
Ομάδα Βήτα {
      χ=0, ψ=100, ονομα$
      Συνάρτηση Για_Κ {
            Διάβασε α, β$
            ++
            Τύπωσε α, β$, , "η δική μου "+.ονομα$
      }
      Συνάρτηση Όλαμαζί {
            Διάβασε &ποιο
            τοπική κ
            Κάλεσε Γεγονός Ποιο.Πάρε_Όλαμαζί,
            =κ
      }
}
Βήτα= Άλφα
\\ δημιουργία αντικειμένου με αντιγραφή
Στη Δέλτα=Βήτα
\\ δημιουργία αντικειμένου μέσω σωρού
Βάλε Βήτα
Διάβασε Έψιλον
Βήτα.Όνομα$="Βήτα"
Δέλτα.Όνομα$="Δέλτα"
// όταν δημιουργείται η Έψιλον από σωρό ειναι σαν γενική
// Το βλέπουμε με το Λίστα αυτό. Αν δεν βάλουμε το <= θα φτιαχτεί μια τοπική, που θα σκιάζει αυτή της Έψιλον, αλλά μόνο σε αυτό το τμήμα. Έτσι στην ανάγνωση της .όνομα$, στη συνάρτηση Για_Κ του Έψιλον θα βγαίνει η πραγματική Όνομα$ που θα είναι κενή.
Έψιλον.Όνομα$<="Έψιλον"
\\ Προσθέτω δυο χειριστές γεγονότων
\\ (παίρνει όσους θέλουμε, και σε άλλη γραμμή)
Γεγονός Άλφα.Κ νέο Βήτα.Για_Κ(), Δέλτα.Για_Κ(), Εψιλον.Για_Κ()
Τύπωσε Βήτα.Όλαμαζί(&Αλφα), Βήτα.ΤιΈχω(), "Βητα"
Τύπωσε Δέλτα.Όλαμαζί(&Αλφα), Δέλτα.ΤιΈχω(), "Δέλτα"
Τύπωσε Έψιλον.Όλαμαζί(&Αλφα), Έψιλον.ΤιΈχω(), "Έψιλον"
//Βήτα.Κ=Άλφα.Κ
\\ Διάλεξε περίπτωση 1 ή 2
Περίπτωση=2
\\ και οι δύο περιπτώσεις έχουν το ίδιο αποτέλεσμα!
Αν Περίπτωση=1 Τότε {
\\ Καλώ το γεγονός από την Άλφα
      Για Άλφα {
            Κάλεσε Γεγονός , 200, "οκ1"
            Κάλεσε Γεγονός , 300, "οκ2"
            Κάλεσε Γεγονός , 400, "οκ3"
      }
} Αλλιώς {
\\ Καλώ το γεγονός από τη Βήτα
      Για Βήτα {
            Κάλεσε Γεγονός , 200, "οκ1"
            Κάλεσε Γεγονός , 300, "οκ2"
            Κάλεσε Γεγονός , 400, "οκ3"
      }
}
Τύπωσε "Βήτα.χ, Δέλτα.χ, Έψιλον.χ"
Τύπωσε Βήτα.χ, Δέλτα.χ, Έψιλον.χ
Τύπωσε Βήτα.Όλαμαζί(&Αλφα), Βήτα.ΤιΈχω(), "Βητα"
Τύπωσε Δέλτα.Όλαμαζί(&Αλφα), Δέλτα.ΤιΈχω(), "Δέλτα"
Τύπωσε Έψιλον.Όλαμαζί(&Αλφα), Έψιλον.ΤιΈχω(), "Έψιλον"
Τύπωσε Άλφα.ΤιΈχω()


1. Παλαιότερα (πριν την 10η έκδοση) τα γεγονότα στα αντικείμενα δεν αντιγράφονταν με νέο δείκτη, αλλά αυτό έχει αλλάξει, και στη συγχώνευση ο δείκτης είναι διαφορετικός, δηλαδή τα Βήτα, Δέλτα, Έψιλον έχουν διαφορετικό αντικείμενο γεγονός. Μπορούμε όμως να το αλλάξουμε αυτό μετά. Όπως στο πρόγραμμα που βάλαμε σε μια επιπλέον γραμμή το Βήτα.Κ=Άλφα.Κ
2. Όταν διαβάζουμε ένα αντικείμενο από τον σωρό όπως στην Έψιλον, ο διερμηνευτής δίνει γενικό όνομα στο Έψιλον, με συνέπεια για να αλλάξουμε τιμή στο ονομα$ να χρειάζεται το <= όπως στις γενικές. Ο λόγος που γίνεται αυτό είναι για να μην αυξάνονται τα μήκη των ονομάτων εσωτερικά όταν δίνουμε ένα αντικείμενο σαν παράμετρο σε κλήση σε μια μέθοδο αντικειμένου.


Άλλο παράδειγμα! Εδώ φαίνεται ότι οι συναρτήσεις κρατούνται στο γεγονός, όχι σαν απλές αναφορές. Μετά το πέρας του τμήματος Εσωτερικό καλούμε το γεγονός και εκτελείται η συνάρτηση εντός του τμήματος, ενώ αυτό έχει τερματίσει και έχει διαγράψει την συνάρτηση. Έχουμε δηλαδή κάνει στην προσθήκη της συνάρτησης στο γεγονός προσθήκη ανώνυμης συνάρτησης! Το όνομα το χρησιμοποιεί μόνο για να την πετάξουμε από τη λίστα του αντικειμένου Γεγονός!
Δώστε Φόρμα 80,40 για να φανούν όλες οι γραμμές (η Φόρμα φτιάχνει το μέγεθος των γραμμάτων για να δείχνει επακριβώς 80 χαρακτήρες Χ 40 γραμμές σε οποιοδήποτε οθόνη, για μη αναλογικά τυπωμένους χαρακτήρες, αλλά μπορούμε να τυπώσουμε ότι θέλουμε και γραφικά, ακόμα και εικόνες)

\\ μπορώ να φτιάχνω και γενικά γεγονότα!
Γενικό ΜιαΦορά = Αληθής
Γενικό Γεγονός Α {
      Διάβασε Μ
}
Συνάρτηση Γενική ΚάνεΚάτι {
            Διάβασε Χ
            Τύπωσε Χ
      }
Τμήμα Εσωτερικό {
      Άδειασε \\ αδειάζω το σωρό
      Βάλε 10 \\ βάζω στην κορυφή το 10
      Τύπωσε "δεν θα κάνει τίποτα"
      Κάλεσε Γεγονός Α
      Σωρός
      Τύπωσε "Αλλά θα πετάξει ένα στοιχείο από το σωρό"
      Συνάρτηση ΚάνεΚάτιΑκόμα {
            Διάβασε Χ
            Τύπωσε Χ**2
      }
      \\ βάζω ένα γενικό και ένα τοπικό
   
      Αν ΜιαΦορά τότε {
            Γεγονός Α Νέο ΚάνεΚάτι(), ΚάνεΚάτιΑκόμα()
            ΜιαΦορά <= Ψευδής \\ οι γενικές θέλουν "<=" αλλιώς με "=" φτιάχνουμε τοπική
      } Αλλιώς {
            Δες Εντάξει {
                  Γεγονός Α Πέτα ΚάνεΚάτιΑκόμα()
            }
            Αν όχι Εντάξει τότε Τύπωσε "Δεν είναι γραμμένη η ΚάνεΚάτιΑκόμα()"
      }
      Τύπωσε "τώρα βάζω πάλι κάτι"
      Βάλε 100
      Κάλεσε Γεγονός Α
      Κάλεσε Γεγονός Α 200
      Κάλεσε Γεγονός Α, 300 \\ αν θέλω βάζω και κόμμα
   
}
Τύπωσε "Καλούμε το Εσωτερικό τμήμα"
Εσωτερικό
\\ Στην έξοδο (τερματισμό) του τμήματος Εσωτερικό ...
\\ ...έχει σβηστεί η τοπική συνάρτηση ΚάνεΚάτιΑκόμα
\\ όμως στο γεγονός είναι γραμμένη και τρέχει σαν ...
\\ Εσωτερικό.ΚάνεΚάτιΑκόμα()
\\ αλλά ουσιαστικά τρέχει μια Α()
\\ Στα γεγονότα δεν σώνουμε αναφορές στις συναρτήσεις
\\ αλλά αντίγραφα των συναρτήσεων και στοιχεία περιβάλλοντος!
Τύπωσε "Καλούμε το Γεγονός Α αφού τερμάτισε το Εσωτερικό τμήμα"
Κάλεσε Γεγονός Α 500
\\ Καλούμε το τμήμα Εσωτερικό πάλι, αλλά δεν θέλουμε..
\\.. να αυξήσουμε τις γραμμένες συναρτήσεις στο Γεγονός
\\.. να γιατί έχουμε βάλει μια γενική ΜιαΦορά για να κρατάμε λογαριασμό
Τύπωσε "Καλούμε πάλι το Εσωτερικό τμήμα"
Εσωτερικό
Τύπωσε "Καλούμε πάλι το Εσωτερικό τμήμα"
Εσωτερικό



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.