Κυριακή 17 Φεβρουαρίου 2019

Αναθεώρηση 20 Έκδοση 9.7

Σε αυτήν την αναθεώρηση κοίταξα το σύστημα παραθύρων. Η Μ2000 έχει δικό της σύστημα (βασίζεται στη μηχανή της Visual Basic 6, και δεν χρησιμοποιεί τα στοιχεία της VB6). Μπορούμε να φτιάχνουμε φόρμες με πέντε διαφορετικά στοιχεία, που έχουν παραλλαγές ανάλογα με την ρύθμιση.

Ειδικά στο EditBox ή Κείμενο, προστέθηκε νέο γεγονός. Δεν αναφέρω κάτι περισσότερο, γιατί είναι πολύ τεχνικό. Στο info.gsb που παρέχεται με τον διερμηνευτή υπάρχει το meditor, ο διορθωτής για προγράμματα της Μ2000, σε μορφή παραθύρου, γραμμένος σε Μ2000. Τα επιπρόσθετα σε αυτήν την έκδοση του meditor είναι:
  • η ενσωμάτωση της βοήθειας (με χρήση SQL ερωτημάτων, στην βάση δεδομένων της βοήθειας της Μ2000). Από την ίδια βάση δουλεύει και το Βοήθεια ή Help. 
  • νέο μενού όπου επιλέγουμε αν θα τρέξουμε το πρόγραμμα με επίδειξη του κώδικα καθώς τρέχει (αυτό γίνεται με κλήση του προγράμματος που γράφουμε σε νέα παρουσία του διερμηνευτή, και σε αυτήν ανοίγει ο Έλεγχος, που δείχνει τις εντολές).
Ως προς το σύστημα παραθύρων:
Στις αναδυόμενες λίστες, όπως αυτή των μενού, έχει βγει η μετακίνηση με το ροδελάκι του ποντικιού και έχει αντικατασταθεί με άμεση μετακίνηση του δρομέα (που εμφανίζει την επιλογή) με την κίνηση του δείκτη του ποντικιού. Μπορούμε με κράτημα του αριστερού πλήκτρου του ποντικιού να μετακινούμε τις επιλογές (αν το μενού έχει περισσότερες από ένα αριθμό γραμμών, τότε δεν εμφανίζονται όλες οι επιλογές, αλλά μπορούμε με ολίσθηση των γραμμών να δούμε και τις άλλες εντολές). Η χρήση των μενού προγραμματιστικά δεν είναι δύσκολη, αλλά παρόλα αυτά απαιτεί δουλειά για να προγραμματίσει κανείς ένα καλό μενού. Δείτε πόσα πράγματα χρειάζονται. Για κάθε μενού πρέπει να ορίσουμε ένα αντικείμενο τύπου Combo ή Λίστα.Εισαγωγής. Αυτό το στοιχείο έχει τρεις βασικές παραλλαγές. Και οι τρεις εμφανίζουν ένα όνομα και δίπλα ένα τρίγωνο με την βάση από πάνω, που δηλώνει σαν βελάκι, ότι κάτι βγαίνει από κάτω! Η απλή λίστα εισαγωγής δείχνει μόνο το όνομα αυτό και όταν πατάμε σε αυτήν ανοίγει η λίστα για να επιλέξουμε. Αυτός ο τύπος γίνεται μενού επιλογής. Μπορούμε να καθορίσουμε το πλάτος της αναδυόμενης λίστας, αλλά το ύψος καθορίζεται αυτόματα. Βεβαίως το προς τα που θα ανοίξει η λίστα σχετίζεται με το που είναι το μενού (η επικεφαλίδα) σε σχέση με την οθόνη, ώστε πάντα η λίστα να είναι εντός οθόνης. Μπορεί δηλαδή η λίστα να βγει πάνω από την επικεφαλίδα.  Κατόπιν προγραμματίζουμε τις επιλογές του μενού. Μπορούμε να βάζουμε γραμμές διαχχωρισμού (δεν σταματάει σε αυτές ο δρομέας), να ορίζουμε αν η επιλογή είναι ενεργή ή όχι (βγαίνει με κόκκινο χρώμα η μη επιλογή), και επιπλέον μπορούμε να έχουμε δυο ακόμα ειδών επιλογές, τις λεγόμενες radiobutton, και τις τύπου checkbutton. Οι τύπου radiobutton δουλεύουν ως μια συνεχόμενη ομάδα όπου όμως μια από τα μέλη της μπορεί να "τσεκαριστεί" με ένα τετράγωνο αριστερά. Αντίθετα οι επιλογές τύπου checkbutton, είναι ανεξάρτητες και αυτές εμφανίζουν ένα τετράγωνο.

Αφού φτιάξουμε τις επιλογές, ορίζουμε σε ποια ομάδα μενού ανήκει το κάθε μενού. Η ομάδα χρειάζεται για όταν μετακινούμαστε στο μενού με τα βελάκια. Με τα βελάκια αριστερά και δεξιά αλλάζουμε μενού επιλογής, βάσει της ομάδας. Μπορούμε δηλαδή να έχουμε δυο ή περισσότερες ομάδες μενού επιλογών στην ίδια φόρμα. Η θέση τους δε μπορεί να είναι όπως θέλουμε, οριζόντια, η κάθετη ή διάσπαρτη! Για κάθε στοιχείο πρέπει να δώσουμε μια μέθοδο move που θα τα βάλει εκεί που θέλουμε. Ο καλύτερος τόπος για αυτή τη μέθοδο είναι στο γεγονός resize της φόρμας.

Τώρα ως προς το χειρισμό των μενού. Για να επιλέξουμε κάτι ή θα δώσουμε διπλό κλικ με ένα πλήκτρο του ποντικιού (και το δεξί πιάνει), ή θα σείρουμε την επιλογή στα δεξιά, ως σχεδόν να εξαφανιστεί και αφήνοντας την επιλογή είναι σαν να την επιλέξαμε. Αν δεν την αφήσουμε εκεί και την γυρίσουμε πίσω τότε δεν πιάνει σαν επιλογή μας.
Πριν ανοίξει το μενού και ενώ το έχουμε ζητήσει με πλήκτρο ή με το ποντίκι, στέλνει ένα γεγονός Open. Σε αυτό ρυθμίζουμε το ποια στοιχεία θα είναι ενεργά ή όχι, ή ποια checkbutton θα είναι τσεκαρισμένα ή όχι. Μπορούμε ακόμα και αν αλλάζουμε τα ονόματα! Δείτε όμως κάτι. Το συγκεκριμένο γεγονός δεν δίνει κάτι, πέρα ότι καλεί συγκεκριμένη συνάρτηση με το όνομα του στοιχείου και το επίθεμα .Open, Για να έχουμε πρόσβαση ή έλεγχο στις επιλογές πρέπει να δημιουργήσουμε πίνακες επιλογών, το οποίο είναι εύκολο, με την Με Στοιχείο, "όνομα ιδιότητας" ως Πίνακας1(). Δεν δίνουν όλες οι ιδιότητες πίνακες. Η βασική στα μενού λέγεται "label" και είναι η ετικέτα ή επικεφαλίδα του μενού. Οι πίνακες που μας ενδιαφέρουν (φαίνονται σαν πίνακες αλλά είναι ιδιότητες με μια παράμετρο), είναι των ιδιοτήτων "ListSelected" και "MenuEnabled". Η πρώτη έχει να κάνει με τα checkbutton, και η δεύτερη με όλα τα στοιχεία, όπου με 0 ή false τα απενεργοποιούμε.Κάθε επιλογή έχει ένα νούμερο, με την πρώτη να έχει το 0. Για κάθε στοιχείο μενού (που όπως είδαμε είναι λίστα εισαγωγής αναδυόμενη) έχουμε και το γεγονός dblClick() το οποίο δίνει τον αριθμό της επιλογής.

Εδώ πρέπει να ξεκαθαρίσω στον αναγνώστη ότι ενώ οι συναρτήσεις και τα τμήματα εξ ορισμού δεν βλέπουν τίποτα έξω από αυτές, εκτός των όποιων γενικών μεταβλητών και τμημάτων, οι συναρτήσεις γεγονότων είναι "ψεύτικες". Αφενός δεν μπαίνουν σε εκφράσεις (πράξεις). και αφετέρου το όνομα τους δεν είναι αυτό που βλέπουμε αλλά το όνομα του τμήματος ή της συνάρτησης όπου δημιουργήθηκαν. Με αυτόν τον τρόπο έχουμε πρόσβαση σε όλες τις μεταβλητές του τμήματος, καθώς και σε άλλες συναρτήσεις γεγονότων.  Ο τρόπος κλήσης διαφέρει, και για τα γεγονότα γίνεται με την Κάλεσε Τοπικά. Η λέξη τοπικά κάνει την παραλλαγή της κλήσης. Ότι ορίσουμε σε μια συνάρτηση εξυπηρέτησης γεγονότος, θα διαγραφεί. Επίσης όταν καλείται η συνάρτηση από το "παράθυρο" ξεκινάει με νέο σωρό τιμών. Η Κάλεσε εξ ορισμού μεταβιβάζει τον τρέχον σωρό τιμών του  καλούντος. Στη πρώτη  κλήση αυτό δεν έχει κέρδος, δηλαδή αν αφήσουμε δυο τιμές στο σωρό, αυτές θα διαγραφούν με την επιστροφή από την κλήση. Αν όμως καλέσουμε από άλλη συνάρτηση τη συγκεκριμένη, τότε θα μεταβιβαστεί και ο σωρός τιμών. Αυτό βολεύει όταν καλέσουμε μια άλλη συνάρτηση "τοπικά" και αφήσουμε τιμές στο σωρό τιμών (είναι ένας τρόπος να αποφύγουμε να δημιουργήσουμε μεταβλητή που θα πάρει την τιμή και μετά θα την περάσουμε ως έχει στην επόμενη κλήση).
Εδώ καλό είναι επίσης να ξεκαθαρίσουμε ότι η γλώσσα τρέχει πάνω σε ένα περιβάλλον γραμμένο σε Visual Basic 6, και ότι τα γεγονότα έχουν σχέση με αυτή, αν και είναι νέα δηλαδή δεν υπήρχαν τα στοιχεία ελέγχου και γράφτηκαν σε αυτήν. Τα ονόματα των γεγονότων είναι στα αγγλικά από επιλογή, γιατί δεν θα μπορούσαν να ήταν σε δυο γλώσσες (όπως είναι όλα τα αναγνωριστικά στα λεξιλόγια της Μ2000). Κάθε γεγονός πυροδοτεί μια συνάρτηση εξυπηρέτησης. Μπορούμε βέβαια τη μεταβλητή που δηλώνει το μενού να την έχουμε στα ελληνικά, αλλά στη συνάρτηση το όνομα θα είναι το ελληνικό του στοιχείου, μετά μια τελεία και όνομα του γεγονότος στα αγγλικά. Επιπλέον ως προς το πότε εκτελούνται έχει σημασία εδώ να πούμε ότι ενώ η γλώσσα είναι ενός νήματος εκτέλεσης, δηλαδή πάντα εκτελείται μόνο μια εντολή, η σειρά εκτέλεσης αλλάζει λόγω των γεγονότων. Μπορεί ένα γεγονός να έχει κολλήσει κάπου, πχ τραβάει ένα αρχείο από το δίσκο, αλλά αυτό δεν σημαίνει ότι άλλο γεγονός δεν θα εκτελεστεί. Στον meditor, έχει γραφτεί έτσι το πρόγραμμα ώστε να δίνει μήνυμα του πότε ξεκινάει το διάβασμα αρχείου και το πότε τελειώνει. Αν δε κλείσουμε την φόρμα, γίνεται σταμάτημα της φόρτωσης. Όσο δε φορτώνει το έγγραφο μπορούμε να μετακινούμε ή να αλλάζουμε το μέγεθος της φόρμας, που σημαίνει το τελευταίο ότι θα τρέξει κώδικας της Μ2000 για να ρυθμίσει το πώς θα εμφανίζονται τα στοιχεία ελέγχου. Αυτό μας κάνει να νομίζουμε ότι γίνονται παράλληλα εργασίες,αλλά στην ουσία κάθε γεγονός θα πάρει το χρόνο του για να εκτελεστεί. Επειδή ένα μενού που έχει σταλία μπορεί να ανοίξει και να καλέσουμε άλλη ή την ίδια εντολή, οι παράμετροι δεν διαβάζονται με την απλή Διάβασε αλλά με την Διάβασε Νέο, ώστε να φτιαχτούν σίγουρα νέες μεταβλητές. Πάντα το σύστημα τερματίζει το νεότερο προς το αρχαιότερο. Έτσι πάντα "καθαρίζουν" οι πιο πρόσφατες μεταβλητές.  Το σύστημα της Μ2000 έχει τις μεταβλητές σε μια γραμμή "χρόνου". Οι νεότερες διαγράφονται πρώτα. Σε άλλες γλώσσες αυτό γίνεται με το σωρό επιστροφής, return stack, αλλά εδώ ο σωρός επιστροφής είναι για το περιβάλλον της Μ2000, έτσι οι μεταβλητές που φτιάχνουμε πάνε σε μια ιδιόμορφη λίστα, που απλώνει στη λεγόμενη heap, σε όλη δηλαδή τη μνήμη. Αυτή η ιδιόμορφη λίστα κρατάει ονόματα και τιμές μαζί. Τα δε ονόματα έχουν προθέματα που τα διαφοροποιούν ως προς την θέαση. Ο αριθμός ονομάτων δεν ταυτίζεται πάντα με τον αριθμό τιμών/ Αυτό συμβαίνει γιατί κάποια ονόματα είναι "αναφορές" οπότε αναφέρονται σε τιμές που ήδη υπάρχουν άλλα ονόματα γι' αυτές. Τα γεγονότα του συστήματος παραθύρων χωρίζονται σε δυο ήδη, αυτά προς αναμονή, τα οποία δίνουν τιμές, και σε αυτά της άμεσης εξυπηρέτησης, τα οποία δίνουν με αναφορά τιμές. Πχ το γεγονός unload της φόρμας ζητάει να δώσουμε μηδέν ή μη μηδενική τιμή, με την τελευταία να σημαίνει, ακύρωση "αποφόρτωσης". Μπορούμε αν θέλουμε να μην "σηκώσουμε" τη αναφορά. Το σύστημα δεν το ενδιαφέρει το τι θα κάνουμε, η αλλαγή ή όχι της τιμής "εμάς" πονάει! Πχ αν έχουμε κάνει αλλαγές στο κείμενο στον διορθωτή meditor, και πατήσουμε το τετράγωνο που κλείνει τη φόρμα (θέλει διπλό κλικ, με ένα δεν πιάνει), τότε θα μας ρωτήσει αν θέλουμε να σώσουμε τις αλλαγές. Το κλείσιμο της φόρμας μπορεί να γίνει με alt+f4, από τη λίστα ελέγχου της φόρμας (δίπλα στο εικονίδιο, ένα μόνιμο μενού για χρήση και με το πληκτρολόγιο), με το τετράγωνο πάνω στην επικεφαλίδα της φόρμας (αντίθετα από το εικονίδιο), και μέσω του μενού File, με την επιλογή Quit. Όλες οι περιπτώσεις οδηγούν στον ίδιο κώδικα, που βλέπει αν πρέπει να ρωτήσει για να σώσει.

Παρακάτω είναι μια εικόνα από το σύστημα linux με τις δυο οθόνες, η δεύτερη είναι 32άρα τηλεόραση! Τρέχουν ταυτόχρονα τέσσερις παρουσίες του διερμηνευτή. Οι δυο δεξιά τρέχουν το info, από το οποίο ξεκίνησε το meditor, και αυτά έκλεισαν την κονσόλα (την ανοίγουν λίγο πλην τερματίσουν). Οι δυο αριστερά είναι τα προγράμματα που εκ κινήσαμε από τους διορθωτές. Το ένα από αυτά έχει ανοίξει ένα παράθυρο και περιστρέφει ένα 3D γραφικό. Δείτε επίσης στους διορθωτές. είναι ανοικτή η βοήθεια.




εδώ έχω ανοίξει ένα αρχείο 13.5Mbyte, με 575120 γραμμές (το πρόγραμμα ήταν ο παλιός meditor, δεν έχει το μενού Run!


Με το shift F2 ανοίγει φόρμα εισαγωγής για αναζήτηση προς τα πάνω (με shift F3 προς τα κάτω). Αν έχουμε επιλέξει μια λέξη τότε με τα F2 και F3 αναζητούμε χωρίς να βγει η φόρμα. Η λέξη καιρός είναι στην 240317 γραμμή (φαίνεται δίπλα στο μενού)


Παρακάτω είναι κώδικας της Μ2000, χρωματισμένος! Μπορούμε να ορίσουμε η εσοχή να είναι με tab ή με διαστήματα. Με F1 αλλάζουμε την εμφάνιση αναδίπλωση παραγράφου (με ή χωρίς).


Δείτε το νέο πρόγραμμα κατά την εγκατάσταση, ή απευθείας στο Github:
https://github.com/M2000Interpreter/Version9  στο info.gsb

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

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

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