Παρασκευή, 24 Μαρτίου 2017

Αναθεώρηση 4 (έκδοση 8.6)

Σε αυτήν την αναθεώρηση έφτιαξα επιτέλους τις εισαγωγές αριθμών (στην οθόνη και στις φόρμες), να γίνονται βάσει του τοπικού χαρακτήρα δεκαδικών (παλαιότερα ήθελε τη τελεία μόνο).
Το πρόβλημα με την Εισαγωγή (Input) ήταν ότι έπαιρνε δυο ή περισσότερες μεταβλητές και το κόμμα το είχε (και το έχει μαζί με το enter) ως τερματισμός εισαγωγής και ξεκίνημα του επόμενου.
Πώς λοιπόν θα το ξεπερνούσα; Και μάλιστα χωρίς να κάνω πολύ δουλειά;
Το κόλπο λέγεται "ντουμπλάρισμα"...δηλαδή βάζουμε την ρουτίνα να δουλεύει όπως πριν, αλλά εκεί που θέλουμε αλλάζουμε πρόσκαιρα την τελεία με το κόμμα και στην επιστροφή τα αλλάζουμε πάλι!

Η απλή εισαγωγή εισάγει πολλαπλούς αριθμούς με εμφάνιση στην οθόνη με χαρακτήρες σε θέσεις χαρακτήρων (όπως στις παλιές κονσόλες, το ένα γράμμα κάτω από το άλλο).Εισάγει βέβαια και αλφαριθμητικά και αριθμούς "ανάμεικτα"

Π.χ.
Εισαγωγή "Όνομα και ηλικία=", Όνομα$, Ηλικία
μπορούμε μετά το όνομα να πατήσουμε το κόμμα και θα ξεκινήσει η εισαγωγή της ηλικίας (δέχεται μόνο χαρακτήρες για αριθμούς). Στα αλφαριθμητικά δεν δέχεται εισαγωγικά και αγκύλες.
Δουλεύει το ctrl+V το οποίο ουσιαστικά στέλνει τους χαρακτήρες μέσω πληκτρολογίου (κάπου ενδιάμεσα) και έτσι φιλτράρονται. Δεν μπορούμε δηλαδή πονηρά να περάσουμε με επικόλληση χαρακτήρες. Δεν υπάρχει αντιγραφή και αποκοπή στην εισαγωγή αυτού του τύπου. Επιπλέον δεν μπορούμε να πάμε πίσω μερικούς χαρακτήρες χωρίς να σβήσουμε.

Εισαγωγή "(x,y,z)=",x,y,z
Τύπωσε x,y,z

ρυθμίστε τον υπολογιστή σας με το ελληνικό σύστημα, το κόμμα για υποδιαστολή.
Τώρα όποτε πατάμε τη τελεία (στην εισαγωγή αριθμών) θα εμφανίζεται το κόμμα. Παραμένει η αλλαγή εισαγωγής το κόμμα ή το enter.

Αν θέλουμε να πάρουμε μια γραμμή με οτιδήποτε (γραμμή λέμε αλλά είναι παράγραφος, δηλαδή τερματίζει μόλις πατήσουμε το enter, άρα δεν μπορεί να έχει το enter, χαρακτήρας 13) υπάρχει η Γραμμή Εισαγωγής (δουλεύει και για αρχεία). Εδώ δεν έχουμε αλφαριθμητική σταθερά στην αρχή για να προβληθεί πριν την εισαγωγή. Μια τύπωσε και ο χαρακτήρας ; που δηλώνει να μην φύγει ο δρομέας από την τελευταία θέση, αρκούν.
Τύπωσε "Δώσε κάτι:";
Γραμμή Εισαγωγής α$


Υπάρχουν και άλλοι τρόποι εισαγωγής.Δεν θα τους αναπτύξω όλους εδώ. Απλά όσους "φτιάχτηκαν", σε αυτήν την αναθεώρηση:
Τύπωσε $(4), "Α=";  \\ αναλογική γραφή (από 4 και πάνω, το νούμερο δηλώνει τρόπο)
Εισαγωγή ! Α, 10 \\ καθορίζουμε το πλάτος σε θέσεις χαρακτήρων οθόνης.
Τύπωσε Α
Τύπωσε $(0), "Οκ"  \\ μη αναλογική γραφή, ένας χαρακτήρας σε μια θέση χαρακτήρα οθόνης
Τύπωσε Α


Η εισαγωγή με το θαυμαστικό, έχει δυνατότητα να γράψουμε μεγαλύτερου πλάτους αριθμό. Ουσιαστικά ανοίγει ο διορθωτής σε μια γραμμή και σε πλάτος που δίνουμε και ρυθμίζει την εισαγωγή όπως θέλουμε, μόνο για αριθμούς. Αν χρησιμοποιήσουμε ακέραια μεταβλητή (με το %) τότε δεν θα δέχεται την υποδιαστολή και θα έχει μέχρι 16 το πολύ αριθμούς. Μόλις κλείσει ο διορθωτής (μπορεί να κλείσει και με Esc, αλλά και με άνω και κάτω βελάκι καθώς και με Enter) εξαφανίζεται και ό,τι γράψαμε από την οθόνη (ο διορθωτής είναι στοιχείο πάνω  από την οθόνη). Οπότε τυπώνουμε το αποτέλεσμα.  Εδώ πρέπει να γίνει καθαρό ότι η Μ2000 δεν τυπώνει χαρακτήρες με φόντο μαζί, αλλά πάντα "Διάφανους". Όταν θέλουμε να τυπώσουμε πάνω σε κείμενο, τότε πρέπει να το καθαρίσουμε. Αυτό μπορεί να γίνει ανά γραμμή κατά την ολίσθηση, ή με την εντολή οθόνη να φύγει όλη μαζί.ή να χρησιμοποιήσουμε μια εντολή που δίνει χρώμα γραμμάτων και φόντου για στήλη σε συγκεκριμένη γραμμή, την ~(), ή το παρακάτω:
Τύπωσε @(0,5,πλάτος, 15,5,5),

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

για ι=1 εως 3 {
      Τύπωσε @(0,5,πλάτος, 15,5,5),
      Τύπωσε $(4), "Α=";  \\ αναλογική γραφή (από 4 και πάνω, το νούμερο δηλώνει τρόπο)
      Εισαγωγή ! Α%, 10 \\ καθορίζουμε το πλάτος σε θέσεις χαρακτήρων οθόνης.
      Τύπωσε Α%
      Τύπωσε $(0), "Οκ"  \\ μη αναλογική γραφή, ένας χαρακτήρας σε μια θέση χαρακτήρα οθόνης
      Τύπωσε Α%
      α$=κομ$ \\ πάτα ένα πλήκτρο
}




Η ειδική συνάρτηση της Τύπωσε $() κάνει διάφορα, αν έχουμε αριθμό το πρώτο όρισμα τότε δηλώνουμε το τρόπο εμφάνισης σε στήλες, από το 4 και πάνω είναι με αναλογική γραφή και το 4 σημαίνει ότι τα αλφαριθμητικά στοιχίζονται αριστερά στη στήλη, και αν χρειάζεται παίρνουν και άλλες στήλες, ενώ οι αριθμοί δεξιά., το 5 στοιχίζει όλα αριστερά, το 6 στο κέντρο της στήλης, το 7 δεξιά, το 8 κάνει διπλή στοίχιση στα αλφαριθμητικά, και στις δυο πλευρές.  Τα 5,6,7,8 εξαφανίζουν όποια λέξη δεν χωράει στην στήλη. Στην μη αναλογική γραφή έχουμε το 0 αντίστοιχο του 4, και τα 1,2,3 αντίστοιχα των 5,6,7.

Εισαγωγή αριθμού σε φόρμα
Το πιο προχωρημένο είναι η εισαγωγή αριθμού σε στοιχείο ελέγχου Εισαγωγή. Και αυτό γιατί εκεί υπάρχει τρόπος για έλεγχος τιμών εντός ορίων. Υπάρχει η διαμόρφωση Spinner η οποία δίνει στα άνω και κάτω βελάκια δυνατότητα να αλλάζουν τιμές, το ίδιο και το ροδελάκι του ποντικιού, με την μπάρα ολίσθησης που φαίνεται στο πλάι κίτρινο χρώμα, όπου παίζει το ρόλο ένδειξης) ενώ μπορούμε να γράψουμε τιμή. Το ενδιαφέρον εδώ είναι ότι ο έλεγχος εν μέρει γίνεται με κώδικα της Μ2000. Δηλαδή το στοιχείο όταν πάρει κάτι νέο, στέλνει μήνυμα το τι πήρε και που ήταν ο δρομέας, ενώ εκεί που λαμβάνουμε το μήνυμα μπορούμε να ξέρουμε την προηγούμενη κατάσταση σαν τιμή και σαν αλφαριθμητικό. Επειδή δουλεύει με ακέραιες τιμές μπορούμε να προσποιηθούμε ότι δεν είναι ακέραια με την κατάλληλη αλλαγή στο αλφαριθμητικό. Επειδή αυτός ο τρόπος χρησιμεύει και για αλλού, σε δεύτερο στοιχείο Εισαγωγή, το φτιάχνουμε σε ένα τμήμα. Οι συναρτήσεις που εξυπηρετούν μηνύματα καλούνται σαν να ήταν το τμήμα που έφτιαξε την φόρμα, οπότε σε κάθε περίπτωση βλέπουν ότι θα βλέπαμε σε αυτό το τμήμα, έτσι το τμήμα Αρ δεν χρειάζεται να είναι γενικό. Το Αρ το καλώ με την Κάλεσε αλλά γίνεται και χωρίς αυτήν! Δείτε επίσης ότι διαβάζουμε περισσότερα ορίσματα απ΄όσα βάζουμε στη Κάλεσε. Αυτό γίνεται γιατί στο σωρό τιμών ήδη υπάρχουν τα τελευταία δύο, και αντί να τα "σηκώσουμε" στην  Εισαγ1.ValidString   τα παίρνουμε μετά. Αυτό ξεχωρίζει την Μ2000 στο θέμα των παραμέτρων. Δεν χρειάζεται να δημιουργεί κανείς μεταβλητές και να επαναπροωθεί. Η κλήση τμημάτων γίνεται με παροχή του σωρού τιμών αυτού που καλεί (μπορούμε να κάνουμε και επιστροφή τιμών).
Το Αριθ=αλφα : Αλφα=Αριθ χρησιμεύει για να φέρει τον αριθμό στα μέτρα του Spinner. Δίνουμε τον αριθμό στο Spinner (έτσι λέμε αυτό που γυρίζει, όπως το σπιν στα ηλεκτρόνια), και αυτός αν είναι εκτός ορίων των πάει στο κοντινό άκρο. Οπότε τον διαβάζουμε μετά και έτσι έχουμε το τελικό!
Αν αποτύχει η μετατροπή της τιμής, τότε  η τοπική Άλφα δεν θα υπάρχει...δεν θα είναι Έγκυρο το Έγκυρο(αλφα) και απλά στέλνουμε το δρομέα στη θέση 100

Το σύμβολο & πριν το όνομα μεταβλητής σημαίνει "με αναφορά". Το βάζουμε όταν καλούμε κάτι και εκεί που καλούμε πρέπει η Διάβασε να έχει πάλι το & πριν την μεταβλητή, και έτσι ταυτίζεται η απαίτηση του καλούντος με την δυνατότητα του καλούμενου
Το παρακάτω το γράφουμε σε ένα τμήμα έστω Α (η Μ2000 τρέχει κώδικα σε πολλαπλές γραμμές μέσα σε τμήματα και συναρτήσεις). Θα μπορούσαμε στο τέλος να μην ορίσουμε τις μεταβλητές - αντικείμενα του γραφικού περιβάλλοντος- Εισαγ1, Εισαγ2 και Φόρμα1 όπως κάνουμε με το Τίποτα. Απλά το κάνουμε εδώ για να φαίνεται. Το τμήμα στην έξοδό του πάντα καθαρίζει τις δικές του μεταβλητές, άρα καθαρίζει και τις φόρμες (θα μπορούσε ένα προηγούμενο τμήμα στο δένδρο κλήσεων να είχε ανοίξει άλλη φόρμα)
Τα νούμερα στην μέθοδο "move" είναι σε twips. Στη Μ2000 χρησιμοποιούμε twips, που ισοδυναμούν με 15 στο Pixel (αλλά ενδέχεται να αλλάξει αυτό ανάλογα με το τι δίνει η οθόνη στον κάθε υπολογιστή ως dpi). Στον εκτυπωτή 1440 twips είναι πάντα μια ίντσα. Στην οθόνη λέγεται λογική ίντσα, όχι υπαρκτή, διότι πχ με προβολέα μπορούμε να αλλάζουμε το μέγεθος χωρίς να ενημερώνεται τίποτα στον υπολογιστή. Όταν λέμε κάτι "λογικό" σημαίνει ότι έχει μια έννοια, μια υπόσταση, αλλά περισσότερο μας ενδιαφέρει ο αριθμός αυτών, δηλαδή το μέγεθος, άρα η λογική ίντσα είναι απλά ένα μέτρο.



Τμήμα Αρ {
      Διάβασε &Αριθ, πως$, πολ, χωρις, &τροφ1$, &μιαθεση
      Τοπική προσ1
      αν όχι χωρίς τότε προσ1=αρισ$(τροφ1$,1)="-"
      Δες {
            Τοπική αλφα
            αλφα=Τιμη(τροφ1$,"")*πολ : Αριθ=αλφα : Αλφα=Αριθ
      }
      Αν Έγκυρο(άλφα) Τότε {
                 τροφ1$=γραφη$(απολ(αλφα)/πολ,πως$)
                Αν προσ1 Τότε τροφ1$="-"+τροφ1$
                Αν μιαθέση>μήκος(τροφ1$) τότε μιαθέση=1
      } Αλλιώς μιαθέση=100
}
Όρισε Φόρμα1 Φόρμα
Όρισε Εισαγ1 ΕΙΣΑΓΩΓΗ Φόρμα Φόρμα1
Όρισε Εισαγ2 ΕΙΣΑΓΩΓΗ Φόρμα Φόρμα1
Μέθοδος Εισαγ1 "Spinner", Αληθές, -1000, 2000, 50
Μέθοδος Εισαγ1,"move", 1000, 2000, 5000, 600
Με Εισαγ1, "Prompt", "Ύψος: ",  "Value" ως Αριθ, "VarText" ως Τροφ$, "ThisKind"," μέτρα"
Μέθοδος Εισαγ2 "Spinner", Αληθές, 0, 10000, 5
Μέθοδος Εισαγ2,"move", 1000, 2800, 5000, 600
Με Εισαγ2, "Prompt", "Απόσταση: ",  "Value" ως Αριθ2, "VarText" ως Τροφ2$, "ThisKind"," μέτρα"

Συνάρτηση Εισαγ1.ValidString {
      Κάλεσε Αρ, &Αριθ, ".00", 100, ψευδές
}


Συνάρτηση Εισαγ1.SpinnerValue {
            Διάβασε τιμ
            Τροφ$=γραφή$(τιμ/100,"0.00")
            }
Τροφ$="1,5"
Συνάρτηση Εισαγ2.ValidString {
      Κάλεσε Αρ, &Αριθ2, "", 1, αληθές
}
Συνάρτηση Εισαγ2.SpinnerValue {
            Διάβασε τιμ
            Τροφ2$=γραφή$(τιμ,"")
            }
Τροφ2$="200"
Μέθοδος Φόρμα1,"Show",1
Όρισε Εισαγ2 Τίποτα
Όρισε Εισαγ1 Τίποτα
Όρισε Φόρμα1 Τίποτα