Πέμπτη, 11 Αυγούστου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 29ο

17. Αντικείμενα γραφικού περιβάλλοντος (GUI)  της Μ2000. 
Ο διερμηνευτής της Μ2000 είναι γραμμένος σε γλώσσα που δίνει την δυνατότητα χρήσης παραθύρων, που έχουν προκαθοριστεί με τα στοιχεία που θέλουμε πριν την μετάφραση σε εκτελέσιμο αρχείο. Έτσι δεν είναι δυνατόν να δώσει η Μ2000 τις φόρμες και τα στοιχεία της Visual Basic, καθώς και να φορτώνει "ξένα" στοιχεία (τύπου ocx, activeX δηλαδή). Μετά την ενσωμάτωση γεγονότων στη  γλώσσα και επειδή όλα τα στοιχεία για τις σταθερές φόρμες στηρίζονται σε ένα στοιχείο χρήστη (user control), βρέθηκε μια διέξοδος, που έδωσε πραγματικά φόρμες με στοιχεία που θα μπορούσε να ορίσει ο χρήστης καθώς τρέχει το εκτελέσιμο του διερμηνευτή. Το πρόβλημα που παλαιότερα δεν επέτρεπε να φτιαχτεί κάτι τέτοιοι ήταν η ανάγνωση των γεγονότων από την γλώσσα. Αυτό λύθηκε με την ένταξη των γεγονότων (Events) στη γλώσσα. 

Πώς λειτουργεί το γραφικό περιβάλλον:

Ουσιαστικά κάθε φόρμα που φτιάχνουμε είναι αντίγραφο μιας φόρμας GuiM2000, και πάνω σε αυτήν υπάρχουν δυο στοιχεία, η επικεφαλίδα και ένα μικρό πλαίσιο για να τραβάμε τη φόρμα από την κάτω δεξιά γωνία. Η επικεφαλίδα είναι ένα στοιχείο glist το οποίο είναι και το μοναδικό user control που φτιάχνει όλες τα πλαίσια διαλόγου της Μ2000 (όπως το πλαίσιο διαλόγου Ρυθμίσεις, ή το Έλεγχος), αλλά και το αντικείμενο επεξεργασίας κειμένου. Ουσιαστικά το glist πάνω στη φόρμα GuiM2000 μπορεί να φορτωθεί πολλές φορές. Με το παρακάτω παράδειγμα μπαίνει κανείς στο νόημα:

Αν έχουμε μια φόρμα ΑΛΦΑ (δώσαμε αυτό το όνομα με την Όρισε) και θέλουμε να βάλουμε ένα στοιχείο Πλήκτρο (Button), τότε ένα νέο στοιχείο glist φορτώνεται σε μια φόρμα GuiM2000 (ξέρουμε ποια φόρμα είναι, γιατί το όνομα ΑΛΦΑ είναι αναφορά στη φόρμα) και σε ένα νέο αντικείμενο GuiButton παρέχεται η αναφορά στο στοιχείο glist και μια αναφορά στη φόρμα με όνομα Callback, και στο GuiControls της φόρμας GuiM2000, προστίθεται μια αναφορά για το GuiButton (το οποίο δεν  είναι Gui, αλλά κάνει sub classing το glist). Όταν κάνουμε κλικ στο glist (το πραγματικό αντικείμενο) τότε το σήμα πάει στο GuiButton  και αυτό καλεί την μέθοδο CallBack του αντικειμένου CallBack (είναι η αναφορά στο GuiM2000 μέσα στο GuiButton). Η μέθοδος CallBack ανήκει στο GuiM2000 και το μήνυμα πηγαίνει εκεί που έχει οριστεί κατά την Όρισε που δήλωσε τη φόρμα. Πριν η φόρμα καταστραφεί, (unload), πριν ορίσουμε  να είναι "τίποτα", τότε αποδεσμεύονται οι αναφορές μεταξύ στοιχείων γραφικών glist και GuiM2000 και του στοιχείου GuiButton. Για το λόγο αυτό χρησιμοποιείται η λίστα GuiControls στην φόρμα GuiM2000 η οποία έχει αναφορές στο GuiButton, και σε κάθε στοιχείο καλεί τη μέθοδο deconstruct

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

Τα μηνύματα από τη φόρμα GuiM2000 μπορούν να είναι απλά μιας εκπομπής, ή αν χρησιμοποιούμε ειδικό στοιχείο γεγονός να είναι πολλαπλής εκπομπής (multicast), και τα δύο όμως δεν επιστρέφουν τιμές στο αντικείμενο, που έστειλε τα μηνύματα.  Υπάρχουν όμως μηνύματα για το GuiM2000 που δεν εκτελούνται με τον "απλό" τρόπο αλλά με άλλο ξεχωριστό κανάλι, κλήσεων (CallBackNow) ο οποίος περνάει by reference (μέθοδος copy in - copy out) τις τιμές.

Μια διαφορά με άλλα συστήματα για γεγονότα είναι ότι δεν χρειάζεται να γνωρίζει ο διερμηνευτής ποια γεγονότα θα εξυπηρετήσουμε. Για όλα τα γεγονότα υπάρχει εκπομπή, και αν δεν υπάρχει ανταπόκριση τότε το μήνυμα χάνεται (διαγράφεται). Με την χρήση του απλού τρόπου μπορούμε να μαζεύουμε τα μηνύματα για να τα ικανοποιήσουμε ποιο μετά!  Ο άμεσος τρόπος (CallBackNow) δεν μπορεί να "μαζευτεί" αλλά αν έχουμε ανταπόκριση (συνάρτηση με το όνομα της φόρμας και το όνομα_μηνύματος) τότε θα έχουμε επιστροφή κατάστασης διαφορετικής από την "τωρινή" (δηλαδή αυτή που περιγράφουν οι τιμές που συνοδεύουν το μήνυμα).



17.1.  Φόρμες Χρήστη

Οι φόρμες χρήστη, είναι παράθυρα που δημιουργεί ο χρήστης, και έχουν τα παρακάτω βασικά χαρακτηριστικά:

  • Τίτλο  (Ιδιότητα "Title"). Το πλαίσιο του τίτλου μετακινεί το παράθυρο αν με το ποντίκι κρατήσουμε πατημένο το αριστερό πλήκτρο. Η πάνω αριστερή γωνία δεν μπορεί να βγει εκτός επιφάνειας εργασίας. Στο πλαίσιο αυτό υπάρχει αριστερά το πλαίσιο για το κλείσιμο (απόκρυψη) του παραθύρου. Όταν επιλέγουμε ένα παράθυρο τότε εμφανίζεται ο τίτλος ως τίτλος της εφαρμογής. Αν ο τίτλος δεν χωράει στο πλάτος του πλαισίου του, τότε αναδιπλώνει όσες γραμμές χρειάζεται αλλά δεν μεγαλώνει το πλαίσιο. Μπορούμε να αλλάξουμε μέγεθος γραμμάτων στο τίτλο, και να μεγαλώσουμε το πλαίσιό του (θα δούμε παράδειγμα σε αυτό). Υπάρχει τρόπος να επιλέξουμε το αντικείμενο του πλαισίου του τίτλου και να το "εξαφανίσουμε".
  • Επίπεδο. Είναι η επιφάνεια κάτω από το πλαίσιο, η οποία μπορεί να χρησιμοποιηθεί ως οθόνη και έχει δυνατότητα για χωριστή οθόνη (το κάτω μέρος να κάνει ολίσθηση, scroll), χωρίς να κρατάει στοιχεία που χάνονται στην ολίσθηση. Όλες οι εντολές γραφικών λειτουργούν (εκτός από τα hardware sprites, γιατί αυτά υπάρχουν μόνο για την κονσόλα, το επίπεδο πίσω από τα παράθυρα, το οποίο μπορούμε να το έχουμε φανερό ή όχι). Επίσης δεν επιτρέπονται οι εντολές για εισαγωγή. Για εισαγωγή τιμών χρησιμοποιούμε μόνο στοιχεία φορμών όπως θα δούμε παρακάτω. Με την εντολή Παράθυρο μπορούμε να δώσουμε το μέγεθος των γραμμάτων και το μέγεθος της φόρμας σε twips, μέσα από την εντολή επίπεδο. Και η εντολή φόρμα μπορεί να δώσει συγκεκριμένο αριθμό χαρακτήρων και γραμμών στη φόρμα χρήστη.
  • Μέγεθος Επιπέδου. Αν έχουμε επιλέξει την ιδιότητα "Resizable" να είναι αληθείς τότε είναι ενεργό ένα μικρό στοιχείο στην κάτω δεξιά γωνία, με το οποίο μπορούμε να αλλάξουμε μέγεθος στη φόρμα και να στείλουμε το γεγονός "Resize" ώστε να ετοιμάσουμε κατάλληλα το επίπεδο.
  • Διαφάνεια. Υπάρχει η μέθοδος"Opacity" η οποία αλλάζει την διαπερατότητα, αλλά επίσης δηλώνει και το χρώμα που θα είναι πάντα 100% διαπερατό.
  • Μέθοδος Εμφάνισης κατά τύπο Modal. Μπορούμε να επιλέξουμε την εμφάνιση της φόρμας με ταυτόχρονο πάγωμα των άλλων φορμών (μπορούν να ανανεώνουν στοιχεία, αλλά δεν μπορούμε να τα μετακινήσουμε ή να τα επιλέξουμε). Η μέθοδος εμφάνισης λέγεται "Show" και μια μη μηδενική τιμή δηλώνει ότι θα είναι Modal.
  • Μέθοδος μετακίνησης και μεγέθους. Μπορούμε με την μέθοδο "move" να μετακινήσουμε προγραμματιστικά την φόρμα μας και να δώσουμε (προαιρετικά) το μέγεθός της. (υπάρχει εξ ορισμού ένα μέγεθος, σε twips 8000 X 5000.
  • Μέθοδος για άμεσο κλείσιμο: "CloseNow".
  • Μέθοδος για ανανέωση όλων των στοιχείων: "RefreshALL"
  • Μέθοδος εμφάνισης: "Show". Καθορίζει το πώς θα εμφανιστεί μια φόρμα. (δες παραπάνω την αναφορά στο τύπο εμφάνισης Modal).
  • Μέθοδος για εμφάνιση όλων των στοιχείων: "ShowmeALL" (αν το οποιοδήποτε στοιχείο έχει την ιδιότητα enable αληθές τότε δίνει το σύστημα μια εντολή σχεδιασμού, αυτή η εντολή είναι μέρος της "Show"
  • Ιδιότητα που δείχνει αν είναι ορατή ή όχι η φόρμα: "Visible"
  • Ιδιότητα για το ύψος του τίτλου: "TitleHeight"
  • Μέθοδος για τη ρύθμιση γραμματοσειράς τίτλου: "FontAttr", δέχεται τρεις παραμέτρους, μια για τη γραμματοσειρά και προαιρετικά το μέγεθος και αν είναι φαρδιά ή όχι (εξ ορισμού είναι στην επιλογή Φαρδιά).
  • Μέθοδος για τη ρύθμιση γραμματοσειράς στοιχείων: "CtrlFontAttr" (ομοίως όπως το προηγούμενο)
  • Ιδιότητες για την γραμματοσειρά στα στοιχεία (μόνο ανάγνωση, για να δούμε τι έχουμε στα στοιχεία): "CtrlFontName", "CtrlFontsize", CtrlFontBold"
  • Άνοιγμα πρόσκαιρης φόρμας πάνω στη φόρμα με την μέθοδο "PopUp". Αν κάνουμε κλικ σε άλλη φόρμα ή στην αρχική τότε η φόρμα τύπου popup αυτόματα κλείνει. Παίρνει τρεις παραμέτρους, τη φόρμα που θα χρησιμοποιήσουμε ως Popup και δυο μεταβλητές για την θέση Χ και Υ του δείκτη την στιγμή που κάνουμε κλικ πάνω στη φόρμα (παράγεται γεγονός που μας δίνει αυτά τα στοιχεία καθώς και πιο πλήκτρο του δείκτη - ποντίκι- έχουμε πατήσει, αν έχουμε πατήσει).
  • Ιδιότητα για εμφάνιση του τίτλου και του πλαισίου για μετακίνηση: "Header", δέχεται αληθές ή ψευδές (true/false), και είναι και για ανάγνωση και για εγγραφή
Παράδειγμα με φόρμα που όταν κάνουμε κλικ εξαφανίζεται και εμφανίζεται διαδοχικά. Στο παράδειγμα μπορούμε να αφαιρέσουμε από τη πρώτη γραμμή το Γεγονός Ένα (ώστε να χρησιμοποιηθεί ένα αυτόματα αποδιδόμενο), καθώς και παρακάτω η συνάρτηση Μία και η εντολή Γεγονός που συνδέει αυτή τη συνάρτηση. Όταν βάζουμε ένα δικό μας αντικείμενο γεγονός τότε μπορούμε να παίρνουμε "ανάδραση" ή να επεκτείνουμε τον έλεγχο, αφού τα μηνύματα από τη φόρμα θα περάσουν από αυτή τη συνάρτηση. Εδώ να υπενθυμίσω ότι τα μηνύματα που δέχονται απάντηση/επιστροφή, (έχουν πέρασμα τιμών με αναφορά) δεν μπαίνουν από αυτό το γεγονός αλλά πάντα εκτελούνται με άμεσο τρόπο (δεν είναι φανερός στο χρήστη).

Στη φόρμα, στο παράδειγμα, δεν βάλαμε κάποιο στοιχείο ελέγχου. Όμως βλέπουμε τον τίτλο και το τετραγωνάκι αριστερά που κλείνει τη φόρμα (αυτό παράγει το μήνυμα Unload, και είναι άμεσο, δέχεται δηλαδή επιστροφή σε μια μεταβλητή οκ. Αν δεν είχαμε καμία χρήση του οκ στο τμήμα, τότε δεν θα υπήρχε θέμα με μια απλή Διάβασε. Αν όμως υπάρχει η οκ, τότε θα έχουμε θέμα επειδή δεν μπορούμε να αποδώσουμε νέα αναφορά σε μεταβλητή που ήδη δείχνει κάπου. Η χρήση της Διάβασε Νέο κάνει κάτι άλλο, δημιουργεί μια μεταβλητή οκ ακόμα και αν υπάρχει ήδη, και δίνει την αναφορά, και μόλις τερματίσει η συνάρτηση Απλό.unload διαγράφεται η τελευταία οκ, αυτή που δημιουργήθηκε. Να θυμίσω εδώ ότι ενώ στις κανονικές κλήσεις συναρτήσεων οι μεταβλητές σχετίζονται με τα ονόματα συναρτήσεων, σε αυτές που καλούνται από γεγονότα (αυτό το κάνει η συνάρτηση οκν$()) οι κλήσεις είναι σαν να έγιναν στο τμήμα, και για το λόγο αυτό μπορεί να προκύψει πρόβλημα, αν δεν χρησιμοποιήσουμε σωστά τις Διάβασε και τα ονόματα των μεταβλητών. 

Στην συνάρτηση Μία φαίνεται πως καλούμε μια συνάρτηση τοπικά, (η συνάρτηση μαζί με τα περιεχόμενα-παραμέτρους είναι σε αλφαριθμητικό). Εσωτερικά ο μεταφραστής αλλάζει το όνομα της συνάρτησης με το όνομα της Μία, το οποίο όμως έχει ήδη αλλάξει με μια εντολή Τμήμα που έβαλε στο κώδικα η συνάρτηση οκν$() στην εντολή Γεγονός όπου συνδέσαμε το γεγονός με την συνάρτηση! (Στα γεγονότα μπορούμε να συνδέουμε περισσότερες από μια συναρτήσεις, και αυτό είναι το λεγόμενο multicast)

Στο πρόγραμμα θέλω να φανεί το πώς συνδέουμε μια μεταβλητή με ένα αντικείμενο-ιδιότητα. Δηλαδή με την εντολή Με Απλό, "visible" ως ορατό δημιουργούμε ένα αντικείμενο propreference (έτσι ονομάζεται μέσα στο κώδικα της Μ2000 και έτσι εμφανίζεται ως τύπος) το οποίο συνδέει την ιδιότητα  ενός συγκεκριμένου αντικείμενου με ένα όνομα . Η μεταβλητή ορατό δεν είναι μια απλή μεταβλητή, και δεν μπορούμε να την χειριστούμε ως απλή μεταβλητή, αλλά έχει την ιδιότητα της εγγραφής και της ανάγνωσης (αν πράγματι το παρέχει το αντικείμενο), και η γραφή γίνεται με το ίσον (ως αντικατάσταση τιμής) και η ανάγνωση απλά με το όνομα στο δεξί μέρος.

Όρισε Απλό Φόρμα Γεγονός Ένα
Επίπεδο Απλό {
      Διάστιχο 0 \\ 30, 60, ...
      Γραμματοσειρά "Arial Black"
      Παράθυρο 16, 8000,6000 \\ μέγεθος γραμμάτων, Χ, Υ σε twips
      \\ τα πραγματικά Χ και Υ θα είναι εδώ Χ.Σημεία και Υ.Σημεία
      \\ Η εντολή Παράθυρο κόβει ανάλογα για να κρατήσει το πλάτος όσο ακριβώς το κείμενο
      Οθόνη 1,0 \\ χρώμα όπως #AAFF22 ή Χρώμα(r,g,b), αριθμός χωρίσματος οθόνης
      Δρομέας 0, Ύψος Δια 2 \\ Ύψος Πλάτος είναι σε χαρακτήρες
      Αναφορά 2,"Hello World"
}
Μέθοδος Απλό, "Show"
Με Απλό , "visible" ως ορατό
\\ τα γεγονότα και οι μέθοδοι είναι σε μία γλώσσα, αγγλική
Συνάρτηση Απλό.Unload {
             Διάβασε Νέο &οκ
             οκ=Αληθές
}
Στη Κ=Ψευδές
Συνάρτηση Απλό.Click {
      Με Απλό, "Title", "Πάτα άλλη μια"
      Τύπωσε ορατό
      Αν Κ Τότε Πληκτρολόγιο "Α"
      Κ~
}
Συνάρτηση Μία {
      Διάβασε μνμ$
      Σημ 1 : Τύπωσε μνμ$
      Δες {Κάλεσε τοπικά μνμ$}
}
Γεγονός Ένα Νέο οκν$(&Μία())
Τύπωσε ορατό
α$=Κομ$ \\ περιμένει να πατήσουμε κάτι
Γεγονός Ένα Κράτησε \\ τώρα δεν ακούει
ορατό=Ψευδές
Τύπωσε ορατό
Για ι=1 εώς 10 {
      \\ δεν υποστηρίζει αυτό ορατό~
      \\ πρέπει να το δώσουμε κανονικά με ορατό = όχι ορατό
      \\ η ορατό είναι ειδικό αντικείμενο, που συνδέει ένα όνομα με μια ιδιότητα
      ορατό= όχι ορατό
      ανανέωση
      Αναμονή 500
}
Τύπωσε Τύπος$(ορατό)
Όρισε Απλό Τίποτα


Στο παρακάτω παράδειγμα δημιουργούμε μια απλή φόρμα με δυνατότητα να αλλάξουμε τις διαστάσεις της με το ποντίκι, από τη κάτω δεξιά γωνία:

Όρισε Απλό Φόρμα
Επίπεδο Απλό {
      Διάστιχο 0
      Γραμματοσειρά "Arial Black"
      Παράθυρο 16, 8000,6000
      Οθόνη 1,0
      Δρομέας 0, Ύψος Δια 2
      Αναφορά 2,"Γειά σου Κόσμε"
}
Με Απλό,"Sizable", Αληθές
Function Απλό.Resize {
      Επίπεδο Απλό {
            Τύπος 16
            Cls 1,0
            Οθόνη 1,0
            Δρομέας 0, Ύψος Δια 2
            Αναφορά 2,"Γειά σου Κόσμε"
      }
}
Μέθοδος Απλό, "Show",1
Όρισε Απλό Τίποτα


Δείτε επίσης ότι έχουμε ανοίξει τη φόρμα με τύπο modal (αυτό κάνει το 1 που δίνουμε στη "Show")

Συνεχίζεται...




Δευτέρα, 8 Αυγούστου 2016

Γεια χαρά από Καναλάκι Πρέβεζας

Συνεχίζω τις διακοπές για έναν ακόμα μήνα, και από Σεπτέμβριο ξεκινώ πάλι εργασία. Προς το παρόν γράφω το κεφάλαιο 17 για τις φόρμες (GUI) της Μ2000. Είναι πολύ κουραστικό θέμα και για το λόγο αυτό δεν δείχνω και πολύ ζήλο!
Οπότε καλό χειμώνα για όσους τέλειωσαν ή τελειώνουν με την άδεια και τα λέμε σύντομα!

Παρασκευή, 1 Ιουλίου 2016

Το μικρό εγχειρίδιο της Μ2000 (pdf) νέο 2-7-16

Το μικρό εγχειρίδιο της Μ2000
78 σελίδες με θέματα και προγράμματα σε Μ2000.

https://drive.google.com/open?id=0BwSrrDW66vvvS2lzQzhvZWJ0RVE


Δεν αντικαθιστά το εγχειρίδιο χρήσης που υπάρχει στο Blog και το οποίο θα εμπλουτίζεται. Είναι μια προσέγγιση με πίνακες όπου περιγράφεται η γλώσσα. Αυτά που περιγράφονται μπορούν να αναζητηθούν σε προγράμματα είτε που υπάρχουν στο κείμενο, είτε σε άλλα που βρίσκονται ήδη στο blog αυτό.

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

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

Πέμπτη, 30 Ιουνίου 2016

Αναθεώρηση 11 (Έκδοση 8.2) - Αλλαγή μεγέθους Stack

Κάνοντας έλεγχο, που κράτησε μερικές μέρες, βρήκα κάτι στο οποίο δεν έχω λογική εξήγηση, αλλά διόρθωσε ένα θέμα.
Είχα αυξήσει το μέγεθος του stack του ΕΧΕ προγράμματος (που καλεί το m2000.dll) ώστε να μπορεί η Μ2000 στις συναρτήσεις να έχει αναδρομή μέχρι 14500 κλήσεις. (στις ρουτίνες η αναδρομή ορίζεται με την εντολή ΟΡΙΟ.ΑΝΑΔΡΟΜΗΣ και μπορεί να είναι πολύ μεγάλη, π.χ. 50000 κλήσεις και παραπάνω, επειδή οι ρουτίνες έχουν κλήσεις εντός αντικείμενου εκτέλεσης, με χρήση σωρού ξεχωριστού - ενώ οι συναρτήσεις και τα τμήματα έχουν η καθεμία αντικείμενο εκτέλεσης και αυτό επιβαρύνει το σύστημα, επειδή όλα αυτά χρησιμοποιούν τον ίδιο σωρό καταχώρησης "αυτόματων" μεταβλητών).
Το πρόβλημα που αντιμετώπισα ήταν με το WebBrowser control. Η Μ2000 έχει ένα μόνο WebControl πάνω στη κονσόλα και μπορεί να δείχνει σελίδες html. Το πρόβλημα είναι ότι ο σωρός κλέβει δεν ξέρω τι και δεν αφήνει το στοιχείο αυτό να δείξει φωτογραφίες (στην αρχή αυτό είδα) και μετά κατάλαβα ότι δεν αφήνει και τα βίντεο να παίξουν. Όσο μείωνα το σωρό τόσο εξαφανίζονταν τα προβλήματα. Έπρεπε να βρω το βέλτιστο, και ίσως το πέτυχα. Έτσι τώρα μπορούμε να ανοίξουμε το www.youtube.gr
Με την εντολή:
Αναλόγιο www.youtube.gr

άλλες εντολές:
Αναλόγιο "about:Hello"

δείτε Βοήθεια Αναλόγιο
Με το Esc κλείνουμε το αναλόγιο, (σε περίπτωση που το έχουμε σε φουλ οθόνη)

Επιπλέον έβαλα και ένα τρόπο να ενημερώνεται το σύστημα για το τρόπο emulation του στοιχείου (από την αρχή είναι για τον Explorer 6.0, και αυτό δεν είναι καλό).


Το μέγεθος Stack είναι τώρα στα 3375, πολύ μικρό σε σχέση με το 14500, αλλά πρακτικά δεν έχουμε ποτέ τόση μεγάλη αναδρομή.
Αν θέλουμε όμως μπορούμε με χρήση ρουτινών να έχουμε πολύ μεγαλύτερο αριθμό αναδρομών.
Επειδή το μέγεθος του σωρού το αλλάζουμε στο exe αρχείο, αν χρησιμοποιήσουμε το m2000.dll σε άλλο πρόγραμμα τότε ψευδώς θα νομίζει ότι έχει 3375 όριο αλλά μπορεί να πέσει.
Υπάρχουν οι παρακάτω εντολές που βοηθούν. Ο διακόπτης +REC βάζει το εξ ορισμού όριο (είναι γραμμένο στο dll), ενώ το -REC βάζει το 300
monitor
Διακόπτες "+REC"
Διακόπτες "-REC"
Μπορούμε μέσω του regedit να αλλάξουμε το όριο στο παρακάτω κλειδί
HKEY_CURRENT_USER\Software\m2000v5\funcdeep

Γ.Κ.

Τετάρτη, 22 Ιουνίου 2016

Η ώρα της BASIC - Παράδειγμα από το 1964.

Σήμερα η ανάρτηση έχει να κάνει με την γλώσσα BASIC. Η Μ2000 έχει στοιχεία της BASIC και εδώ θα δούμε ένα πρόγραμμα από το εγχειρίδιο της πρώτης BASIC του 1964:


Εδώ με μερικές αλλαγές για να λειτουργήσει σωστά (δείτε ότι δεν έχουμε πολλές αλλαγές, μόνο η εντολή DATA πήγε στην αρχή (στη Μ2000 έχει σημασία που είναι), και στο τέλος μπήκε ένα IF που ελέγχει αν έχουμε στοιχεία ακόμα και αν ναι κάνει επιστροφή. Υποψιάζομαι ότι η παλιά Basic όταν δεν είχε στοιχεία, απλά τερμάτιζε! Επίσης υπήρχε ένα θέμα με τη ρίζα. Η Μ2000 δεν δέχεται όρισμα μηδέν ή αρνητικό. Όπως είναι γραμμένο στο εγχειρίδιο ο έλεγχος της D γίνεται αφού τρέξει η εντολή με τον υπολογισμό της ρίζας. Στη Μ2000 δεν μπορούμε να δώσουμε μηδέν άρα αλλάζουμε τη σειρά εντολών, και επιπλέον βάζουμε την συνάρτηση ABS() που δίνει το απόλυτο νούμερο (δηλαδή αφαιρεί το πρόσημο).

Δείτε τους αριθμούς γραμμών. Ο διορθωτής βάζει αυτόματα αριθμούς αν δει ότι η προηγούμενη γραμμή ξεκινάει με αριθμό (ανά παράγραφο ελέγχει όχι ανά γραμμή, οπότε σε αναδίπλωση λέξης, δεν έχουμε θέμα. Με F1 βάζουμε ή βγάζουμε την αναδίπλωση λέξης στον διορθωτή). Στη εικόνα κάτω έχω δώσει τις εντολές CLS, ROW-1 και μετά το EDIT B και άνοιξε έτσι ο διορθωτής:



\\ basic
  1 FORM 80,40
  2 DATA 1, -2, -3, 1, -4, 4, 1, 0, 2
  5 PRINT "QUADRATIC EQUATION"
  6 PRINT
10 READ A, B, C
20 LET D = B * B - 4 * A * C
30 LET S = - B / ( 2 * A )
40 IF D = 0 THEN GOTO 100
50 LET T = SQRT(ABS( D) ) / (2 * A)
60 IF D < 0 THEN GOTO 200
70 PRINT A, B, C, " TWO REAL ROOTS"
80 PRINT "ROOTS =";S+T, S-T
90 GOTO 300
100 PRINT A, B, C, " ONE ROOT"
110 PRINT "ROOT ="; S
120 GOTO 300
200 PRINT A, B, C, " COMPLEX ROOTS"
210 PRINT "REAL PART ="; S, " IMAGINARY PART ="; T
300 PRINT
310 IF NOT EMPTY THEN GOTO 10


Με λίγες αλλαγές έχουμε και το πάνω δεξιά πρόγραμμα της σελίδας τους εγχειριδίου του 1964
\\ LN() natural logarithm
\\ Log() base 10 logarithm
010 S=0
020 DEF FNL(X)=LN(X)/LN(10)
030 FOR I=1 TO 100
040 S+=FNL(I)
050 NEXT I
060 PRINT S/100
070 S=0
080 FOR I=1 TO 100
090 S+=LOG(I)
100 NEXT I
110 PRINT S/100



Σε Wine (Ubuntu Studio)

Δευτέρα, 20 Ιουνίου 2016

Μικρή αναθεώρηση 9 (Έκδοση 8.2) και παραδείγματα

1. Η αναθεώρηση 9 έλυσε ένα παλιό bug, όπου δεν άφηνε να αλλάξουμε απευθείας μια συνάρτηση ή ένα τμήμα μιας ομάδας. Η λύση μέχρι πριν την αλλαγή ήταν η συγχώνευση με μια νέα ομάδα με ίδια ονόματα στα τμήματα που θέλαμε να αλλάξουμε. Το παρακάτω παράδειγμα βγάζει λάθος στις παλαιότερες εκδόσεις.
Ομάδα Άλφα {
      Τμήμα Οκ {
            Τύπωσε "Οκ"
      }
}
Άλφα.Οκ
Τμήματα ? \\ εμφανίζει και το Άλφα.Οκ
Ομάδα Άλφα {
      Τμήμα Οκ {
            Τύπωσε "Εντάξει"
      }
}
Άλφα.Οκ
Τμήματα ? \\ εμφανίζει και το Άλφα.Οκ

2. Ετοιμάζω το εγχειρίδιο της Μ2000, ένα εγχειρίδιο που στόχο έχει να βάλει στην ιδέα της Μ2000 το αναγνώστη παρά να του μάθει προγραμματισμό, ή να εμφανίσει όλες τις εντολές τις γλώσσας.
Το blog έχει αρκετά παραδείγματα και μερικά τεύχη ενός μεγάλου εγχειριδίου εδώ

Παρακάτω είναι ένα παράδειγμα που δείχνει την "Επίλυση Αριστερής Έκφρασης" που κάνει ο διερμηνευτής Μ2000 όταν σε μια κατάσταση που έχει ζεύγη κλειδιών και τιμών βάλουμε σε μια τιμή πίνακα. Κανονικά αλλαγές τιμών στην κατάσταση γίνεται με εντολή όταν πρόκειται για "όλη" την τιμή. Αλλά μια τιμή όπως ένας πίνακας έχει και επιμέρους τιμές. Στις επιμέρους τιμές δρα η επίλυση αριστερής έκφρασης.

(στο Α=12+3 το 12+3 είναι δεξιά έκφραση, ενώ στο Α(2*Χ)=10 το 2*Χ είναι αριστερή έκφραση. Η αριστερή έκφραση υπολογίζει το Που θα μπει κάτι, ενώ η δεξιά το Τι θα μπει)


Επιπλέον στο παράδειγμα φαίνεται και η χρήση του χειριστή << για τους πίνακες, όπου εκτελείται για κάθε στοιχείο η συνάρτηση Β() (η οποία είναι μια λάμδα συνάρτηση και έχει ένα αντίγραφο της από_που (εδώ υπάρχει διαφορά με την Python, οι non local μεταβλητές μένουν στην λάμδα, και δεν αλλάζουν τιμές έξω από αυτήν, αλλά στην εισαγωγή μπαίνουν ως αντίγραφο)

Αυτό είναι ένα παράδειγμα από το εγχειρίδιο

κατάσταση αλφα=1,2,3
\\ βοηθητική συνάρτηση για να παράγουμε πίνακες
\\ με τιμές που γεμίζουμε με μια εσωτερική λάμδα συνάρτηση
Α=Λάμδα ->{
      Διάβασε Πόσα, από_που
      Β=Λάμδα από_που ->{
         =από_που
        από_που++
      }
      Πίνακας αλφα(Πόσα)<<Β()
      =Αλφα()
}
\\ η Α() παίρνει τον αριθμό στοιχείων και το νούμερο που θα βάλει στο πρώτο
\\ δηλαδή  στο στοιχείο 0
Επιστροφή αλφα, 1:=Α(20,155), 2:=Α(20,100), 3:=Α(10,200)
Για ι=0 έως 19
      Τύπωσε αλφα(1)(ι),
Επόμενο ι
Τύπωσε
Για ι=0 έως 19
      Τύπωσε αλφα(2)(ι),
Επόμενο ι
Τύπωσε
Για ι=0 έως 9
      Τύπωσε αλφα(3)(ι),
Επόμενο ι
Τύπωσε
\\ επίλυση αριστερής έκφρασης
αλφα(1)(0)++
Τύπωσε αλφα(1)(0) \\ 156
Τύπωσε διάσταση(Αλφα(1)) \\ 1 είναι μονοδιάστατος ο πίνακας στο κλειδί 1
Τύπωσε διάσταση(Αλφα(1),1) \\ 20 έχει είκοσι στοιχεία στη διάσταση 1

Κυριακή, 19 Ιουνίου 2016

Μικρή Αναθεώρηση 8 (έκδοση 8.2)

Ένα φτιάξιμο στην Εντολή Δρομέας. Μετακινούσε το δρομέα "λογικά", όχι πραγματικά, και σε μια εντολή που εμφανίζει κείμενο σε περιοχή στην οθόνη δημιουργούσε θέμα. Η Τύπωσε @(10,10); κάνει την ίδια δουλειά με την Δρομέας. Η Δρομέας ( Cursor) έχει μια διαμόρφωση με θαυμαστικό Δρομέας! η οποία συγχρονίζει τον δρομέα γραφικών με αυτόν του κειμένου.


Άλλα νέα:
Διέκοψα την συμμετοχή μου στο Insomnia.gr. Ζήτησα να κλείσουν τον λογαριασμό μου. Ζήτησα επίσης να αφαιρεθεί οποιαδήποτε αναφορά σε κείμενό μου και τα κείμενά μου. Αυτό δεν έγινε ακόμα. Ίσως γίνει αργότερα.
Δυστυχώς το επίπεδο συζήτησης ήταν απογοητευτικό. Εκεί ορισμένα άτομα υποστηρίζουν, με μανία όλους τους λόγους που η Μ2000 είναι άχρηστη. Ενώ στην ουσία πρέπει κανείς να έχει την εξυπνάδα και να καταλάβει τι χρησιμότητα έχει καθετί, όπως και η Μ2000.
Μειονεκτήματα που αναφέρθηκαν:

  • Είναι εφαρμογή και όχι γλώσσα  (δεν μπορώ να κατανοήσω εδώ τι θέλουν να πουν. Ναι ο διερμηνευτής είναι εφαρμογή, που αντικείμενο έχει την Γλώσσα Μ2000)
  • Ο διερμηνευτής είναι γραμμένος σε VB6 η οποία δεν υποστηρίζεται (Προφανώς δεν υποστηρίζεται το IDE της VB6, αλλά υποστηρίζονται προγράμματα γραμμένα σε αυτήν ακόμα και στα Windows 10)
  • Η χρήση ελληνικών εντολών αποπροσανατολίζει και δεν προσφέρει γνώση όπως αν είχαμε χρήση αγγλικών εντολών (Παραβλέπουν το γεγονός ότι έχει δυο λεξικά η Μ2000, αλλά ακόμα και να είχε ένα, δεν θα υπήρχε πρόβλημα να μάθουν τις έννοιες στο προγραμματισμό και όχι τα ονόματα εντολών - κάθε γλώσσα ακόμα και στα αγγλικά έχει διαφορετικό τρόπο σύνταξης και χρήση διαφορετικών λέξεων, αν όχι σε όλα σίγουρα στα περισσότερα)
  • Η ομοιότητά της (έχει ελληνικά) με την Γλώσσα του σχολείου (καμία σχέση δεν έχει, εκτός από τη χρήση ελληνικών), "σίγουρα" την κατατάσσει σε "ψευδογλώσσα", και τα προγράμματα που δείχνω, σε κώδικα και σε βίντεο (την έξοδο των προγραμμάτων), δεν είναι πραγματικά! Απολαμβάνω μια πλήρη αμφισβήτηση. Σε άλλα site, όπως το dwrean.net εδώ και χρόνια από τις προηγούμενες εκδόσεις, δίνεται σύνδεσμος προς τη γλώσσα και δεν είδα ποτέ να έχει παράπονο κανείς. Αντίθετα μόνο θετικά μηνύματα βλέπω.
  • Κάποιοι ζήτησαν TCP/IP και άλλα πράγματα τα οποία δεν περιλαμβάνει η γλώσσα. Όχι επειδή τους άρεσε η γλώσσα αλλά για να "γελάσουν" πάνω στην "αδυναμία μου" να ανταποκριθώ. Προφανώς το "γελοίο" του αιτήματος είναι να λες σε κάποιον να κάνει κάτι αρκετά δύσκολο για να αποδείξει στον αιτούντα ότι δεν είναι "ικανός" να το κάνει. Αυτή η κόντρα περί ικανών και μη δεν ήταν σκοπός μου, αλλά φάνηκε πως στο συγκεκριμένο site, Insomnia, μια ομάδα μελών έχει την συνήθεια να "επιβάλλει" αυτήν την γραμμή, την κόντρα, και ένας λόγος που ακύρωσα τη συνδρομή μου ήταν για να αποφύγω αυτές τις ανούσιες κόντρες. 
  • Επιπλέον πολλοί παραγνωρίζοντας ή το έκαναν εσκεμμένα ότι εργάζομαι από χόμπι στο έργο αυτό, δηλαδή αποτελεί ένα προσωπικό έργο, έφεραν ζήτημα ότι "δεν έχω εργαστεί με άλλα άτομα πάνω σε προγραμματισμό" και αυτό φαίνεται στο κώδικα του διερμηνευτή. Γιατί πρέπει να αποδείξω ότι ο κώδικας έχει γραφτεί με συνεργασία, αφού είναι προσωπική εργασία; Μπορεί να σκέφτηκαν την πρότερη έλλειψη συνεργασίας (μη εμπειρία από συνεργασία) από την κατάσταση του κώδικα (μα ποιοι είναι οι Πουαρώ του Insomnia). Αυτή η λεπτομέρεια (ότι είναι προσωπική εργασία), δεν τους ενοχλεί, ούτε τη βλέπουν σημαντική.  Αυτό τώρα γιατί να γίνει θέμα; To 2006 στο Μαθηματικό του Πανεπιστημίου Αθηνών έχω αναρτήσει σχετικά για την Μ2000 και μέχρι τώρα ενώ φαίνεται ένα ενδιαφέρον ως προς το διερμηνευτή, δεν φαίνεται ενδιαφέρον για να αναλάβει νεολαία να το φέρει στα δικά της μέτρα, ενώ έχω κάνει την πρόταση για συμμετοχή στην ανάπτυξη! Ευθέως ζητάω μια ομάδα να αναλάβει την ανάπτυξή της. Από τότε μέχρι σήμερα έχω προβεί μόνος μου σε αναβαθμίσεις.
Φταίνε τα μέλη λοιπόν του Insomnia, ή οι moderators ή ο κάτοχος του τόπου; Δεν ξέρω! Απλά όπως είναι η κατάσταση τώρα στο site, οι θαμώνες στο φόρουμ Προγραμματισμός είναι απαράδεκτοι. Έγραψα σε κάποια φάση για δυο "κοπρόσκυλα" και αυτό θεωρήθηκε ύβρις. Με αποτέλεσμα να μου αφαιρέσουν την πρόσβαση για δέκα μέρες. Ενώ συνέχιζαν άλλα άτομα να γελοιοποιούν και εμένα και τη γλώσσα. Με αυτήν την πρακτική δεν συμφωνώ και για το λόγο αυτό ζήτησα να διαγραφεί ο λογαριασμός μου και ότι έχω γράψει εκεί ακόμα και αυτά που αντιγράφονται σε quote.
Γ.Κ.

Υ.Γ.
Μετά από email που έστειλα...επιτέλους κλειδώθηκε το θέμα Ενημέρωση για την Μ2000. Είδαν άλλα μέλη ότι έφυγα από το φόρουμ και παρόλα αυτά συνέχιζαν να γράφουν χαζομάρες και προσβολές.