Δευτέρα 25 Φεβρουαρίου 2019

Έκδοση 9.8

Η νέα έκδοση έχει μερικές βελτιώσεις ως προς την προηγούμενη:

Σχετικά με τη γλώσσα:
1.1. Ένα δύσκολο μέρος της, οι δείκτες σε ομάδες (αντικείμενα) αύξησαν την λειτουργικότητά τους. Θα αναφερθώ σε αυτό το κομμάτι ξεχωριστά. Αυτή όμως η αλλαγή άλλαξε και την έκδοση από 9.7 σε 9.8.

1.2. Η εντολή Παρεμβολή Στο απέκτησε και τρίτη παράμετρο. Τώρα μπορούμε να δώσουμε πρώτη παράμετρο τον αύξοντα αριθμό παραγράφου, δεύτερη την θέση στη παράγραφο και τώρα τρίτη τον αριθμό χαρακτήρων που θα διαγραφούν. Ενώ η παρεμβολή μετακινεί τους χαρακτήρες της παραγράφου, η τρίτη παράμετρος αφαιρεί κιόλας. Υπάρχει η εντολή Καταχώρηση που αλλάζει τη παράγραφο με μια άλλη ή αλλάζει από ένα σημείο και μετά, αλλά δεν αφήνει κάτι από την παλιά να υπάρχει στο τέλος της παραγράφου.


Σχετικά με το περιβάλλον:
2.1 Εξ ορισμού το χρώμα κονσόλας είναι ματζέντα , και το χρώμα γραμμάτων το κίτρινο. (ήταν μπλε και άσπρο αντίστοιχα).

2.2 Στο διορθωτή εμφανίζεται η γραμμή που έχει σφάλμα σε παρένθεση, σε εισαγωγικά και σε μπλοκ κώδικα.

2.3 Επεκτάθηκαν τα κουμπιά λειτουργιών που μπορούν να προγραμματιστούν. Τώρα είναι συνολικά 24, μια σειρά από το F1 μέχρι το F12 και μια δεύτερη σειρά τα ίδια και με το shift πατημένο.

Σχετικά με το συνοδευτικό πρόγραμμα (συλλογή προγραμμάτων σε ένα αρχείο) το info.gsb  έκδοση 3 (εκτός από ένα πρόγραμμα όλα τα άλλα είναι στα αγγλικά). Όλα τα προγράμματα φορτώνονται με το info.gsb. Για να δούμε το κώδικα κάποιου προγράμματος (εμφανίζονται τα ονόματα στην πληροφοριακή σελίδα του info), γράφουμε edit και το όνομά του ή το σ και το όνομα. Τρέχουμε τα προγράμματα με το όνομά τους. Για μερικά υπάρχουν και τα κουμπιά λειτουργιών (function keys).

3.1 kb  Το πιάνο, είναι πιο δυνατό στη βασική ένταση (πριν ήταν στο μισό της ενισχυμένης αλλά ακούγονταν σχετικά λιγότερο από το μισό). Επίσης μπήκε και δεύτερος τρόπος μετάβασης, από την αρχική οθόνη του info.gsb, και τυχαία επιλέγεται ένας από αυτούς. Ο παλιός είναι το dissolve, όπου η νέα εικόνα εμφανίζεται πάνω στη παλιά καθώς η παλιά εξαφανίζεται (η νέα εικόνα γίνεται δυναμικά, δηλαδή μετά την εμφάνιση της παλιάς, αλλά δεν το βλέπουμε, γιατί η Μ2000 ελέγχει την ανανέωση της φόρμας της, και δείχνει ό,τι θέλει όταν το θέλει). Ο νέος είναι το slide, η ολίσθηση της νέας εικόνας από δεξιά πάνω στην παλιά με κλιμακούμενη διαφάνεια,

3.2 Cal ένα ημερολόγιο με Ascii Art Snoopy. Τον κώδικα τον είχα γράψει για το Rosettacode.org Χρησιμοποιεί courier new, και εμφανίζει το ολοσέλιδο ημερολόγιο, μια φορά στα ελληνικά και μετά στα αγγλικά, από το 2019 έως το 2015. Η κονσόλα έχει διαμορφωθεί σε 132 χαρακτήρες επί 68 γραμμές. Το μέγεθος των χαρακτήρων είναι ανάλογο με το μέγεθος της οθόνης προβολής μας.



3.3 LZW πρόγραμμα που δείχνει πώς γίνεται η συμπίεση κειμένου κατά LZW.
3.4 MAZE πρόγραμμα δημιουργίας λαβύρινθου, με αποδόμηση χώρου.
3.5 MAZE2 και εδώ λαβύρινθος αλλά με αλγόριθμο αναζήτησης κατά βάθος, ή depth first search. Εμφανίζει διαδοχικά (μέχρι να πατήσουμε ένα πλήκτρο, στο πληκτρολόγιο ή στο ποντίκι) διάφορα μεγέθη λαβυρίνθων, από 10Χ10 έως 60Χ40 (η οριζόντια διάσταση μπορεί να είναι 10, 20, 30, 40, 50 ή 60 και η κάθετη 10, 20, 30 ή 40. Κάθε φορά πριν ξεκινήσει ένα λαβύρινθο το πρόγραμμα υπολογίζει ένα χρόνο ανανέωσης και έτσι βλέπουμε σε στιγμιότυπα την κατασκευή του.
3.6 ΤΤΤ η τρίλιζα. Υπάρχει περίπτωση να χάσει ο υπολογιστής αλλά αν δεν το βρούμε πώς, θα κερδίζει ή θα φέρνει ισοπαλία!
3.7 Pend το εκκρεμές, εξομοίωση ενός εκκρεμές με φυσική κίνηση.
3.8 Tr Το πρόγραμμα "Τρια" που δείχνει τρεις παλμογράφους, ο καθένας με ξεχωριστή βάση χρόνου (άλλος πάει πιο αργά, άλλος πιο γρήγορα), και έχουμε πηγές σήματος ένα τρίγωνο, ένα εξάγωνο και ένα κύκλο. Κάθε σχήμα έχει μια ακίδα και όπως περιστρέφεται μετακινεί μια γραφίδα στο καταγραφικό. Το καταγραφικό εμφανίζει διαχωριστικές γραμμές, κινούμενες μαζί με την ένδειξη, και όλα αυτά χάνονται στην άλλη άκρη του. Το πρόγραμμα έχει φτιαχτεί έτσι ώστε τυχαία όταν ξεκινάει να επιλέγει ένα μέγεθος κονσόλας και προσαρμόζει τα στοιχεία του ανάλογα. Μπορούμε με τα πλήκτρα του ποντικιού να δίνουμε φορά και δύναμη παραπάνω, έτσι ώστε οι ταλαντώσεις να αυξομειώνουν συχνότητα.
3.9 DEMO1, αυτό είναι πρόγραμμα 3d, με χρήση τετραδονίων. Υπάρχει ένα αντικείμενο στην Μ2000 που παίρνει πίνακες τετραδονίων και εκτελεί μαζικά πράξεις. Τα τετραδόνια γράφονται σαν συλλογές τεσσάρων αριθμών σε πίνακα τύπου Διάρθρωση (Buffer) μνήμης. Το αντικείμενο έχει τρεις άξονες σε μια κορυφή και στις άλλες άκρες των αξόνων υπάρχουν σφαίρες. Το σχήμα περιστρέφεται και κάνει βόλτες (με μια σειρά προσαρμοσμένων τυχαίων επιλογών, αλλάζει διεύθυνση και σημείο περιστροφής στο χώρο). Μπορούμε να το σταματήσουμε (αναβοσβήνει χωρίς να αλλάζει θέση). Όλα αυτά σε ένα παράθυρο χρήστη, είναι συνάμα παραθυρική εφαρμογή, έχει νήματα που εκτελούν λειτουργίες βάσει χρόνου, όπως ένα που φτιάχνει τη νέα θέση, ένα άλλο που εμφανίζει το γράφημα, ένα άλλο που δείχνει την ώρα, και ένα ακόμα που χρησιμοποιείται όταν μπαίνει το γράφημα σε αναμονή κίνησης. Στην κάτω γραμμή της φόρμας υπάρχουν μετρητές που μετράνε την εκτέλεση κάθε νήματος. Επίσης πάνω στο φόντο, και πίσω από το γράφημα εμφανίζεται και μια μέτρηση χρόνου, όσο πιο γρήγορα τόσα πιο μικρότερο νούμερο δείχνει. Η ταχύτητα εξαρτιέται και από τον φόρτο του συστήματος. Πχ αν ανοίξουμε το πρόγραμμα τέσσερις φορές, θα λειτουργεί στο ένα τέταρτο του χρόνου εκτέλεσης του ενός. Ουσιαστικά το νήμα για την εμφάνιση ενεργοποιείται κάθε 1000/60 του χιλιοστού του δευτερολέπτου, ή αλλιώς 60 πλαίσια το δευτερόλεπτο. Οπότε θα χάνουμε κάποια πλαίσια γιατί θα πηδάει φάση το νήμα (πχ όταν τελειώνει θα έχουν περάσει δυο φορές τα 1000/60 χιλιοστά, καθώς επίσης θα βλέπουμε τη κίνησή του που είναι συνάρτηση με το νήμα που αλλάζει τα στοιχεία του, να είναι αργότερη, αφού θα χάνει και αυτό φάση και θα παίζει λιγότερες φορές το δευτερόλεπτο.

3.10 MEDITOR, μια εφαρμογή με ένα παράθυρο, τέσσερα μενού, δυο στοιχεία κειμένου, ένα με χρωματισμό κώδικα για τη Μ2000 και ένα άλλο για εμφάνιση βοήθειας (χρησιμοποιεί τη βάση δεδομένων με τη βοήθεια στα αγγλικά και στα ελληνικά για πεντακόσια περίπου αναγνωριστικά της Μ2000. Το παράθυρο μπορεί να αλλάξει μέγεθος, και έχει την ίδια εμφάνιση σε κάθε λειτουργικό, από XP έως και Windows 10 καθώς και στο Linux Ειδικά στο linux δεν φαίνεται το κουμπί minimize, όπως και στη λίστα του control box είναι σκιασμένο, γιατί πρακτικά το wine που τρέχει τα προγράμματα των windows δεν εμφανίζει κάποιο εικονίδιο στην taskbar. Αν το είχα αφήσει να "παίζει" τότε θα πάταγε κανείς το minimize και θα έχανε το πρόγραμμα (θα μπορούσε απλά να το κλείσει από το taskmgr του wine)

3.11 Form44 Ένα πρόγραμμα που εμφανίζει πίνακα παραθύρων με πίνακα στοιχείων (δυο πλήκτρων - buttons), και όλα αυτά τα διαχειριζόμαστε από συναρτήσεις εξυπηρέτησης γεγονότων, που γυρνούν εκτός από τις παραμέτρους όπως για τα απλά παράθυρα και στοιχεία ελέγχου, τον αριθμό του στοιχείου και τον αριθμό της φόρμας (παράθυρου). Ξεκινάει το πρόγραμμα με μια μεταβλητή Ν=3 για να φτιάξει τρεις φόρμες, αλλά μπορούμε άνετα να δώσουμε Ν=40. Για κάθε φόρμα φτιάχνει και ένα νήμα για να ζωγραφίζει αυτόματα γραμμές. Μπορούμε να γράφουμε κύκλους με το αριστερό πλήκτρο του ποντικιού σε κάθε φόρμα. Επίσης με το δεξί πλήκτρο αφαιρούμε ή εμφανίζουμε το στοιχείο "τίτλος" της φόρμα (έχει πάνω και τα πλήκτρα που κλείνει η φόρμα, και αλλά μπορούμε να κλείσουμε την φόρμα με το alt+F4). Πριν το κλείσιμο μας ρωτάει μια φόρμα διαλόγου (messagebox), ενώ τα νήματα παίζουν από πίσω, αν θέλουμε να κλείσουμε τη φόρμα. Αν κλείσει η δεύτερη φόρμα τότε απενεργοποιεί την αυτόματη σχεδίαση. Αν κλείσει η πρώτη φόρμα κλείνουν όσες είναι ήδη ανοικτές. Κάποια πλήκτρα είναι διάφανα, δηλαδή καθώς ζωγραφίζουμε εμφανίζεται η ζωγραφιά πίσω τους. Τα πλήκτρα δουλεύουν και με ολίσθηση δεξιά (εκτός από κλικ με το ποντίκι).
Υπάρχει στη δεύτερη φόρμα το πλήκτρο test το οποίο ανοίγει τη φόρμα ελέγχου και μπορούμε να βλέπουμε το κώδικα όπως εκτελείται ακόμα και για τα νήματα. Μπορούμε να βάλουμε βηματική λειτουργία, να πατάμε ένα πλήκτρο για να εκτελείται η επόμενη εντολή. Η εξυπηρέτηση γεγονότων είναι εκτός βηματικής λειτουργίας.

3.12 List33. Εδώ έχουμε μια φόρμα με ένα στοιχείο Λίστα, στο οποίο αφαιρούμε τον δικό του δρομέα (που θα έκανε μαύρο το φόντο με λευκά γράμματα) και δίνουμε αλλαγή χρώματος, με επιλογή για τα ανενεργά στοιχεία. Η λίστα είναι διάφανη, και πίσω της υπάρχει κεντραρισμένο στη φόρμα το Hello Word ως λεζάντα (κείμενο ως γραφικό που εμφανίζεται βάσει συντεταγμένων γραφικών). Μπορούμε να αλλάξουμε το μέγεθος της φόρμας, και θα μετακινηθεί ταυτόχρονα και η λεζάντα. Επίσης αν δώσουμε ένα κλικ στη φόρμα γίνεται ταξινόμηση της λίστας. Όταν πατάμε με διπλό κλικ σε κάποιο στοιχείο της λίστας τότε παίρνει ένα τικ ✓   ή αφαιρείται αν έχει, και εμφανίζεται και στο τίτλο της φόρμας. Τα μπλοκαρισμένα στοιχεία, τα μαθαίνει η λίστα με ένα γεγονός, που διαβάζει μια κατάσταση (inventory) όπου έχουμε δώσει τα ονόματα, και έτσι δεν χρησιμοποιεί το εσωτερικό πεδίο "σκίασης¨.

3.13 Au Εδώ έχουμε πάλι μια φόρμα με δυο στοιχεία, το ένα είναι ένα στοιχείο Λίστα.Εισαγωγής (combo) και ένα απλό στοιχείο κειμένου Εισαγωγή (textbox). Οι λίστες εισαγωγής έχουν δυο μέρη, ένα στοιχείο κειμένου και μια αναδιπλούμενη λίστα (dropdown list). Επίσης έχουν τρεις διαμορφώσεις. Μια είναι με το στοιχείο κειμένου να μην αλλάζει  (χρησιμοποιείται και για μενού). Μια ακόμα όπου το στοιχείο κειμένου αλλάζει με ότι έχει η λίστα. Τέλος και αυτό δείχνει αυτό το πρόγραμμα, είναι με συμπλήρωση της λίστας κατά την εισαγωγή, και εμφάνιση καθώς πληκτρολογούμε  Καθώς μετακινούμε το δρομέα της λίστας ένα γεγονός γεμίζει το δεύτερο στοιχείο. Κάθε νέα εισαγωγή δίνει ένα γεγονός και με αυτό δίνουμε την εντολή για ταξινόμηση.

3.14 Linked_List Πρόγραμμα που υλοποιεί μια συνδεδεμένη λίστα χρησιμοποιώντας αντικείμενα που έχουν δείκτες σε άλλα αντικείμενα.

3.15 OOP1. Πρόγραμμα που υλοποιεί γεγονότα (χωρίς να χρησιμοποιεί τα αντικείμενα Γεγονότα, ούτε τα ελαφριά γεγονότα των Ομάδων), και στηρίζεται στο μοντέλο observer pattern. Επειδή  το πρόγραμμα είχε γραφτεί πριν οι ομάδες (τα αντικείμενα χρήστη) αποκτήσουν δείκτες (δηλαδή η κάθε ομάδα χωρίς δείκτη είναι μοναδική, και βρίσκεται σε ένα μέρος, είτε έχει όνομα είτε έχει θέσει σε πίνακα ή άλλο αντικείμενο καταχώρησης), η σύνδεση παρατηρητή με συνδρομητή γίνεται με τη λεγόμενη ισχνή αναφορά, η οποία δηλώνει το όνομα του αντικείμενου. Η διαφορά με τους δείκτες είναι ότι σε αυτούς υπάρχει απαρίθμηση ως προς το πόσοι δείκτες δείχνουν το ίδιο αντικείμενο, και αυτό σημαίνει ότι το αντικείμενο θα "χαλάσει¨ με το που θα διαγραφεί και ο τελευταίος του δείκτης. Στις ισχνές αναφορές δεν υπάρχει απαρίθμηση. Το αντικείμενο θα "χαλάσει" όπως οι τοπικές μεταβλητές. Έτσι οι ισχνές αναφορές έχουν το ελάττωμα να γίνονται άκυρες αν αυτό που δείχνουν δεν υπάρχει. Στο πρόγραμμα όλα τα αντικείμενα είναι "επώνυμα", και έτσι μπορούν να δώσουν ισχνές αναφορές και αυτές αν καταχωρηθούν για χρήση. Η χρήση βγάζει κανονικές αναφορές από τις ισχνές, και χρησιμοποιούνται πρόσκαιρα. Η κανονική αναφορά είναι όπως το πέρασμα με αναφορά μιας μεταβλητής. Εδώ αναφορά είναι αυτή ως το πέρασμα με αναφορά ενός αντικειμένου τύπου ομάδα. Το πρόγραμμα φτιάχνει τα πάντα από το μηδέν. Φτιάχνει τον EventHandler ο οποίος φτιάχνει τα widgets, ενώνουμε στα widgets τους listeners που στο πρόγραμμα είναι δυο τύπων με κοινό interface, το mouselistener και το keylistener.  Ο EventHandler πρώτα δημιουργεί τρία widgets, τα Β1, Β2 και Β3 (το κάνει αυτός για να δώσει την δική του ισχνή αναφορά κατά τη δημιουργία). Κατόπιν βάζουμε στον EventHandler τους listeners που θέλουμε (παίρνει ο μεν για το πληκτρολόγιο, τον αριθμό πλήκτρου, ο δε για το ποντίκι επίσης τον αριθμό πλήκτρου ποντικιού. Αυτή η διαδικασία δίνει δίνει έναν handler, δηλαδή το νούμερο στη λίστα εντός του EventHandler, και με αυτό το νούμερο και την αναφορά ενός από τα Β1, Β2 & Β3 κάνουμε καταχώρηση register. Τα Β1, Β2, Β3 δεν έχουν "ιδέα" για το πώς καταχωρήθηκαν. Έχουν μόνο μια αναφορά προς το EventHandler για να στείλουν ερώτημα προς τα πίσω. Ο EventHantler κοιτάει ένα προς ένα τα Events, (τους listeners) καλώντας το CheckEvent σε αυτά. Δεν χρειάζεται να έχει κάποια αναφορά σε αυτά, γιατί τα έχει ήδη σε πίνακα Events(). Το κάθε event έχει μια λίστα με τα widgets που θα καλέσει όταν συμβεί το γεγονός. Το Β1 έχει συνδεθεί με τα πλήκτρα 1 και 2, το Β1 με το πλήκτρο 1, το Β3 με το αριστερό πλήκτρο του ποντικιού. Μόλις το EventHandler δει ότι πατήσαμε το 1, δηλαδή τη στιγμή που καλούσε το listener που έχει το 1 ως γεγονός, παίρνει μια προς μια τις καταχωρημένες στη λίστα του αναφορές και καλεί μέσω της αναφοράς μια συγκεκριμένη συνάρτηση που έχουν όλα τα widgets (τα οποία έφτιαξε ο Eventhandler). Από αυτή τη συνάρτηση θα κληθεί πάλι προς τα πίσω (τώρα το widget καλεί πίσω το EventHandler), δίνοντας στοιχεία το id, το όνομα του γεγονότος (που μόλις πήρε) και μια αναφορά για αυτόν. Αυτό δηλαδή γίνεται υποτίθεται ως φιλτράρισμα από το widget, και αναφορά παρουσίας, ή υπενθύμιση στο κεντρικό. Το κεντρικό με την αναφορά θα ζητήσει το όνομα του widget, το οποίο μπορεί να αλλάζει, και έτσι δεν το κράτησε το κεντρικό (EventHandler) για να αποδώσει πληροφορίες στην οθόνη. Η οθόνη δηλαδή γίνεται το σημείο επιθεώρησης των γεγονότων. Ο EventHandler θα συνεχίσει στα επόμενα widgets, για να τα καλέσει όλα.
Το πρόγραμμα αρχικά δείχνει ότι "παρατηρεί". Μόλις πατήσουμε το 1 παίρνουμε αναφορές για δυο στοιχεία, τα Β1 και Β2, ενώ με τα πλήκτρα 2 και το αριστερό του ποντικιού για τα Β2 και Β3.


Θα βρείτε και άλλα προγράμματα, τα οποία θα περιγράψω σε άλλες αναρτήσεις!
ΓΚ


Παρασκευή 22 Φεβρουαρίου 2019

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

Λίγες μικρές διορθώσεις, η γλώσσα και το περιβάλλον της έχει ολοκληρωθεί.

Η  ενσωμάτωση ενός assembler x86, παραμένει ακόμα σε δοκιμαστικό στάδιο. Υπάρχει και μια σκέψη να μπει η C αντί για την assembly. Και για τις δυο περιπτώσεις υπάρχουν έτοιμες λύσεις γραμμένες σε vb6, από άλλους, αλλά για να μπει κάποιο από αυτά πρέπει όχι μόνο να αποδειχθούν σωστά λειτουργικά (δηλαδή ότι δεν έχουν σφάλματα) αλλά και να καθοριστεί η προσαρμογή τους στη γλώσσα.

Μπορούμε να γράψουμε απευθείας κώδικα μηχανής και να τον εκτελέσουμε, χωρίς assembler, και υπάρχει τέτοιο παράδειγμα σε Μ2000. Δεν υπάρχει όμως ο έλεγχος όπως στα προγράμματα της Μ2000, ώστε σε περίπτωση λάθους, πχ το πρόγραμμα να μην τερματίζει επειδή μια συνθήκη για τερματισμό δεν πρόκειται να συμβεί, μπορούμε να το τερματίσουμε με Esc, ή ctrl+C ή Break (στη χειρότερη περίπτωση, γιατί καθαρίζει το περιβάλλον). Στη γλώσσα μηχανής αυτό δεν είναι εφικτό χωρίς debugger, να τρέχει δηλαδή στο περιβάλλον του.

Τετάρτη 20 Φεβρουαρίου 2019

Revision 22 Version 9.7

This is the final revision for 9.7 version.

All updates for GUI elements done. Also minor bugs removed.

The help file update and include the # functions for arrays. The # functions call one another, if result is an array e.g if p is a pointer to array then we can perform a series of  functions like this p#Filter(...)#Map(...)#Fold(...)

When we exit from a module with an error and before we set Nothing to user forms, the forms was not unloaded, and all references to forms (from M2000 variables) lost. Now there is an automatic routine which unload the forms. So we can programming in M2000 editor and call modules without any problem, even if we have errors in program.

Calling a method for com objects prior use only passing by value, now we can pass by reference using & before the name of variable.

An example exist in info.gsb in the updated meditor.

Κυριακή 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

Παρασκευή 15 Φεβρουαρίου 2019

Revision 19, Version 97 Update (Gui Controls)

New from this revision:
1. Shift F9 in editor and in Editbox control toggle the editor mode from free line to center line (by default is the center line, which means we type in the center line, if there are enough  lines before the current one)
2. The directory/file dialog form now can take keys as we type and automatic find the file. If we move cursor then letters erased, also backspace erase letters too (we didn't saw letters but we saw the result, what we find)
3. Popup menu and the list of Combo control now move the cursor as we hover over it. Menus may have more lines, so we can hold the left mouse button to automatic scroll up or down (also there is a hidden vertical scroll bar, which get visible, at some state, so we can scroll using it, or we can use keys, like page up, page down, home and end).
4. Color, Font, File dialogs now use better the mouse wheel.


Δευτέρα 11 Φεβρουαρίου 2019

Revision 16, Version 9.7

1. Refactoring for more speed.
2. Addition: Functions in Math object (hyperbolic trigonometric functions)
3. Identifiers from M2000 vocabulary can be used variables/functions, temporary in modules and functions.
4. Addition of modules (M2000 programs) in info.gsb file.
When we install the language, the info.gsb saved in program directory. We have to do this:

dir appdir$
load info

so now we can press F1 to save the file in M2000 user directory (we can open this directory in explorer using Win Dir$  where Dir$ is the current directory as string and Win is the shell statement of M2000)

This is the screen of m2000 console when we load info.gsb (there are commands which run automatic). Info.gsb has 7749 lines. The modules have names as the statement Modules ? return. Also in editor we can use F12 to display a list in a form, and we can click in any name and we get the code in that form.

We can open for edit the info.gsb without loading the modules, using the name in quotation marks (we press Esc to return and save the text, or Shift+F12 to abandon any change):
Edit "info.gsb"

The cyan border help for TV, so we have a safety area to display.





New modules are:


kb, a keyboard for playing music (run on Linux through Wine but with no sound, because utilize the Midi, and Wine has no sound banks to reproduce sound)



FL, a demonstration of rotating flowers. Moving the mouse they separate more, but pressing left mouse button all flowers follow the mouse. Right mouse for exit, with a nice effect of rotating zooming text.

tr

SH, demonstration: moving the console, and how we can get the desktop as an image.




TR, Three oscilloscopes, we can accelerate in any direction.



Σάββατο 9 Φεβρουαρίου 2019

Revision 15 Version 9.7

Some last minute corrections. Also info.gsb has some added modules: Demo1 for simple 3d graphics in a user form (window), Json (using Lib3 module as library), BJ a black jack simulator, for 4 players.

Corrections:
Wine: From revision 15 was a fault in Esc key, so now is ok (this not happen when the same program, the M2000 interpreter run on a Windows OS).

Fix for For object {} so now old programs can run as expected.

To understand the next fix: When I change the Case in Select Case from executing one statement or a block of statements, to including many statements in one line (but not in block of statements), I gave to the method execution on group objects more than one statement. This was not bad, except for some special statements like restart and continue, which have to interpret at the level from we wish to get the effect of the statement. So the group method executed in a deeper level, and return without
allowing the execution of other statements, onto the deep level, but instead   (inside the functions of interpreter - interpreter is one top function calling other inside, and some of them may call interpreter again, and that is the meaning of the level).

Syntax color: Now anything is after Then and Else are as in a first line, so we get the proper color for operator =, which is white when we use it to assign a value, or yellow when used for comparisons.