Πέμπτη, 30 Μαρτίου 2017

Αναθεώρηση 8 (Έκδοση 8.6)

Επαναφορά των στατικών μεταβλητών στη συμβατότητα. Διορθώθηκε η χρήση τελεστών ++ -- και += -= /= *= κ.α. για τις στατικές.
Στο παράδειγμα η Δοκίμασε καλεί τον εαυτό της, ενώ κάνει χρήση στατικής και παράλληλα καλεί με δυο τρόπους την συνάρτηση Άλλη η οποία και αυτή έχει στατική μεταβλητή. Η δοκίμασε βρίσκεται σε ομάδα (αντικείμενο). Αυτή η συνάρτηση ανήκει στην ομάδα και βλέπει τις μεταβλητές της (εδώ την Μ ως   τελεία-Μ, ή .Μ  που είναι συντόμευση του Αυτό.Μ και περιέχει επίσης μια συνάρτηση Άλλη η οποία δεν βλέπει κανονικά την .Μ εκτός και αν την καλέσουμε "τοπικά". Παρόλο που την καλούμε τοπικά, έχει δική της στατική Α, δεν μπλέκεται με τις στατικές της Δοκίμασε. Η Κάλεσε τοπικά βάζει στην Άλλη το όνομα της Δοκίμασε, και τον κώδικά της τον κάνει "τοπικό" στην Δοκίμασε. Όμως τρέχει σε άλλο αντικείμενο εκτέλεσης και έτσι έχει δική του συλλογή στατικών.

Η ομάδα Β έχει επιπλέον ένα τμήμα Άλλο το οποίο καλεί και αυτό τη Δοκίμασε(). Επειδή αυτό τρέχει στο δικό του αντικείμενο εκτέλεσης, οι στατικές στην Δοκίμασε και Άλλη είναι διαφορετικές, από αυτές που είχαμε με την κλήση από το τμήμα (δεν φαίνεται το όνομα) που βρίσκεται η Ομάδα Β.

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

Οθόνη ,0 : Δρομέας 0,Ύψος
Ομάδα Β {
      Μ=100
      Συνάρτηση Δοκίμασε {
            Στατική Α=0
            Α++
            Διάβασε Β
            Συνάρτηση Άλλη {
                  Στατική Α=100
                  Α++
                  Τύπωσε "<<";Α;">>", έγκυρο()
            }
            \\ κλήση με την κάλεσε
            Κάλεσε Άλλη()
            \\ Κλήση με την κάλεσε τοπικά
            Κάλεσε Τοπικά Άλλη()
            Τύπωσε "Α=";Α,
            Αν Β=0 Τότε =Α : Έξοδος
           =.Δοκίμασε(Β-1)
      }
      Τμήμα άλλο {
            κλμ=.Δοκίμασε(5)
      }
}
Τύπωσε Β.Δοκίμασε(10)
Τύπωσε Β.Δοκίμασε(10)
Τύπωσε Β.Δοκίμασε(10)
Β.Άλλο

Τετάρτη, 29 Μαρτίου 2017

Αναθεώρηση 7 (Έκδοση 8.6)

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


module alfa (x,y) {
      Print x, y
}
alfa 10,20

Βρήκα ακόμα ένα στις array() και array$() ή πίνακας() και πίνακας$() όπου η εξαγωγή αντικειμένου...δεν γίνονταν γιατί υπήρχε μια εντολή που διέγραφε το αντικείμενο πριν την επιστροφή!
Τώρα δουλεύει.
Οπότε μπορεί να γίνει αυτό:

α=((1,2),(3,4))
Τύπωσε Πίνακας(Πίνακας(α, 0),1) \\ δίνει το 2
Τύπωσε Πίνακας(Πίνακας(α, 1),1) \\ δίνει το 4


Επίσης διόρθωσα στην cons() ή ένωση() την περίπτωση ο πρώτος πίνακας να είναι άδειος, οπότε δεν κάνει προσθήκη αλλά αντιγραφή. (δούλευε σωστά αν ο δεύτερος ήταν άδειος ενώ ο πρώτος δεν ήταν). Το παρακάτω στη προηγούμενη αναθεώρηση έδινε 9 στοιχεία από το 2 (το 1 το πετούσε).
α=(,) \\ κενός πίνακας
Για ι=1 έως 10
      \\ (ι,) είναι ο πίνακας με ένα στοιχείο
      α=ενωση(α, (ι,))
Επόμενο ι
Τύπωσε α



Επίσης διόρθωσα τους πίνακες με πίνακες με αλφαριθμητικά (ήθελε πρώτη τιμή αριθμό, τώρα δέχεται και αλφαριθμητικό)
α=("αλφα", "βήτα") \\ δούλευε
β=(("αλφα","βητα"), ("δέλτα", "κάππα"))
Τύπωσε πίνακας$(πίνακας$(β,0),1) \\ βήτα
Τύπωσε πίνακας$(πίνακας$(β,1),1) \\ κάππα
Ενωσε β στο β$() \\ για να αλλάξουμε τιμές
β$(1)(1)="Λάμδα"
Τύπωσε πίνακας$(πίνακας$(β,1),1) \\ Λάμδα


Τρίτη, 28 Μαρτίου 2017

Αναθεώρηση 6

Μικρή αναθεώρηση. Μερικά παλιά παραδείγματα δεν μπορούσαν να τρέξουν λόγω αλλαγών και τώρα τροποποίησα κατάλληλα τον διερμηνευτή ώστε να τρέχει και τα παλιά παραδείγματα.
Κύρια έφτιαξα την συντομογραφία Α@Β=100 όπου το Α.Β γίνεται γενική μεταβλητή. Οι γενικές μεταβλητές στις νεότερες εκδόσεις δεν πειράζουν τις παλιές γενικές με το ίδιο όνομα. Η Α@Β όμως το έκανε (τουλάχιστον μέχρι την 8.2 έκδοση)...έβροσκε την παλιά και άλλαζε τιμή αντί να φτιάξει νέα.
Τώρα το επανέφερα αυτό χωρίς να πειράξω τον τρόπο με τις "κανονικές" γενικές.
Γενικά ψάχνω για ασυμβατότητες σε καθημερινή βάση!
Το πρόβλημα το βρήκα όταν εκτέλεσα το παλιό πρόγραμμα εδώ το οποίο ήταν το πρόγραμμα "παράδειγμα" που έφτιαξα και κατανόησα πώς θα μπορούσα να φτιάξω τις Ομάδες, τα αντικείμενα της Μ2000 (μέχρι τότε δεν είχα βάλει αντικείμενα εκτός από τα τύπου COM, δηλαδή να ανοίγουμε το Word - τέτοιου τύπου είναι).
 

Αναλογικό Ρολόι με Ξυπνητήρι (ενημρώθηκε)

Μια ωραία εφαρμογή ρολογιού!
Με ctrl+F1 δίνει οδηγίες. Μπορεί να εμφανίζει ώρες/λεπτά πάντα ολόκληρα, ή αναλογικά. Υπάρχει μια κεντρική επανάληψη που γίνεται κάθε ένα δέκατο του δευτερολέπτου. Θα μπορούσα να το βάλω ανά μισό δευτερόλεπτο αλλά επειδή χειρίζομαστε το δείκτη του ξυπνητηριού θέλουμε να γίνεται πιο γρήγορα ανανέωση της οθόνης. Η βασική οθόνη σώνεται με την Κράτησε και εμφανίζεται με την Άφησε και πάνω σε αυτήν βάζουμε ότι αλλάζει. Η εντολή Ανανέωση 1000 λέει στο σύστημα να εμφανίσει την εικόνα, και να θέσει το μετρητή για την επόμενη αυτόματη εμφάνιση σε 1 δευτερόπλεπτο. Πιο γρήγορα θα δώσουμε πάλι το Ανανέωση 10000. Με αυτόν τον τρόπο δεν βλέπουμε ποτέ να χτίζεται η εικόνα, αλλά μόνο τις αλλαγές της.

Έχω χρησιμοποιήσει αρκετά στοιχεία του Περιβάλλοντος της Μ2000. Όπως την Επιφάνεια. Η πρώτη παράμετρος λέει για την διαπερατώτητα της βασικής φόρμας (της κονσόλας με το περιθώριο μαζί). Το 255 αφαιρεί τη διαφάνεια, το 0 την κάνει 100%. Εδώ βάζω το 220, δηλαδή λίγο διαπερατό. Όμως η δεύτερη προεραιτική παράμετρος έχει το χρώμα που θα είναι 100 διαπερατό και μάλιστα ότι είναι πίσω μπορεί να επιλεχθεί, δηλαδή δεν ανήκει στη φόρμα. Το μανζέντα (βασικό χρώμα 5) το χρησιμοποιώ για αυτό το σκοπό, και το ρολόι μένει στην επιφάνεια εργασίας χωρίς να την καλύπτει όλη.

Επίσης χρησιμοποιώ την δυνατότητα να ορίζουμε περιοχές εκτύπωσης, σχεδιάζοντάς της, ώστε εκτός περιοχής να μην γράφουν οι εντολές γραφικών. Με αυτό το τρόπο στο κύκλο του ρολογιού χρησιμοποιώ την Βάψε με δυο χρώματα που τα βάζει με μίξη και διεύθυνση κάθετη.
Εφόσον γράφεται συνέχεια η οθόνη μπορώ να έχω στοιχεία που αναβοσβήνουν, όπως το δείκτη του ξυπνητηριού όταν το ξυπνητήρι είναι ενεργό, με χρήση μιας μεταβλητής λογικής. Δεν έχει ιδιαίτερες μεταβλητές για λογικές η Μ2000, αλλά μπορούμε να χρησιμοποιούμε τις υπάρχουσες με τιμές 0 για ψευδής και -1 για αληθής, υπάρχουν τα Αληθής, Αληθές, Ψευδής και Ψευδές ως σταθερές για το σκοπό αυτό. Επιπλέον η Not υπάρχει ως Όχι και ως Δεν και χρησιμοποιούμε όποια μας βολεύει. Στην αναστροφή λογικής σε μεταβλητή μπορούμε να χρησιμοποιήσουμε τον τελεστή ~ (αυτός ο τελεστής στα αλφαριθμητικά είναι ισοδύναμο με το Like της Visual Basic 6) που τον χρησιμοποιώ στο πρόγραμμα (όχι σε εκφράσεις, απλά δίπλα σε μια μεταβλητή για να αντιστρέψει τη τιμή, αν την βρει μη μηδενική τη θεωρεί Αληθές, οπότε την κάνει Ψευδές).

Φαίνονται στο κώδικα και η χρήση μπλοκ κώδικα που αλλάζουν πρόσκαιρα στοιχεία του αντικειμένου εξαγωγής που συνδέεται με το αντικείμενο εκτέλεσης.  Οι Χρώμα {}, Πάχος {}, Πένα {} σχετίζονται με συγκεκριμένο αντικείμενο. Εδώ δεν φαίνεται αλλά η βασική οθόνη έχει 32 επίπεδα που μπορούν να χρησιμοποιηθούν, συν το Περιθώριο, τη σελίδα του Εκτυπωτή και φυσικά κάθε φόρμα (γραφικό περιβάλλον πάνω από τη κονσόλα) που φτιάχνουμε έχει και αυτή ένα επίπεδο που μπορούμε να το τροποποιήσουμε.

Για ήχο χρησιμοποιώ το Μπιπ (ακριβώς αυτό κάνει), αλλά θα μπορούσε κανείς να μην βάλει μετρητή και όλο αυτό το πρόγραμμα για να έχει διάρκεια μια σειρά από Μπιπ, βάζοντας με μια εντολή Μουσική να παίξει ένα κομμάτι που θέλει (το κράτημα είναι εύκολο, δείτε το Βοήθεια Μουσική). Έχω βάλει τον ήχο να εκτελείται κάθε 0,3 του δευτερολέπτου και όχι σε κάθε επανάληψη...γιατί διαφορετικά η κάθε νέα εντολή αναιρεί την άλλη, και δεν ακούγεται πάντα ο ήχος!


Για τα γραφικά χρησιμοποιώ πολικές συντεταγμένες.Στη Μ2000 οι πολικές συντεταγμένες είναι απόλυτη γωνία (σε μοίρες θα λέγαμε το 0 είναι δεξιά, το 90 πάνω, 180 αριστερά και 270 κάτω, αλλά εδώ είναι σε Ακτίνια άρα 0 δεξιά, πι/2 πάνω, πι αριστερά και πι*3/2 κάτω), και η απόσταση στις βασικές μονάδες της Μ2000, τα twips (1440 twips η ίνστα στον εκτυπωτή, αλλά λογική ίντσα στην οθόνη). Η χάραξε στη βασική διαμόρφωση χρησιμοποιεί σχετικές συντεταγμένες. Στη διαμόρφωση για πολικές συνεταγμένες η γωνία είναι απόλυτη, ενώ η απόσταση από τη φύση της είναι σχετική. Υπάρχει το Χάραξε Εως που χαράζει έως το σημείο που θέλουμε (απόλυτες συντεταγμένες). Πάντα η χάραξε χαράζει από την προηγούμενη θέση του δρομέα γραφικών. Η θέση του δρομέα γραφικών αλλάζει ή με την Θέση σε απόλυτα νούμερα ή με την Βήμα σε σχετικά. Η Βήμα έχει και αυτή πολικές συντεταγμένες αν θέλουμε. Υπάρχει μια παραξενιά εδώ όταν χρησιμοποιούμε τις βήμα και χάραξε επειδή λειτουργούν με πράξεις κινητής υποδιαστολής. Για να είμαστε βέβαιοι ότι θα γυρίσουμε στο σημείο απ΄όπου ξεκινήσαμε με χρήση της Βήμα πρέπει να δώσουμε όλες τις βήμα όπως δώσαμε τις Χάραξε. Διαφορετικά θα βγει άλλο υπόλοιπο από τις εσωτερικές πράξεις και για ένα σημείο (pixel) θα βγει διαφορά!

Για να είναι ωραία η εφαρμογή έχω προσθέσει και προγραμματισμό του Ctrl+F1 (όλα τα προγράμματα πρέπει να υποστηρίζουν το Ctrl+F1 για βοήθεια). Επίσης με την Τίτλος εμφανίζεται και τίτλος στο πλαίσιο πάνω στη γραμμή εργασιών - απ΄όπου μπορούμε να φέρουμε στο προσκήνιο το ρολόι-ξυπνητήρι.

Επίσης όταν προγραμματίζουμε το ξυπνητήρι (δώδεκα ώρες σαν τα επιτραπέζια ρολόγια) βλέπουμε όχι μόνο την ώρα - λεπτά που θα σημάνει αλλά και το πόσα λεπτά μετά θα συμβεί αυτό. Οπότε άμα φτιάχνεις κανείς φαγητό...ρυθμίζει βάσει λεπτών από τώρα...

Στη φωτογραφία έχω ανοίξει και το Μ2000 Pad, και έχω φέρει το ρολόι στο προσκήνιο για να φανεί η διαφάνεια! Κάθε πρόγραμμα σε Μ2000 τρέχει ξεχωριστά από το άλλο, δεν είναι δηλαδή στο ίδιο περιβάλλον.
Διορθώθηκε η εμφάνιση της ένδειξης με νούμερα, τώρα φαίνονται και τα δευτερόλεπτα.




\\ Αναλογικό ρολόι-ξυπνητήρι
Οθόνη 5,0
Πενα 14
Περιθώριο {Πένα 14}
Άναψε
Επιφάνεια 220, 5
\\ ανοίγει με ctrl+f1
Περί ! "Μ2000 Ρολόι", 10000, 6000,{Ρολόι 12 ωρών, και ξυπνητήρι 12 ωρών
      Πλήκτρα:
            Μεσαίο πλήκτρο του ποντικιού βάζει/βγάζει το ξυπνητήρι/ σταματάει το κουδούνισμα
            Αριστερό/Δεξί πλήκτρο αλλάζει το ξυπνητήρι ανά λεπτό
            Μαζί με το μεσαίο αλλαζει το ξυπνητήρι ανά 10 λεπτά
            Τα βελάκια αριστερά - δεξιά αλλάζει επίσης το ξυπνητήρι
            Μαζί με το άνω βελάκι αλλάζει το ξυπνητήρι ανά 10 λεπτά
            Το κάτω βελάκι βάζει/βγάζει το ξυπνητήρι/ σταματάει το κουδούνισμα
            Το Enter αλλάζει τους δείκτες σε εμφάνιση (ανά ολόκληρες ώρες ή αναλογικά)
            Το διάστημα κλείνει το πρόγραμμα
      }
κχ=χ.σημεία-4000
κυ=4000
απ1=3000
απ2=600
απ3=απ1-απ2
κυκλ=πι*2
κυκλ60=κυκλ/60
Ξυπνητήρι=0
ΞυπνητήριΟκ=Ψευδής
ΠαίξεΉχο=Ψευδής
ΟλόκληρεςΏρες=Ψευδές
Αναβοσβήνει=Ψευδής
ΑρχικόςΧρόνος=20*10 \\ 20 δευτερόπλεπτα
ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
Ωρα=0
Ωρα12=0
λεπτό=υπωρα(0,0,1,0)
Θέση κχ, κυ
\\ η χρώμα { } ; φτιάχνει περιοχή μόνο για εμφάνιση
Χρώμα { Κύκλος Γέμισμα 2, απ2+απ1 } ;
Θέση κχ-απ2-απ1, κυ-απ2-απ1
Βάψε 2*(απ2+απ1),2*(απ2+απ1), 7,1,1
Θέση κχ, κυ-απ1*3/4
Τίτλος "Μ2000 Ρολόι"
Επιγραφή "Μ2000 Ρολόι","Arial Black",18,0,2
Θέση κχ, κυ
\\ με χρώμα 5 αντί για #2277ff γίνεται διάφανο
\\ έχουμε δηλώσει το 5 (ματζέντα) στην εντολή Επιφάνεια
Πένα #2277ff {Κύκλος Γέμισμα #2277ff, απ3/2}
π=2
ι=0
Για ν=0 εως 59
      Αν ν υπολ 5 = 0 τότε {π=4} αλλιώς π=1
      Πάχος π {
            Βήμα γωνια ι, απ1
            Χάραξε γωνία ι, απ2
            Βήμα γωνια ι, -απ2-απ1
      }
            ι+=κυκλ60
Επόμενο ν
Κράτησε
Ανανέωση 1000
Κάθε 100 {
Αναβοσβήνει~   \\ αντιστροφή λογικής  (Αναβοσβήνει = Δεν Αναβοσβήνει)
Άφησε
Ωρα=Τώρα
Ωρα12=(τιμη(γραφη$(Ωρα,"h")) υπολ 12) *60+τιμη(γραφη$(Ωρα,"n"))
Θέση κχ, κυ+απ1/2
      Αν Ωρα12<60 τότε {
            Επιγραφή Γραφη$(υπωρα(0,12,Ωρα12,τιμη(γραφη$(Ωρα,"s"))), "hh:nn:ss"), "Verdana", 18,0,2
      } Αλλιώς {
            Επιγραφή Γραφη$(υπωρα(0,0,Ωρα12,τιμη(γραφη$(Ωρα,"s"))), "hh:nn:ss"), "Verdana", 18,0,2
      }
Πένα -ΞυπνητήριΟκ*8+4 {
      Βήμα , +απ1/8
      Επιγραφή "+"+Γραφη$(υπωρα(0,0,(ξυπνητήρι-Ωρα12+720) υπολ 720,0), "hh:nn "), "Verdana", 18,0,2
      Βήμα , +απ1/8

      Αν ξυπνητήρι<60 τότε {
            Επιγραφή Γραφη$(υπωρα(0,12,ξυπνητήρι,0), "hh:nn"), "Verdana", 18,0,2
      } Αλλιώς {
            Επιγραφή Γραφη$(υπωρα(0,0,ξυπνητήρι,0), "hh:nn"), "Verdana", 18,0,2
      }
}
Θέση κχ, κυ
γωνία_ξυπν=-ξυπνητήρι*πι/360+πι/2
Αν Αναβοσβήνει ή όχι ΞυπνητήριΟκ τότε {
      Πάχος 2 {
            Βήμα Γωνία γωνία_ξυπν, απ3
            Χάραξε Γωνία γωνία_ξυπν, απ2, 13
                  Βήμα Γωνία γωνία_ξυπν, -απ2
            Βήμα Γωνία γωνία_ξυπν, -απ3
      }
}
Αν ΟλόκληρεςΏρες Τότε {
       γωνια_ώρα=-(τιμη(γραφη$(Ωρα,"h")) υπολ 12)*πι/6+πι/2
} Αλλιώς γωνια_ώρα=-(τιμη(γραφη$(Ωρα,"h")) υπολ 12+τιμη(γραφη$(Ωρα,"n"))/60)*πι/6+πι/2
Πάχος 2 {
      Χάραξε Γωνία γωνία_ώρα+πι/20, απ3/2
      Χάραξε Γωνία γωνία_ώρα-πι/20, απ3/2
      Χάραξε Γωνία γωνία_ώρα+πι/20, -απ3/2
      Χάραξε Γωνία γωνία_ώρα-πι/20, -απ3/2
}
Αν ΟλόκληρεςΏρες Τότε {
      γωνία_λεπτά=-τιμη(γραφη$(Ωρα,"n"))*πι/30+πι/2
} Αλλιώς {
      γωνία_λεπτά=-(τιμη(γραφη$(Ωρα,"n"))+τιμη(γραφη$(Ωρα,"s"))/60)*πι/30+πι/2
}
Πάχος 2 {
      Χάραξε Γωνία γωνία_λεπτά+πι/20, απ1/2
      Χάραξε Γωνία γωνία_λεπτά-πι/20, απ1/2
      Χάραξε Γωνία γωνία_λεπτά+πι/20, -απ1/2
      Χάραξε Γωνία γωνία_λεπτά-πι/20, -απ1/2
}
γωνία_δευτ=-τιμη(γραφη$(Ωρα,"s"))*πι/30+πι/2
Πάχος 2 {
      Χάραξε Γωνία γωνία_δευτ, απ3, 15
      Βήμα Γωνία γωνία_δευτ, -απ3
}
Αν Πατημένο(1) ή Πατημένο(0x25) τότε {
Αν Πατημένο(4) ή Πατημένο(0x26) τότε {ξυπνητήρι-=10: ΞυπνητήριΟκ=Αληθής} αλλιώς ξυπνητήρι--
      ξυπνητήρι=(ξυπνητήρι+720) υπολ 720
} Αλλιως.Αν Πατημένο(2) ή Πατημένο(0x27) τότε {
Αν Πατημένο(4) ή Πατημένο(0x26) τότε {ξυπνητήρι+=10: ΞυπνητήριΟκ=Αληθής} αλλιώς ξυπνητήρι++
      ξυπνητήρι=(ξυπνητήρι+720) υπολ 720
}
Αν Πατημένο(32) τότε Έξοδος
Ανανέωση 1000
Αν ΞυπνητήριΟκ και ΧρόνοςΜπιπ>0 Τότε {
      Αν (τιμη(γραφη$(Ωρα,"h")) υπολ 12 )*60+τιμη(γραφη$(Ωρα,"n"))=ξυπνητήρι τότε {
            ΠαίξεΉχο=Αληθής
      }
}
Αν ΞυπνητήριΟκ και όχι (Πατημένο(2) ή Πατημένο(1)) Τότε {
      Αν Πατημένο(4) ή Πατημένο(0x28) Τότε ΠαίξεΉχο=Ψευδής: ΞυπνητήριΟκ=Ψευδής : ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
} Αλλιώς.Αν Πατημένο(4) ή Πατημένο(0x28) Τότε {
            ΞυπνητήριΟκ=Αληθής
            ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
}
Αν ΠαίξεΉχο Τότε {
      Αν ΧρόνοςΜπιπ υπολ 3 =0 τότε Μπιπ
      ΧρόνοςΜπιπ--
      Αν ΧρόνοςΜπιπ=0 Τότε ΠαίξεΉχο=Ψευδής: ΞυπνητήριΟκ=Ψευδής
}


Αν Πατημένο(13) τότε ΟλόκληρεςΏρες~ \\ αντιστροφή αληθές<>ψευδές
}
Οθόνη \\ επαναφορά από το περιορισμό περιοχής της Χρώμα
Επιφάνεια 255


Δευτέρα, 27 Μαρτίου 2017

Αναθεώρηση 5 (Έκδοση 8.6)

1) Προστέθηκαν μερικά αναγνωριστικά στο αρχείο βοήθειας.
2) Προστέθηκε η δυνατότητα να φτιάχνουμε ιδιωτικές κλάσεις με τιμές αριθμητές ή αλφαριθμητικές εντός κλάσεων (οι Ιδιότητες παρεμένουν ως έχουν, να είναι πάντα δημόσιες)

Δυο παραδείγματα (στα αγγλικά) που δείχνουν την νέα δυνατότητα:
Όταν δημιουργούμε μια κλάση σε ένα τμήμα τότε η κλάση γίνεται αυτόματα μια γενική συνάρτηση. Εντός μιας κλάσης ή μιας ομάδας ο ορισμός κλάσης είναι τοπικός. Όμως επειδή οι ομάδες δεν έχουν ξεχωριστό interface (αλλά ένα κοινό), μπορούμε ένα αντικείμενο να το χειριστούμε αν το δώσουμε ως επιστροφή από μια συνάρτηση. Δηλαδή ο διερμηνευτής της Μ2000 δεν χρειάζεται να ξέρει τι έχει μια ομάδα δηλώνοντας έναν τύπο. Για παράδειγμα όταν δημιουργούμε την Class BetaClass ο διερμηνευτής παίρνει το κείμενο όπως είναι και το καταχωρεί σαν συνάρτηση. Όταν γράφουμε εντός μιας κλάσης ή μιας ομάδας το BetaClass Beta, Delta ο διερμηνευτής εκτελεί αυτό Beta=BetaClass() και αυτό Delta=BetaClass(). Κάθε φορά η συνάρτηση BetaClass() επιστρέφει ένα ανώνυμο αντικείμενο και αυτό έχει μέσα τη λίστα με τα περιεχόμενά του. Ο διερμηνευτής παίρνει τη λίστα και φτιάχνει όλο το περιεχόμενο με το όνομα που δίνουμε εδώ Beta (και μετά με το Delta), έτσι το όνομα της ιδιωτικής k είναι Beta.k αλλά σαν ιδιωτική δεν μπορεί να "βρεθεί" αν την καλέσουμε έξω από ένα τμήμα/συνάρτηση που ανήκει στο Beta. Επειδή και το Beta ανήκει σε μια άλλη κλάση και έχει δηλωθεί ιδιωτικό, ούτε αυτό μπορεί να βρεθεί έξω από εκεί που φτιάχτηκε.
Το Μ θα μπορούσε και αυτό να γύρναγε μια τιμή που θα θέλαμε. Τώρα γυρνάνει ένα αντίγραφο του εαυτού του, δηλαδή ένα αντικείμενο ομάδα με όλα τα στοιχεία του Μ, ακόμα και τα ιδιωτικά ως αντίγραφα. Έτσι μια Ζ=Μ θα παράγει ένα Ζ ίδιο με το Μ (το Ζ είναι αντιγραφή του Μ όχι αναφορά).
Αν το Μ επέστρεφε τιμή (επειδή είχαμε βάλη μια Set { }) τότε το Ζ θα έπαιρνε αυτήν την τιμή. Αν θέλαμε να έπαιρνε το αντίγραφο ομάδας τότε θα το επιστρέφαμε ως Ομάδα(Μ)
Σε περίπτωση που το Μ γύρναγε αλφαριθμητικό τότε θα ήταν γραμμένο ως Μ$ (απαραίτητα πρέπει να φαίνεται στον εκτιμητή παραστάσεων αν κάτι γυρνάει αλφαριθμητικό με το σύμβολο $). Δηλαδή Class Alfa$ { } και M$=Alfa$(). Και από αυτό μπορούμε να πάρουμε την ομάδα με την Ομάδα$(Μ$). Μάλιστα όλες οι ομάδες με όνομα με σύμβολο $ έχουν και όνομα χωρίς αυτό (αλλιώς δεν θα μπορούσαμε να πάρουμε μια αριθμητική τιμή, από μια περιεχόμενη ιδιότητα με αριθμητική τιμή). Στο δεύτερο παράδειγμα κάνουμε χρήση αυτού και έτσι δείχνουμε την τιμή μιας αριθμητικής συνάρτησης της ομάδας Beta$ που φτιάξαμε με την BetaClass$ (και η ομάδα και η κλάση έχουν το σύμβολο του αλφαριθμητικού, σημαίνει ότι η ομάδα και η παραγόμενη από τη κλάση γυρνάει τιμή αλφαριθμητικό)
Όταν δίνουμε τιμές σε ομάδες που περιέχονται σε άλλες, δηλαδή όταν δίνουμε σε ομάδες της ομάδας τότε βάζουμε το <= και όχι το = γιατί ο διερμηνευτής πάντα προτιμάει να φτιάχνει τοπικές μεταβλητές και το "<=" του λέει "ψάξε αλλού" (γενικά το χρησιμοποιούμε για γενικές μεταβλητές, αλλά και για τις μεταβλητές της ομάδας από τις συναρτήσεις και τα τμήματα της ομάδας)

Προσθήκη στο πρώτο παράδειγμα, ο τελεστής "++".


Class Alfa {
Private:
      Class BetaClass {
      Private:
            k=100
      Public:
            Dim B(20)=1234
            Function KLM {=1001}
            Value {=.k}
            Set {Read .k }
            Operator "++" {
                  .k++
            }
            N=130
      }
      \\ make two objects inside Alfa Class
      BetaClass Beta, Delta
Public:
      Module TestMe {
            Print .Beta
            .Beta<=500
            Print .Beta, .Beta.N , .Beta.KLM(), .Beta.B(2)
            Print .Delta, .Delta.N , .Delta.KLM(), .Delta.B(2)
            Print Valid(.Beta.k) \\ 0 = False
            Print .Beta-.Delta \\ 400
            .Beta++
            Print .Beta
      }
}
M=Alfa()
M.TestMe
Print Valid(M.Beta) \\ 0 = False


Σε άλλο τμήμα γράφουμε αυτό:


Class Alfa {
Private:
      Class BetaClass$ {
      Private:
            k$="Yes"
      Public:
            Value {=.k$}
            set {Read .k$}
            Function KLM {=1002}
            Dim B(20)=1234
      }
      BetaClass$ Beta$, Delta$
Public:
      Module TestMe {
            Print .Beta$
            .Beta$<="No"
            Print .Beta$, .Delta$
            Print .Beta.KLM(), .Beta.B(2)
      }
}


M=Alfa()
M.TestMe





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

Κράτηση Τμήματος, αλλαγές και συνέχιση!

Η εντολή Δοκιμή ανοίγει τον έλεγχο, όπου μπορούμε να δούμε τιμές, το σωρό, να κάνουμε διάφορα αλλά δεν μπορούμε να αλλάξουμε τιμές. Δεν μπορούμε δηλαδή να διακόψουμε το πρόγραμμα και να επέμβουμε αλλάζοντας τιμές (ίσως κάποτε το βάλω και αυτό).
Μπορούμε όμως με έναν άλλο τρόπο να το κάνουμε! Δηλαδή με το γενικό τμήμα Στάση, γενικό για να το καλούμε απ΄οπουδήποτε, όταν το καλούμε με την Κάλεσε Τοπικά Στάση μας βγάζει σε γραμμή εντολών! Με την Κάλεσε Τοπικά δεν αλλάζει το όνομα του τμήματος. Μπορούμε να αλλάξουμε τιμές (μπορούμε να προσθέσουμε μεταβλητές αλλα θα χαθούν στο πέρας της εκτέλεσης της Στάσης). Μπορούμε να δώσουμε εντολές όπως Λίστα, ή Τμήματα !, αλλά και πιο "βαριές" να δώσουμε τη Σ όνομα_τμήματος και να αλλάξουμε κώδικα, ή να αλλάξουμε θέση ετικετών (όταν αλλάζουμε το κείμενο - πρόγραμμα- του τμήματος σβήνει ο εσωτερικός πίνακας που δείχνει που είναι η θέση της κάθε ετικέτας που ζητήθηκε έστω μια φορά, οπότε ξαναχτίζεται μετά). Γράφουμε την εντολή Συνέχεια, και συνεχίζει το πρόγραμμα! Μπορούμε όσες φορές θέλουμε να βάλουμε το Κάλεσε Τοπικά Στάση. Το ? μόνο του δίνει τη βοήθεια! Αλλιώς είναι το Τύπωσε.




Τμήμα Γενικό Στάση {
      Τοπική αα_$
      Δες {
                  Τύπωσε "Στάση στο "+Τμήμα$+">";
                  Γραμμή Εισαγωγής αα_$
                  Τύπωσε
                  αα_$=Αποκ$(αα_$)
                  Αν αα_$="?" Τότε Αναφορά "Δώσε Συνέχεια για να συνεχίσεις, ή Λίστα, ή όποια άλλη εντολή θέλεις"
                  Αν Κεφ$(αα_$)="ΣΥΝΕΧΕΙΑ" τότε έξοδος
                  Δες οκ {
                        Ένθεση αα_$
                  }
                  Αν Λάθος ή όχι οκ Τότε Τύπωσε Λάθος$
                  Κυκλικα
      }
}
\\ δοκιμή
Τμήμα Κάτι {
      Α=500
      Τμήμα ΚάτιΆλλο {
            Α=10
            Β=20
            Αναφορά {Δοκίμασε σκέτο ?
            επίσης:
                  Λίστα
                  ? Α
                  ? Β
                  Α+=10  ' για αλλαγή τιμής
            }
            Κάλεσε Τοπικά Στάση
            Τύπωσε Α+Β
      }
      ΚάτιΆλλο
}
Κάτι

Αναθεώρηση 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 Τίποτα