Τρίτη, 20 Μαρτίου 2018

Αναθεώρηση 2 (Έκδοση 9.2)

Έγιναν ενδιαφέρουσες προσθήκες!
1) Οι μεταβλητές στη κονσόλα αναγνωρίζονται από τον διερμηνευτή τμημάτων ως γενικές ώστε να μην αφήνει σε πέρασμα με τιμή, με ίδιο όνομα γενικής, να χρησιμοποιεί την γενική αλλά να φτιάχνει νέα (αυτό είχε προβλεφθεί από την αρχική 9.2 έκδοση, αλλά δεν είχε υλοποιηθεί, δούλευε μόνο για τις γενικές που φτιάχναμε μέσα σε πρόγραμμα).
2) Νέος Έλεγχος, με δυνατότητα να εκτελεί εντολές και κατά το σταμάτημα, αλλά και κατά την αργή εκτέλεση. Μπορούμε πχ να αλλάξουμε τιμή σε μεταβλητή ή να καλέσουμε κάποιο τμήμα. Για να αλλάξουμε την επιλογή από προβολή σε εκτέλεση αρκεί να πατήσουμε το BackSpace μέχρι να σβήσει όλη η γραμμή και μια ακόμα! Το στοιχείο λειτουργεί όπως και η φόρμα ακόμα και αν τρέχει πρόγραμμα σε αργή ταχύτητα (η δεύτερη επιλογή από τη λίστα πάνω δεξιά στη φόρμα). Η εντολή Δοκιμή ή Test ανοίγει τον έλεγχο, αλλά μπορούμε να τον ανοίξουμε και με συνδυασμό πλήκτρων γραμμάτων και το Ctrl. (τα γράμματα παίζουν όλα όσα δεν χρησιμοποιούνται αλλού, όπως τα C, F, L, M, N, A, V στη κονσόλα). Μπορούμε να καλέσουμε την εντολή και από το πρόγραμμα, ώστε να σταματήσει όπου θέλουμε και υπάρχει και τρόπος για να σταματάει και να συνεχίζει μέχρι μια επόμενη εντολή με συγκεκριμένη ετικέτα. Οι βασικές φόρμες του περιβάλλοντος έχουν την ιδιότητα να μεγαλώνουν, μεγαλώνοντας τα γράμματα, για να είναι θεατά από κάθε χρήστη! Αυτό δεν ισχύει στις φόρμες χρήστη, που δουλεύουν όπως όλες οι φόρμες, αν είναι φόρμες που αλλάζουν μέγεθος στέλνουν γεγονός και κάνουμε ότι θέλουμε. Οι φόρμες περιβάλλοντος έχουν το σκούρο πλαίσιο.



Εικόνα με το τελευταίο στοιχείο να έχει αριστερά το ? και αμέσως μετά γράφουμε μια λίστα στοιχείων για να μας δείξει (πατάμε enter, και παραμένουν σε κάθε επόμενη εκτέλεση, ώστε να βλέπουμε την εξέλιξη). Τα αποτελέσματα φαίνονται στο πεδίο που τώρα δείχνει κώδικα. Αυτό το πεδίο αλλάζει και με κλικ στο Next: (τρίτο στοιχείο της λίστας αριστερά). Επιπλέον τώρα μπήκε και μια προσθήκη, όταν κάνουμε κλικ στο κώδικα να μας δείχνει το κώδικα στη φόρμα της βοήθειας, με την εντολή προς εκτέλεση με κόκκινο χρώμα, ώστε να έχουμε καλύτερη θέαση (απλά σε αυτή την φόρμα δεν έχουμε μετακίνηση του κόκκινου δρομέα, κάτι δηλαδή που έχουμε στο πεδίο αυτό, και επίσης δεν έχουμε χρωματισμένο κώδικα)


Εικόνα με το τελευταίο στοιχείο να έχει αριστερά το > που σημαίνει ότι δέχεται εντολές. Μπορούμε να βάλουμε δυο ή περισσότερες με την άνω και κάτω τελεία για διαχωρισμό. Αν βγει λάθος δεν καθαρίζει το στοιχείο, ενώ αν είναι σωστό (γίνει ορθά η εκτέλεση) τότε καθαρίζει.


3) Νέο χαρακτηριστικό στο Combo στοιχείο ελέγχου, το οποίο βέβαια σχετίζεται με το TextBox (το Combo είναι δυο στοιχεία, ένα που βάζουμε πάνω στη φόρμα και ένα δεύτερο που ανοίγει για να επιλέξουμε στοιχείο. Εδώ στην εικόνα έχουμε αυτόματη συμπλήρωση, και το νέο είναι ότι χρωματίζεται το συμπλήρωμα με γκρι χρώμα. (φαίνεται ο ίδιος μηχανισμός και στην φόρμα ελέγχου).


Το πρόγραμμα για τη φόρμα. Είναι με αγγλικές εντολές αλλά μπορεί να γραφτεί και με ελληνικές. Αυτό που δεν φαίνεται στην εικόνα είναι ότι στα στοιχεία  παίζει το Ctrl+F1, το οποίο το φτιάχνει η About (ή Περί). Επίσης εκτός από αυτόματη συμπλήρωση έχουμε προσθήκη νέων λέξεων και ταξινόμηση. Είναι απλός ο κώδικας και γράφεται σε ένα τμήμα Α (με Edit A ή Σ Α) και μετά βγαίνουμε από το διορθωτή με Esc και δίνουμε το όνομα του τμήματος και το enter και τρέχει. Δεν χρειάζεται να βγούμε από την κονσόλα της Μ2000 για να τρέξουμε διαφορετικά προγράμματα. Απλά με τη Σώσε και το όνομα σώνουμε  και με τη Φόρτωσε και το όνομα φορτώνουμε (καλύτερα να δώσουμε Νέο για να σβήσει το παλιά τμήματα και τις συναρτήσεις, γιατί αν υπάρχουν τμήματα με ίδια ονόματα, η φόρτωσε από τη κονσόλα τα "πατάει"). Μπορούμε όμως σε κάθε τμήμα να έχουμε ένα πρόγραμμα (τα τμήματα από τη κονσόλα είναι γενικά, δηλαδή μπορεί ένα οποιοδήποτε τοπικό τμήμα, να τα καλέσει, εκτός και αν υπάρχει τοπικό με ίδιο όνομα, οπότε σκιάζεται το γενικό)

Ενώ η θέαση μεταβλητών περιορίζεται στα τμήματα και στις συναρτήσεις στα τοπικά και σε ότι είναι γενικό, στις συναρτήσεις γεγονότων (καλούνται σαν τμήματα) η θέαση είναι κοινή με την θέαση στο τμήμα που βρίσκονται αυτές. Πχ στη συνάρτηση combo1.dblclick (την οποία καλεί το γεγονός
dblclick του combo1, η τελεία και τα ονόματα πρέπει να είναι ίδια με το στοιχείο και το γεγονός που διαθέτει αυτό αλλιώς δεν μπορεί να κληθεί)  αυτό text1.text$=combo1$  μπορεί να γίνει γιατί το δεξιό μέρος είναι θεατό, και εδώ είναι και το αριστερό. Το text1.text$ είναι ένα αντικείμενο ιδιότητα. Η τελεία στο όνομα μπήκε για γούστο, θα μπορούσαμε να μην τη βάζαμε. Ο διερμηνευτής συνδέει την πραγματική ιδιότητα "text" του στοιχείου text1 που ορίσαμε ότι είναι textbox της φόρμας form1 με την εντολή Declare (Όρισε στο ελληνικό λεξιλόγιο της γλώσσας Μ2000). Η σύνδεση θα τερματίσει όταν τερματίσει το τμήμα ή όταν το στοιχείο δηλωθεί ως τίποτα (δείτε τις τρεις τελευταίες εντολές Declare ....nothing). Η εντολή With (ή Με στο ελλ. λεξ.) χειρίζεται ιδιότητες των αντικειμένων. Ο διερμηνευτής κάθε φορά που χρησιμοποιούμε μια νεα ιδιότητα την θυμάται, οπότε ακόμα και αν δεν την συνδέσουμε με μεταβλητή, στην δεύτερη και επόμενες χρήσεις θα εκτελεί πιο γρήγορα. Οι φόρμες και τα στοιχεία ελέγχου είναι αντικείμενα COM και οι εντολές Method (Μέθοδος) και With (Με) τα χειρίζονται (όπως και κάθε άλλο αντικείμενο COM, όπως το Word). Ορισμένες ιδιότητες τις έχουμε σαν πίνακες, όπως τον πίνακα list$(), για την ιδιότητα "List" του Combo1. Αυτό μπορούμε να το κάνουμε όταν μια ιδιότητα παίρνει παράμετρο.Η Find() αν και είναι ιδιότητα λειτουργεί στην ουσία ως συνάρτηση με μια παράμετρο. Η Μέθοδος μπορεί να καλεί μεθόδους που επιστρέφουν τιμές, και μάλιστα και αντικείμενα και επιπλέον μπορούμε να δηλώσουμε την επιστροφή ΜεΓεγονότα, οπότε θα παίρνουμε και γεγονότα. (αυτά ξεχωρίζουν γιατί δεν δηλώνονται στις συναρτήσεις με τελεία , μεταξύ αντικειμένου και ονόματος γεγονότος αλλά με κάτω παύλα _). Στα αντικείμενα για το παραθυρικό περιβάλλον δεν χρειάζεται τόση εμβάθυνση, λειτουργούν πολύ απλά. Τα νούμερα πχ 8000 είναι σε twips.
Υπάρχει και ένα αστείο στο πρόγραμμα. Την φόρμα την ανοίγουμε και την κρατάμε σε βρόχο (βασικό στοιχείο για να πάρουμε τα γεγονότα) με μια εντολή που περιμένει να πατήσουμε ένα πλήκτρο (Στη φόρμα της κονσόλας). Αν κάνουμε κλικ στην κονσόλα και πατήσουμε ένα πλήκτρο θα κλείσει η φόρμα. Στο γεγονός Unload στέλνω ένα χαρακτήρα στο πληκτρολόγιο με την Keyboard ή Πληκτρολόγιο  η οποία το στέλνει στη κονσόλα και η εντολή Get$ διαβάζει από αυτήν και μόνο, ενώ στις φόρμες έχουμε εισαγωγές από γεγονότα (εδώ για απλοποίηση δεν χρησιμοποιώ τα στοιχεία που δίνει το γεγονός, τα αφήνω δηλαδή στο σωρό τιμών που συνοδεύει τη κλήση, αλλά σε αυτά είναι και μεταβλητή με αναφορά για να ακυρώσει κανείς το τερματισμό της φόρμας).

About call {
      select case About$
      case "is a big name here"
            About  "Title: is a big name here", 8000,6000,"that [is a big name here] easy [too]"
      else
            About  "Title: too", 8000,6000,"that [is a big name here] easy"+About$
      end select
}

Declare form1 form
Declare combo1 combobox form form1
Declare text1 textbox form form1
With form1,"Title" as title$
With combo1,"Edit", True,"UseOnlyTheList", false,"autocomplete", True, "listIndex" as ListIndex,"ShowAlways", True
With combo1,"label","Combo1", "ListText" as item$, "list" as list$(), "text" as combo1$
item$={alfa
            delta
            gamma
            beta
            }
With combo1,"Find" as Find()
Method combo1,"Sort"
combo1$=list$(find("gam*"))

Method combo1,"Move", 1000,1000,6000,600
Method text1, "Move", 1000,2900,6000,600

With text1, "left" as left, "text" as text1.text$ , "ShowAlways", True
Print left
Method form1, "show"
Method text1,"GetFocus"
function form1.unload {
      About
      Keyboard "!"
      show
}
function combo1.about {
      About show "is a big name here"
}
function text1.about {
      About show ""
}
Function combo1.dblclick {
        text1.text$=combo1$
        title$=combo1$
        if find(title$)= -1 then {
         method combo1,"additem",title$
         Method combo1,"Sort"
         listindex=find(title$)
         }
         combo1$=combo1$
          Method text1,"GetFocus"
}
Function combo1.click {
      if listindex>=0 then text1.text$=list$(listindex)
}
Function combo1.scroll {
      if listindex>=0 then text1.text$=list$(listindex)
}
a$=key$ ' loop for holding Forms; Is a joke but works.
Declare Text1 nothing
Declare combo1 nothing
Declare form1 nothing




4) Όπου έχουμε στοιχείο εισαγωγής κειμένου, η λειτουργία Drag and Drop βελτιώθηκε, ώστε σε περίπτωση ακύρωσης της μεταφοράς από ή πρός τη φόρμα, να επαναφέρει τον δρομέα στο σημείο που ήταν. Πχ όταν από μια γραμμή μεταφέρουμε προς τα κάτω κείμενο, τότε οι γραμμές αλλάζουν εμφανίζοντας έναν δρομέα που θα γίνει η εισαγωγή. Αν πατήσουμε Escape ακυρώνουμε την μεταφορά και το στοιχείο γυρίζει στην θέση που ήταν πριν. Αυτό γίνεται στο EditBox, και στο διορθωτή της κονσόλας (είναι διαφορετικά στοιχεία). Το στοιχείο του διορθωτή κονσόλας χρησιμοποιείται και για εισαγωγή κειμένου σε πλαίσιο μέσα στη κονσόλα, οπότε και εκεί έχει την νέα λειτουργία. Αν και λέμε για διαφορετικά στοιχεία, εντούτοις αυτό που διαφοροποιεί είναι η subclass (όρος της VB6) ενός και μόνο UserControl, το οποίο αναβαθμίστηκε σε αυτή την αναθεώρηση. Πχ ο τίτλος της φόρμας alfa είναι το ίδιο usercontrol με το combo1 και το Textbox από κάτω. Όλο το σύστημα παραθύρων είναι "ιδιοκατασκευή", και υπάρχει από την έκδοση 8.1. Υπάρχουν ακόμα περιθώρια βελτίωσης! Η εμφάνιση των στοιχείων είναι ίδια σε όλα τα λειτουργικά που τρέχει το περιβάλλον. Κάτι νέο που έχουν αυτά τα στοιχεία, είναι ότι μοιάζουν περισσότερο με στοιχεία του Android. Πχ τα Buttons (και άλλα στοιχεία) μπορούν να δεχθούν εκτός από κλικ και ολίσθηση δεξιά. Στο κείμενο με κράτημα του αριστερού πλήκτρου του ποντικιού και ολίσθηση προς τα πάνω μετακινούμε το κείμενο προς τα πάνω, το ανάποδο για προς τα κάτω. Το Drag and Drop μεταξύ των στοιχείων γίνεται με πάτημα μια φορά (χωρίς να πιέζουμε συνέχεια το πλήκτρο του ποντικού). Όλα τα στοιχεία υποστηρίζουν unicode χαρακτήρες και αντιγραφές από το πρόχειρο, αλλά δεν υποστηρίζουν γλώσσες που γράφουν από δεξιά (δεν μπορώ να φτιάξω κάτι που δεν μπορώ να το δοκιμάσω).