Τρίτη 27 Οκτωβρίου 2015

Αναθεώρηση 70, μικρή προσθήκη

Αφαίρεσα ένα bug. Στο περιβάλλον με το κάτω βελάκι πατημένο λογικά βλέπουμε κάποια παλιά εντολή αλλά στην αρχή όταν δεν υπάρχουν εντολές...άφηνε σκουπίδια - παλιά δεν το έκανε αλλά με τις αλλαγές στις ρουτίνες εκτύπωσης αυτό δεν το είχα προσέξει.
Πρόσθεσα στην εντολή Πάχος για πάχος 1 μια παράμετρο το τύπο της γραμμής..υπάρχουν 7 τύποι.
Ανοίγουμε το περιβάλλον (m2000.exe) γράφουμε Σ Α και αντιγράφουμε το παρακάτω:

για ι=0 εως 6 {
      οθονη 1,0 \\ βάζει μπλε και την χωριστή οθόνη στη πρώτη γραμμή
      θέση 6000,6000 \\ θέση απόλυτη
      κύκλος 3000
      βήμα -3000,0 \\ θέση σχετική
      πενα 14 {
            πάχος 1, ι {
                  χάραξε 6000,0 \\ θέσεις σχετικές
            }
      }
α$=κομ$ \\ περιμένει ένα πλήκτρο
}

Μετά πατάμε ESC και τρέχουμε το πρόγραμμα γράφοντας Α και πατάμε Enter

Δες στην εγκατάσταση πως θα κατεβάσεις το περιβάλλον προγραμματισμού

Γ Κ


Δευτέρα 26 Οκτωβρίου 2015

Λουλούδια! (απλό πρόγραμμα)

Ο τίτλος είναι ένα αστείο, γιατί το πρόγραμμα παρακάτω φτιάχνει δυο "περιστρεφόμενα" σχήματα φτιαγμένα με καμπύλες, που απλά φαίνονται ως λουλούδια, με χρήση πολικών συντεταγμένων.

Για να τρέξει ανοίξτε τη Μ2000 γράψτε σ α και κάντε επικόλληση το παρακάτω. Μετά πατάμε Esc ή από το σχετιζόμενο μενού κάνουμε έξοδο και γράφουμε α και πατάμε Enter. Για να κλείσει η γλώσσα γράφουμε Τέλος. Μπορούμε όμως να γράψουμε πριν Σώσε Λουλούδι ώστε την επόμενη φορά να ανοίξουμε την γλώσσα και να φορτώσουμε το πρόγραμμα με την Φόρτωσε Λουλούδι
Προσθήκη δυο εντολών για αργούς υπολογιστές, και η δεύτερη λόγω αναθεώρησης 89, όπου βελτιώθηκε η ταχύτητα εντολών με λίγες αλλαγές ως προς τις ανανεώσεις. Η Ανανέωση 2000 βάζει το μετρητή ανανέωσης στα 2 δευτερόλεπτα. Σε παλιότερες αναθεωρήσεις οι εντολές γραφικών δεν έδιναν εντολή για ανανέωση εικόνας. Τώρα δίνουν με έλεγχο του μετρητή.



Θεσε γρηγορα !
Ανανεωση 2000

Οθόνη 1,0
Φόντο 1,2 ' από μπλε μέχρι πράσινο
Πένα 13
Διπλά
Πάχος 2 {Χρώμα 4 {Τύπωσε "Μ2000",,"Λουλούδια"}} \\ περίγραμμα στα γράμματα
Κανονικά
Πένα 15
Για ι=Πι/10 Έως Πι Ανά Πι/2 {
      μια_τιμή=Τυχαίος(2,15)
      σταθερά1=1400
      σταθερά2=1100
      Για Λ=Πι/16 Έως 2*Πι+Πι/16 Ανά Πι/32 {
            σταθερά2=σταθερά2+55
            σταθερά1=σταθερά1+σταθερά2/σταθερά1*58
            Χρώμα ! μια_τιμή {
                  Για Μ=Πι/8 Έως 2*Πι Ανά Πι/8 {
                        Θέση 5000,5000
                        α=Πι/3+Μ+Λ
                        β=2*Λ+Μ
                        γ=Πι+Μ+Λ
                        Καμπύλη Γωνία α,500,β,-3000,γ,2000
                        Θέση σταθερά1,σταθερά2
                        Καμπύλη Γωνία Πι/16-α,100,Πι/16-β,-600,Πι/16-γ,400
                  }
            }
            Ανανέωση
            Χρώμα ! μια_τιμή {
                  Για Μ=Πι/8 Έως 2*Πι Ανά Πι/8 {
                        α=Πι/3+Μ+Λ
                        β=2*Λ+Μ
                        γ=Πι+Μ+Λ
                        Θέση 5000,5000
                        Καμπύλη Γωνία α,500,β,-3000,γ,2000
                        Θέση σταθερά1,σταθερά2
                        Καμπύλη Γωνία Πι/16-α,100,Πι/16-β,-600,Πι/16-γ,400
                  }
            }
      }
}








Το πρόγραμμα το είχα γράψει στα αγγλικά (η Μ2000 έχει διπλό σετ εντολών, αγγλικά και ελληνικά). Εδώ μάλιστα έχω χρησιμοποιήσει το FOR NEXT αντί για το FOR { } (το δεύτερο είναι πιο γρήγορο)

Put the code in module a (write Edit a then paste this code and press Esc, then write a press enter and the code run). 


SET FAST !
REFRESH 2000

CLS 1,0
GRADIENT 1,2 \\ from Blue to Green                          
PEN 13
DOUBLE
WIDTH 2 {PATH 4 {PRINT "Μ2000",,"FLOWERS"}}
NORMAL
PEN 15
FOR kkk=PI/10 TO PI STEP PI/2
      cc=RANDOM(2,15)
      qqq=1400
      qqq1=1100
      FOR K=PI/16 TO 2*PI+PI/16 STEP PI/32
            qqq1=qqq1+55
            qqq=qqq+qqq1/qqq*58
            PATH ! cc {
                  FOR Q=PI/8 TO 2*PI STEP PI/8
                        MOVE 5000,5000
                        a=PI/3+Q+k
                        b=2*k+Q
                        c=PI+Q+k
                        CURVE ANGLE a,500,b,-3000,c,2000
                        MOVE qqq,qqq1
                        CURVE ANGLE PI/16-a,100,PI/16-b,-600,PI/16-c,400
                  NEXT Q
            }
            REFRESH
            PATH ! cc {
                  FOR Q=PI/8 TO 2*PI STEP PI/8
                        a=PI/3+Q+k
                        b=2*k+Q
                        c=PI+Q+k
                        MOVE 5000,5000
                        CURVE ANGLE a,500,b,-3000,c,2000
                        MOVE qqq,qqq1
                        CURVE ANGLE PI/16-a,100,PI/16-b,-600,PI/16-c,400
                  NEXT Q
            }
      NEXT k
NEXT kkk



You can use another module, say b, to run this in endless, so write: Edit b then paste the code below, press Esc and write b and press enter to run the module b. Pressing key A (or a is the same), exit the loop. Statement loop restart the module (or a block) when reach the end of block/module. 

a
if keypress(65) then exit
loop


Μια μικρή εξήγηση:

 1) Για το PATH !  ή PATH χωρίς το θαυμαστικό. Η path ή χρώμα βάζει χρώμα φόντου. Αν όμως χρησιμοποιήσουμε το θαυμαστικό τότε αλλάζει τον τρόπο εκτύπωση σε XOR δηλαδή δυο φορές το ίδιο η εικόνα επανέρχεται όπως ήταν. επειδή αν πούμε ότι Α είναι το χρώμα της γραμμής και Β το χρώμα που πατάει στην οθόνη τότε το (Α Xor B ) Xor A δίνει πάλι Β. Αυτή τη τεχνική την χρησιμοποιούμε στο Rubber Band Drawing όπου μπορούμε να τραβάμε μια γραμμή (τη βλέπουμε στην οθόνη) αλλά το μέρος που πατάει δεν χαλάει, λόγω της διπλής αποτύπωσης. Το μυστικό της επιτυχίας λοιπόν είναι στην εντολή Ανανέωση (Refresh) όπου κάνουμε το Περιβάλλον της Μ2000 να δείξει τις αλλαγές της Οθόνης όταν γράφουμε την πρώτη φορά το σχέδιο. Μετά το γράφουμε άλλη μια φορά, άρα το αφαιρούμε, και μετά φτιάχνουμε το νέο, την άλλη θέση ή κατάσταση. Δηλαδή τη πρώτη φορά παίζει το Α Xor B και μετά το Α Xor B1 όπου το B1 είναι το Α Xor B...άρα παίρνουμε τελικά το B. Η Χρώμα ή Path (παίζει και η Color το ίδιο, αλλά εδώ έχω προτιμήσει το Path, μάλιστα αυτή η εντολή με ερωτηματικό μετά το μπλοκ αλλάζει συμπεριφορά γίνεται region, αλλά θα το δούμε άλλη φορά, μην το βάλετε το ερωτηματικό πριν μάθετε τι κάνει...) επενεργεί με το ! σε όλο το σχήμα, και το φόντο δηλαδή, όχι μόνο το περίγραμμα.

 2) Επιπλέον τα σχέδια τυπώνονται μόνο με την εντολή Καμπύλη Γωνία όπου δίνουμε γωνία (απόλυτη), και απόσταση (σχετική), δηλαδή χρησιμοποιούμε πολικές συντεταγμένες. (χωρίς το γωνία παίρνει τις κανονικές). Η Καμπύλη είναι τύπου  Bezier.

 3) Η επιγραφή έχει βγει με το Path, αφού μπορούμε και στα γράμματα να δώσουμε χρώμα φόντου (και αυτά είναι γραφικά εντέλει). Έτσι αν δώσουμε φόντο με την Path ή Χρώμα, το χρώμα της οθόνης αφήνουμε τα γράμματα με την γραμμή περιγράμματος. Μάλιστα μπορούμε να δώσουμε και πάχος γραμμής. Σημειώστε ότι τα σχέδια βγαίνουν αν θέλουμε και στον εκτυπωτή.

Γ.Κ.


Αναθεώρηση 69 - πολύ καλή!

Η προηγούμενη αναθεώρηση έβγαλε ένα δυο Bug, τα οποία διορθώθηκαν.Οι αλλαγές ήταν σημαντικές, στο τρόπο εκτύπωσης, στην οθόνη και στον εκτυπωτή. Θα αναλύσω παρακάτω το θέμα.
Στην σημερινή αναθεώρηση (69), διόρθωσα όλα τα bug, της προηγούμενης (π.χ, είχε πρόβλημα η εντολή CLS ή ΟΘΟΝΗ), και επέκτεινα τον τρόπο χρωματισμού του κώδικα, ώστε να περιλαμβάνει ένα στοιχείο που ήθελα να μπορώ να εμφανίζω σωστά την ανάθεση τιμής σε αλφαριθμητικό με με πολλαπλές γραμμές (παραγράφους).
Ο χρωματισμός ήταν πετυχημένος στις προηγούμενες αναθεωρήσεις και πολύ γρήγορος αλλά γίνονταν μόνο ανά γραμμή. Το πρόβλημα που είχα να λύσω ήταν να υπήρχε τρόπος μια γραμμή να "γνωρίζει" ότι δεν θα χρωματιστεί γιατί είναι κείμενο και όχι εντολές.
Η Μ2000 διαβάζει την θέση της τελευταίας αγκύλης και σβήνει τα διαστήματα από την δεύτερη και τρίτη γραμμή. Στο αλφαριθμητικό θα υπάρχουν και τρία CRLF ( χαρακτήρες 13 και 10), που υποδηλώνουν τον τερματισμό παραγράφου.
π.χ.
Α$={Πρώτη γραμμή
    Δεύτερη γραμμή
    Τρίτη γραμμή-παράγραφος
    }

Περί του διορθωτή
Για τον μεταφραστή της Μ2000 το κείμενο το διαβάζει σε μια σειρά, αλλά δεν ισχύει το ίδιο για τον διορθωτή (τον Editor εκεί που γράφουμε προγράμματα). Ο διορθωτής ανοίγει με την εντολή συγγραφή ή σκέτο με ένα σίγμα αλλά απαραίτητα θέλει και το τι θα φτιάξει, ένα όνομα τμήματος, ή μιας συνάρτησης. Π.χ. αν γράψουμε σ Α$() θα ανοίξει ο διορθωτής και θα εμφανίσει πάνω αριστερά το όνομα Α$() και εμείς αρκεί να δώσουμε το ="α" και έχουμε μια συνάρτηση Α$() που δίνει το "α"
Ο διορθωτής λοιπόν πρέπει να εμφανίζει με άλλο χρώμα τις εντολές, τους αριθμούς, τα δικά μας αναγνωριστικά (δηλαδή τις δικές μας μεταβλητές-τμήματα-συναρτήσεις). Επίσης χρωματίζει τα αλφαριθμητικά (τα οποία μπορεί να είναι ανάμεσα από διπλά εισαγωγικά ή σε αγκύλες. Ειδικά με τις αγκύλες μπορούμε να συμπεριλάβουμε κείμενο.

Για να αντιληφθούμε τη δυσκολία...αρκεί να σκεφτούμε πόσες καταστάσεις έχει αυτή η διαμόρφωση κειμένου μέσα στο κείμενο εντολών για τον διορθωτή. Ο διορθωτής δεν παίρνει μόνο ότι πληκτρολογούμε, αλλά μπορεί να πάρει κείμενο με επικόλληση και με σύρσιμο. Επίσης μπορούμε να διαγράφουμε με backspace, με delete, με επιλογή μπλοκ, αλλά επίσης μπορούμε να κάνουμε πολλαπλές αλλαγές (αναζήτηση και αντικατάσταση). Σε όλα αυτά να προσθέσω ότι μπορούμε να επιλέγουμε πολλές γραμμές και με TAB να τις μεταφέρουμε πιο δεξιά, ή με SHIFT TAB πιο αριστερά, ώστε να γράφουμε κώδικα με διάρθρωση εσοχών. Επιπλέον όταν αλλάζουμε γραμμή αυτόματα προσθέτει ο διορθωτής διάστημα. Επιπλέον αν ξεκινήσουμε με νούμερα μια γραμμή στην επόμενη μπαίνει το επόμενο νούμερο (+10) ή (+1) αν υπάρχει το (+10).
Με F1 ελέγχουμε τη αναδίπλωση λέξεων. 'Έτσι αν θέλουμε το κείμενο στα αλφαριθμητικά φαίνεται σε παραγράφους κανονικά (αυτό ισχύει και για τον κώδικα). Το σπάσιμο των γραμμών γίνεται πάρα πολύ γρήγορα...¨Εχω δοκιμάσει κείμενο του 1MB, με 30000 περίπου γραμμές και η αλλαγή γίνεται αστραπιαία.(το ίδιο και ο χρωματισμός, και εδώ μάλιστα έχει να ελέγξει καμιά 500αριά λέξεις για κάθε μια που βρίσκει στο κείμενο, περίπου 250 ελληνικές και 250 αγγλικές).

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

Χρήσιμα είναι και τα άλλα F πλήκτρα: F2 και F3 κάνουν άνω ή κάτω αναζήτηση στη λέξη που έχουμε επιλέξει  (με ένα κλικ επιλέγεται μια λέξη). Με F4 κάνουμε όλες τις ίδιες λέξεις στην ίδια διαμόρφωση πεζά-κεφαλαία. Το F5 κάνει την αλλαγή για την λέξη που έχουμε επιλέξει. Οι αλλαγές καταχωρούνται σε λίστες. οπότε έχουμε τα Ctrl+Z (undo) και Ctrl+Y (redo). Αν βγούμε από τον διορθωτή οι λίστες καθαρίζουν. Τα F6 F7 και F8 είναι δείκτες που μας μετακινούν αυτόματα στο κείμενο. Οι δείκτες δένονται πάνω σε παραγράφους και συγκεκριμένη θέση σε αυτή. Όμως και αυτοί διατηρούνται μέχρι να κλείσουμε τον διορθωτή. Γενικά ο διορθωτής θυμάται μόνο τη θέση του δρομέα (για κάθε τμήμα ή συνάρτηση που έχουμε στη μνήμη). Το F9 μας λέει πόσες λέξεις έχουμε γραμμένες (εξαιρεί αριθμούς και σύμβολα). To F10 μας εμφανίζει το σημάδι παραγράφου σε κάθε παράγραφο. Το F11 μας αλλάζει δυο πράγματα. (έχει τέσσερις καταστάσεις), το μέγεθος της γλώσσας στην επικεφαλίδα (για να μην αναδιπλώνει), και τον χρωματισμό. Από αυτή την αναθεώρηση όταν επιλέγουμε χρωματισμό τότε όχι μόνο "επιτρέπει" την εμφάνιση χρώματος αλλά και κάνει αυτόματο και άμεσο υπολογισμό. Ο μεταφραστής το χρώμα το βρίσκει όταν ανοίγει τον διορθωτή. Τα τμήματα/συναρτήσεις δεν σώνονται με χρώμα.

Ο διορθωτής είναι τύπου Unicode, δηλαδή παίρνει γράμματα από άλλες χώρες όπως ρώσικα, αλλά δεν έχει φτιαχτεί (αν και εμφανίζει τα γράμματα) για τις γλώσσες που γράφονται από δεξιά προς τα αριστερά. Ο κώδικας του διορθωτή είναι στο κώδικα της γλώσσας Μ2000. Μπορεί κανείς να ρίξει μια ματιά! Έχω γράψει το στοιχείο ελέγχου πάνω στο οποίο παίζει ο διορθωτής. Το στοιχείο ελέγχου είναι ένα listbox, το οποίο το έγραψα από το μηδέν, με δική του μπάρα ολίσθησης, με δυνατότητα διάφανου φόντου, με ολίσθηση με σπρώξιμο, και με δυνατότητα να αυξομειώνεται  ομαλά. Με την τεχνική του subclassing το κάνω διάφορα άλλα στοιχεία, όπως λίστα επιλογών, λίστα με αυτόματη συμπλήρωση, στοιχείο εντός/εκτός (checkbox), απλό κομβίον (button) με δυνατότητα ολίσθησης δεξιά για να πάρει την "εντολή". Όλα αυτά υπάρχουν στο κώδικα. Και χρησιμοποιούνται σε φόρμες όπως το παράθυρο επιλογής φακέλου, και άλλων (μόνο του εκτυπωτή δεν έφτιαξα, αφού ο καθένας έχει το δικό του),
Για να σώσουμε από τον διορθωτή αρκεί το Σώσε και ένα όνομα (αν το όνομα έχει αρχικό γράμμα νούμερο ή έχει διαστήματα βάζουμε εισαγωγικά). Με φόρτωσε και το όνομα, φορτώνουμε όλα τα τμήματα και τις συναρτήσεις (μπορούμε να φορτώνουμε και κατά την εκτέλεση ενός προγράμματος).
(Προσθήκες από τις αναθεωρήσεις 94-95, από το διορθωτή αντιγραφή στο πρόχειρο γίνεται σε Unicode και Html Form. Τα χρώματα του Html καθορίζονται από την επιλογή BRIGHT ή DARK στις ΡΥΘΜΙΣΕΙΣ)


Λίγα λόγια για τις αλλαγές από τις προηγούμενες αναθεωρήσεις και μέχρι και αυτήν, για την οθόνη. Η οθόνη και ο τρόπος εμφάνισης στοιχείων σε αυτήν μπορεί να είναι μια απλή ή όχι υπόθεση ανάλογα με το πόση λεπτομέρεια μας ενδιαφέρει να υπολογίσουμε στο κώδικά μας. Στις πρώτες εκδόσεις υπήρχαν δυο επίπεδα συν ένα του εκτυπωτή. Τα δυο επίπεδα ήταν το Περιθώριο και το βασικό. Μπορούσαμε να εκτελέσουμε εντολές που θα είχαμε έξοδο το Περιθώριο βάζοντας μια εντολή Περιθώριο Μέγεθος_Χαρακτήρων { }, ώστε όλες οι εντολές γραφικών και εμφάνισης χαρακτήρων να βγαίνουν εκεί. Το Περιθώριο ξεκίναγε με όλο το μέγεθος της οθόνης μας.Μπορούσαμε όμως να το αλλάξουμε, να το μετακινήσουμε και να το ελαχιστοιποιούμε στην γραμμή εφαρμογών.  Μέσα σε αυτό εμφανίζονταν η βασική "οθόνη", η οποία μπορούσε να είναι μεγαλύτερη από το περιθώριο αλλά θα ήταν ορατό μόνο όσο μας άφηνε το περιθώριο. Επίσης η η βασική οθόνη μπορούσε να κρυφτεί και επίσης το περιθώριο μπορούσε να αντιγράψει την επιφάνεια εργασίας. Στις πρώτες εκδόσεις το μέγεθος των δυο αυτών επιπέδων γίνονταν με βάση την οθόνη ή ένα ζεύγος συντεταγμένων και με το μέγεθος μιας συγκεκριμένης γραμματοσειράς. Μια παλιά εντολή που ακόμα λειτουργεί είναι η Αρχή "Tahoma", {φορτωσε "προγραμμα"} όπου  ξεκίναγε (ψυχρή εκκίνηση),  τον μεταρφαστή και καλούσε συγκεκριμένο πρόγραμμα (όπου μετά από μια σειρά ορισμών είχε εντολή για άμεση εκτέλεση ενός από τα τμήματα του).
Από την αρχική έκδοση, υπήρχαν δυο σημαντικά πράγματα, η επιλογή για διπλά-κανονικά και η επιλογή της χωριστής οθόνης (Split Screen), ώστε να ολισθαίνει το κάτω τμήμα ενώ το πάνω να έχει τίτλους και ότι άλλο θέλαμε για φαίνεται "σταθερά". Στο περιθώριο δεν υπήρχε επιλογή για ολίσθηση. Ουσιαστικά υπήρχαν άλλα τέσσερα επίπεδα, το επίπεδο όπου εμφανίζονται τα βίντεο, το επίπεδο που ανοίγουν σελίδες από το διαδίκτυο και ένα η λίστα επιλογών (drop down list) και το άλλο ο διορθωτής. Επίσης στην βασική οθόνη μπορούσαν να φτιαχτούν στόχοι όπου ένα κλικ με το ποντίκι έδινε μια ενέργεια.
Στην 5η έκδοση της γλώσσας μπήκαν επιπλέον εντολές όπως ΠΛΑΓΙΑ και ΦΑΡΔΙΑ για το κείμενο το οποίο γραφόταν σε σταθερές θέσεις. Μάλιστα ενώ μπορούσαμε να αλλάζουμε μεγέθη και τύπο γραμμάτων, οι θέσεις άλλαζαν λίγο αφού τα φαρδιά δεν είχαν ίδιο πλάτος με τα κανονικά. Όμως δεν φαίνονταν μεγάλη διαφορά τοποθέτησης γιατί οι εκτυπώσεις πάντα στοιχίζονταν στην "κάνναβο" της οθόνης. Οπότε ουσιαστικά εκείνος που έγραφε το πρόγραμμα αν χρειάζοταν έδινε λίγο χώρο. Για αναλογική γραφή υπήρχε μια εντολή για λεζάντες, όπου η στοίχιση γίνεται σε θέση γραφικών (άρα οπουδήποτε) και μπορούσε κανείς να περιστρέψει τη λεζάντα, διαλέγοντας γωνία.
Στην έκτη έκδοση προστέθηκαν 32 επίπεδα και επιπλέον μπήκαν και τα νήματα, ώστε να μπορεί κανείς να κάνει προγραμματισμό με ασύγχρονο τρόπο. Μπορούσε βέβαια κανείς να τα κάνει σαλάτα αν δυο νήματα έγραφαν στο ίδιο επίπεδο. Όμως σε ξεχωριστό επίπεδο δούλευε το πράγμα. Επιπλέον μπήκε και η αναλογική γραφή, ώστε η εντολή ΤΥΠΩΣΕ να τυπώνει κατ επιλογή αναλογική ή μη γραφή (και σε στήλες που ορίζουμε αν θα στοιχίζονται αριστερά, κέντρο, δεξιά ή με υπερχείλιση). Επιπλέον προστέθηκε η εντολή ΑΝΑΦΟΡΑ που τυπώνει κείμενο με παραγράφους και αναδίπλωση λέξεων. (μάλιστα μπορεί να μας αναφέρει πριν τυπώσει το πόσες γραμμές χρειάζεται για δοσμένο πλάτος, σε χαρακτήρες -σταθερούς ή με twips, και εδώ υποστηρίζεται η αριστερή-κέντρο-δεξιά και πλήρης στοίχιση)
 Στην έβδομη έκδοση (από την 6.5) έχουμε την Unicode επεξεργασία, έφυγαν οι φόρμες των Wiindows και μπήκε το ένα και μοναδικό στοιχείο ελέγχου "χρήστη" που κάνει τα πάντα (μαζί με τα επίπεδα που έχω αναφέρει παραπάνω). Το μενού επιλογών και ο διορθωτής στηρίζονται σε αυτό.  Όμως επειδή αυτό το στοιχείο υποστηρίζει το διάστιχο γραμμών, έγιναν αλλαγές και μπήκε και το διάστιχο στα επίπεδα. Οι εντολές ΤΥΠΩΣΕ, ΑΝΑΦΟΡΑ, ΕΙΣΑΓΩΓΗ που εμφανίζουν χαρακτήρες λογαριάζουν το διάστιχο (όπως και το μενού επιλογών και ο διορθωτής).
Με μια εντολή ΦΟΡΜΑ μπορούμε να ορίσουμε ότι μέγεθος κάνναβου χαρακτήρων θέλουμε βάσει πλάτους ή πλάτους και ύψους. Ειδικά για πλάτος και ύψος μπορούμε να πάρουμε οθόνη με ή χωρίς αυτόματο υπολογισμό διάστιχου (π.χ. Φόρμα 30,10;  με το ελληνικό ερωτηματικό στο τέλος, δίνει μια οθόνη 30 χαρακτήρων επί  10 γραμμών χαρακτήρων (ή 30 πλάτος και 10 ύψος). Χωρίς το ερωτηματικό θα δώσει μια ίδια οθόνη (επίπεδο) αλλά θα απλώσει σε όλο το χώρο της οθόνης του υπολογιστή, βάζοντας διάστιχο.
Στην όγδοη έκδοση μπήκαν επιπλέον τρεις ΤΥΠΩΣ, οι ΤΥΠΩΣΕ ΜΕΡΟΣ, ΤΥΠΩΣΕ ΥΠΟ και ΤΥΠΩΣΕ ΠΑΝΩ. Και οι τρεις τυπώνουν χωρίς να αλλάξει η γραμμή με τη διαφορά που η τύπωσε ΥΠΟ τραβάει μια γραμμή οριζόντια ενός εικονοστοιχείου, και αλλάζει γραμμή πριν εμφανίσει κάτι. Και στις τρεις αν βάλουμε κάτι που βγαίνει εκτός οθόνης δεν θα γυρίσει μέσα στην οθόνη (όπως στις απλές ΤΥΠΩΣΕ) αλλά απλά δεν θα εμφανιστεί. Επιπλέον ότι αλλαγές σε στήλες και τρόπο εκτύπωσης αλλάζει τοπικά. Θα αναφερθώ ειδικά για αυτές σε άλλη ανάρτηση. Σε αυτές λοιπόν τις τελευταίες αναθεωρήσεις άλλαξα σε βάθος όλες τις ρουτίνες υποστήριξης ώστε η κάθε θέση χαρακτήρα να χωράει εξ αρχής οποιοδήποτε από τα φαρδιά, πλάγια, φαρδιά και πλάγια και απλά. Το βασικότερο απ΄όλα ήταν ότι όχι μόνο μπορώ να έχω "ανεξάρτητες" μεταβλητές σε όλα τα βασικά μεγέθη, όπως το διάστιχο. αλλά ακόμα και "ιδιωτικά" για νήματα. Έτσι για παράδειγμα ένα νήμα μπορεί να περιμένει εισαγωγή αριθμού ενώ άλλο να σχεδιάζει ή να εμφανίζει βοήθεια παράλληλα!
Έχω παραδείγματα τα οποία θα φέρω σε άλλες αναρτήσεις.
Γενικά η γλώσσα έχει τελειώσει στο 99%. Σε λίγα θέματα δεν έχω καταλήξει σε μια ασφαλή λύση, ένα αφορά τους πίνακες δεδομένων για το λειτουργικό  (Win32 structures), οι οποίοι πρέπει να εμφανίζονται από την πλευρά της Μ2000 ως πίνακες για διάβασμα - γράψιμο (προς το παρόν μπορούμε να περνάμε αλφαριθμητικά και ακέραιους σε κλήσεις στο λειτουργικό). Το δεύτερο είναι το πώς θα βάλω callback ρουτίνες σε μια γλώσσα που είναι διερμηνευτής (interpreter), Τέλος δεν έχω ακόμα καμία ιδέα για ένα τύπο ΣΥΛΛΟΓΗΣ (collection) όπου η αναφορά στο στοιχείο να γίνεται με όνομα. Προς το παρόν για αυτό μπορούμε να χρησιμοποιούμε βάσεις δεδομένων (Η Μ2000 φτιάχνει βάσεις δεδoμένων της Access χωρίς να χρειάζεται την Access, αλλά μπορεί να συνδεθεί σε βάσεις μέσω ODBC).
Αυτά τα ολίγα...
Γ. Κ.



Σάββατο 24 Οκτωβρίου 2015

Αναθεώρηση 67

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

(έχει bug..και έχει βγει νέα 68).

Παρασκευή 16 Οκτωβρίου 2015

Αναθεώρηση 65. Έκδοση 8.

Σήμερα έγιναν μαζέματα..μερεμέτια δηλαδή. Πέρασε το περιβάλλον της γλώσσας από σειρά τεστ με παλιά προγράμματα από την έκδοση 5.6 (2003).



Κάπου στο τέλος του βίντεο τρέχω δυο προγράμματα που χρησιμοποιούν νήματα, μέσα από την Vb6 (δεν υπήρχαν στην παλιά έκδοση). Αν προσέξετε σε κάποια φάση η Vb6 κρασάρει. Πολλές φορές τα καταφέρνει να μην κρασάρει. Το περιβάλλον όμως της Μ2000, το πρόγραμμα m2000.exe δεν κρασσάρει (σε παλαιότερες εκδόσεις και σε σπασμένα 7 είχε παρατηρηθεί ότι ορισμένες φορές δεν τερματίζει, αλλά έχει καιρό να δείξει τέτοια συμπεριφορά...)
Αν κάποιος φίλος της Μ2000 την κατέβασε και την δοκιμάζει ας γράψει κάποιο σχόλιο εδώ.

Αναθεώρηση 64. Έκδοση 8.

Βελτιώσεις στην εμφάνιση μίξης γραμμάτων στην οθόνη κανονικών, πλάγιων ή και φαρδιών (bold) γραμμάτων. Πριν δούλευε καλά όσο τα bold έδιναν το ίδιο ύψος με τα κανονικά. Διαπίστωσα όμως ότι τα Ms Comic Sans δεν έδιναν το ίδιο με συνέπεια το πρόγραμμα με την ιταλική προφορά (έχει δημοσιευθεί εδώ), να κάνει μη αποδεκτό αποτέλεσμα.

Σχετικά με την διαχείριση της οθόνης
Προστέθηκε μια παραλλαγή στην εντολή Επίπεδο,  η Επίπεδο { } χωρίς αριθμό επιπέδου, μεταξύ του ονόματος και του μπλοκ εντολών. στέλνει την εκτύπωση στο βασικό επίπεδο. Τα επίπεδα όπου μπορούμε να γράψουμε και να σχεδιάσουμε είναι 35. Το περιθώριο, το βασικό επίπεδο, 32 επίπεδα πάνω από το βασικό και ένα η σελίδα του εκτυπωτή. Όλα τα επίπεδα εκτός του εκτυπωτή έχουν λειτουργία χωριστής οθόνης, όπου το κάτω μέρος έχει ολίσθηση, αυτόματη προς τα πάνω (νέες γραμμές έρχονται κάτω και χάνονται οι πρώτες), αλλά με εντολή ξεχωριστά μπορούμε κατά βούληση να την ολισθαίνει πάνω ή κάτω, κατά μια γραμμή χαρακτήρων. Μπορούμε να κάνουμε όλο το επίπεδο να ολισθαίνει αλλά δεν μπορούμε να αφαιρέσουμε αυτό το μέρος. Για μια απλή κατανόηση...δοκιμάστε το 

>Οθόνη ,-10  (το γράφουμε έτσι και πατάμε enter)
το κόμμα δηλώνει εδώ ότι η πρώτη παράμετρος παραλείπεται. Η πρώτη παράμετρος είναι το χρώμα. Αν το παραλείψουμε θα χρησιμοποιήσει το καθορισμένο από την τελευταία φορά. Το -10 δηλώνει δέκα γραμμές από το κάτω μέρος, θα είναι το μέρος ολίσθησης (πάντα κάτω είναι το μέρος ολίσθησης). 

>Οθόνη 15, 0
 Τώρα όλη η οθόνη γίνεται άσπρη και όλη είναι οθόνη που ολισθαίνει, δηλαδή είναι ένα τμήμα. 

Ο σκοπός να έχουμε οθόνη με ολίσθηση είναι για να έχουμε ένα σταθερό πάνω μέρος και ένα μεταβλητό κάτω μέρος.

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


Περί Επιπέδων
Το βασικό επίπεδο και τα 32 πρόσθετα μπορούν να αλλάζουν θέσεις μέγεθος, χρώματα, και το καθένα έχει τους δικούς του δρομείς γραφικών και χαρακτήρων.  Επίσης διαθέτουν λειτουργία εμφάνισης και απόκρυψης. Τα 32 επίπεδα μπορούν να χρησιμοποιηθούν με εικόνες και με διάφανα σημεία, και υπάρχει τρόπος να ξέρουμε αν κάποια επικαλύπτονται. Το περιθώριο είναι αυτό που αρχικά πιάνει όλη την οθόνη, είναι η βασική φόρμα της εφαρμογής. Μπορούμε, να του αλλάξουμε μέγεθος, να το ελαχιστοποιήσουμε, να δώσουμε τίτλο εφαρμογής που θα φανεί στην γραμμή εργασιών, και μπορούμε να το μετακινήσουμε. Μέσα σε αυτό είναι τα άλλα 33 επίπεδα (το επίπεδο του εκτυπωτή δεν είναι ορατό). Ένα πρόσθετο στοιχείο που έχουν τα 34 επίπεδα (όχι του εκτυπωτή), είναι ότι μπορούμε να ορίσουμε στόχους και τμήματα που θα εκτελούνται με το πάτημα του ποντικιού. Με αυτό το τρόπο μπορούμε να φτιάξουμε ένα στόχο όπου θα μετακινούμε ένα επίπεδο.

Τα νήματα και πώς δεν μπερδεύονται...οι εξαγωγές.
Η Μ2000 έχει νήματα επεξεργασίας, ως τμήματα κώδικα που μεταγράφονται σε ειδικά αντικείμενα τύπου "διαδικασία" και τα οποία μας δίδουν προγραμματιστικά ένα νούμερο, τον χειριστή του, και μπορούμε να κάνουμε τέσσερα πράγματα: Να καθορίσουμε ένα χρονικό διάστημα εκκίνησης, να δώσουμε εντολή να σταματήσει (στο τέλος του). να δώσουμε εντολή να ξαναξεκινήσει, να δώσουμε εντολή για άμεση διαγραφή. Τα νήματα είναι μέρος του τμήματος ή της συνάρτησης που τα δημιουργεί, και χάνονται αν χαθεί το "πατρικό". Ουσιαστικά μπορεί ένα νήμα να εκτελεστεί τελευταία φορά αφού τερματίσει το τμήμα και αυτό σημαίνει ότι αναφορές σε μεταβλητές δίνουν λάθος. Όμως έχουμε δυο δυνατόιτητες, να χρησιμοποιήσουμε ένα νήμα ειδικό που λέγεται Κύριο.Έργο (υπάρχει τελεία ανάμεσα στα ονόματα), και το οποίο είναι ένα νήμα με μια ιδιότητα, να τερματίζει όλα τα νήματα του τμήματος, εκτός από εκείνα των ειδικών τύπων, τα νήματα για μουσική και για σωληνώσεις. Κάθε νήμα έχει δικό του σωρό αλλά οι μεταβλητές ανήκουν στο τμήμα που δημιουργήθηκε. Το ζήτημα είναι ότι αν φτιάξουμε νέες μεταβλητές (και όχι προσωρινές) μέσα σε ένα νήμα τότε αν κάποιο νήμα έχει καλέσει ένα τμήμα πριν από την δημιουργία των μεταβλητών μας, με το που θα τερματίσει το νήμα θα καθαρίσει και τις μεταβλητές του νήματος. Αυτό συμβαίνει γιατί στην Μ2000 ότι δημιουργείται  και έχει όνομα θα πεθάνει μόλις πεθάνει ο δημιουργός του, με συνέπεια το τελευταίο να χάνεται πρώτο. Εξαίρεση δεν υπάρχει. Αυτό που υπάρχει είναι να αντιλαμβανόμαστε τα αντικείμενα που μεταφέρονται προς τα πίσω, ως αποτέλεσμα να μετακινούν κάτι που δημιουργήθηκε από εκείνο που με την παράδοση ..τερμάτισε. Ουσιασιτκά τα αντικείμενα που επιστρέφονται (ή ρευστά αντικείμενα) δεν έχουν όνομα, μέχρι να απδώσει το σύστημα ένα προσωρινό ή να αντιγράψουμε ένα αντικείμενο σε μια ομάδα (η οποία έχει όνομα). Αφήνω αυτήν την παρένθεση, θα δούμε άλλη φορά το θέμα των αντικειμένων. Το πρόβλημα που θα θίξω εδώ έχει να κάνει με την ασύγχρονη λειτουργία των νημάτων. Μπορούμε με μια εντολή π.χ. Εισαγωγή Α$ να περιμένουμε να εισαχθεί μια τιμή στην A$ και παράλληλα να τρέχουν νήματα, τα οποία να γράφουν σε άλλο μέρος της οθόνης ή σε άλλο επίπεδο. Η εισαγωγή γίνεται με δικό της δρομέα (cursor) ο οποίος ξεκινάει με τον κανονικό, και καταλήγει στον κανονικό. Στο ενδιάμεσο αν ένα νήμα θέλει να εμφανίσει κάτι παραπάνω..μπορεί να το κάνει. Αν όμως έχουμε δυο τρια νήματα, τότε μπορούμε να εκμεταλευθούμε την ολίσθηση της οθόνης (το κάτω μέρος του παραθύρου) και διαδιοχικά να τυπώνουν όλα τα νήματα. Υπάρχει πρόβλεψει για μπλοκ εντολών που μπορούν να εκτελεστούν μόνο όταν η κατάσταση μιας μεταβλητής το επιτρέπει. Πολλά μπλοκ με την ίδια μεταβλητή, σε διαφορετικά νήματα, εξασφαλίζουν ότι ένα από αυτά μπορεί να τρέξει ανά πάσα στιγμή (τα άλλα κάνουn προσπέραση, ή αλλιώς αφήνουν το μπλοκ για την επόμενη φορά- skip.

Έτσι ένας τρόπος να μην μπερδεύονται τα νήματα είναι  να απομονώνουμε με τα ειδικά μπλοκ
Μέρος {  } ως άλφα  όπου άλφα είναι η μεταλητή ελέγχου, η οποία αλλάζει τιμή όταν ένα μπλοκ τρέχει. Μπορούμε να την ορίσουμε τοπική ή γενική (σε περίπτωση που έχουμε νήματα σε μια γραμμή εκτέλεσης, π,χ, το Α έχει νήματα το 20010 και το 20014 και καλεί το Β με νήματα το 20017 και 20018, θα τρέχουν και τα τέσσερα νήματα, ενώ το Α θα περιμένει να τερματίσει το Β.

'Ενας άλλος τρόπος είναι να χρησιμοποιήσουμε τις δομές:
Περιθώριο {}. Επίπεδο {}, Επίπεδο ένα_Νούμερο {}, Εκτυπωτής { }.
Το πρώτο είναι η φόρμα της γλώσσας(το παράθυρο κατά την έννοια του λειτουργικού), το δεύτερο είναι η βασική οθόνη, το τρίτο έχει 32 επίπεδα πάνω από την οθόνη (και έχουμε δυνατότητα να τα αλλάζουμε, να φέρνουμε μπροστά αυτό που θέλουμε), και τέλος ο Εκτυπωτής. Έτσι μέσα από ένα νήμα αν θέλουμε να γράψουμε πρώτα στην βασική οθόνη και μετά στο επίπεδο ένα θα δώσουμε δυο ξεχωριστές εντολές όπου μέσα σε αυτές (στο μπλοκ { }) θα βάλουμε τις εντολές που θέλουμε, π.χ. Τύπωσε ή Χάραξε ή άλλες που φτιάχνουν γραφικά ή βάζουν εικόνες.
Τα νήματα μπορούν να χρησιμοποιηθούν με τμηματική σύγχρονη εκτέλεση ή με διαδοχική. Για την πρώτη, όσες εντολές είχε σε μπλοκ εκτελούνται μαζί και μετά το σύστημα αλλάζει νήμα. Έτσι όταν τυπώνουμε με τις παραπάνω εντολές ξέρουμε ότι σε όλη τη διάρκεια δεν θα τυπώσει τίποτα άλλο.
Θα ανεβάσω ένα παράδειγμα (το έχω έτοιμο, αλλά το είχα γράψει με αγγλικές εντολές...και τώρα θα το αλλάξω) όπου βάζουμε στόχους σε περιθώριο, βασική οθόνη, και στο επίπεδο ένα, σε καθένα με άλλη γραμματοσειρά, και βάζουμε μερικά νήματα, ένα να γράφει την ώρα στο περιθώριο ανά δευτερόλεπτο, ένα άλλο να μετακινεί το επίπεδο ανά 3 δευτερόλεπτα και να γράφει και δυο αράδες, ένα άλλο να αλλάζει το περιεχόμενο ενός στόχου (την επιγραφή του) (στο επίπεδο 1) και όλα αυτά ενώ οι στόχοι είναι ενεργοί, και με κλικ εκτελούν μια και μόνο εντολή ένα κλικ (εκτός από ένα που κάνει και τερματισμό). Επιπλέον μπορούμε να τερματίσουμε με πάτημα πλήκτρου.
Ένα δεύτερο παράδειγμα, που έχω και αυτό στα αγγλικά, θα το γυρίσω στα ελληνικά, είναι αυτό που δείχνει πως κάνει κανείς το παράθυρο του περιβάλλοντος της Μ2000 σαν παράθυρο των windows με στόχο που μετακινεί τη φόρμα, με άλλον ένα που κάνει ελαχιστοποίηση και ένα ακόμα που αντί να κλείνει βγάζει το πρόγραμμα στην γραμμή εντολών με έτοιμη εντολή (πατάμε enter). Ενώ λοιπόν λειτουργούν οι στόχοι, εμφανίζεται ένας αριθμός να αυξάνει, εμφανίζονται μηνύματα όταν μετακινούμε το παράθυρο, στην αρχή και στο τέλος, και παράλληλα στο κάτω μέρος το πρόγραμμα περιμένει εισαγωγή. Δείχνω πέντε τρόπους εισαγωγής, οι δυο τελευταίοι με κείμενο πολλαπλών γραμμών, και οι τρεις τελευταίοι με δυνατότητα σύρε και άφησε (drag and drop), το οποίο δουλεύει  χωρίς να σταματάει το βασικό νήμα.

Τρίτη 13 Οκτωβρίου 2015

Μετατροπή σε Δυαδικό

1. Νέα αναθεωρηση 62. Έβαλα καλύτερο τρόπο υπολογισμού στυλ χρωματισμού ανάλογα με το τι είναι το φόντο (διαλέγει το σύστημα αυτόματα τη σκούρα ή την ανοιχτόχρωμη σειρά χρωμάτων).

2. Η εξαγωγή σε html βγήκε από ένα παλαιότερο πρόγραμμα (το ενημέρωσα για τις πρόσθετες λέξεις της Μ2000). Θα το προσαρμόσω μέσα στην Μ2000 σε επόμενη αναθεώρηση. Το βίντεο τραβήχτηκε από το Virtual Box (γύρισα την ανάλυση σε 1024x768).

Μπορείτε να αντιγράψετε το κώδικα σε ένα τμήμα έστω άλφα

          \\ μπορούμε να βάλουμε μια Διάβασε β αντί να δώσουμε τιμή
          \\ και έτσι αν το τμήμα λέγεται α τότε με α 12 καλούμε το τμήμα με παράμετρο 12
          \\ με tab και alt tab μπορούμε να μετακινήσουμε πολλές γραμμές μαζί
          \\ μπορούμε να μετακινούμε τις γραμμές σπρόχνωντάς τες με το ποντίκι!
        
        
          β = 12
          Συνάρτηση δυαδ$ {
                Διάβασε μια_τιμή
                δεκαεξαδική$ = Δεκαεξ$( μια_τιμή, 4 )
                Πίνακας μια_τιμή$( 16 )
                μια_τιμή$( 0 ) = "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
                Εγγραφο Αα$
                Για ι = 1 Εως Μήκος( δεκαεξαδική$ )
                      Αα$ = μια_τιμή$( Εκφρ( "0x" + Μες$( δεκαεξαδική$, ι, 1 ) ) )
                Επόμενο ι
                = Αα$
          }
          Φόρμα 70 \\ χαρακτήρες πλάτος
          Τύπωσε "Δυαδικό από το " ; β ; " σε 32bits"
          Τύπωσε δυαδ$( β )
          Τύπωσε δυαδ$( Δυαδικό.Αντίστροφο( β ) ), "Συμπλήρωμα ως προς 1 του " ; β
          Τύπωσε δυαδ$( Δυαδικό.Αντίστροφο( β ) + 1 ), "Συμπλήρωμα ως προς 2 του " ; β
          Τύπωσε δυαδ$( 0x1000 )
          Τύπωσε δυαδ$( 0xFFFF1000 )
          Τύπωσε δυαδ$( #FFAA22 ) \\ αυτό είναι το 0x22AAFF - έχουμε μια τιμή RGB και το R (RED)
                                                                      \\ είναι το FF το οποίο είναι το τρίτο byte και όχι το πρώτο.
          Τύπωσε δυαδ$( 0xFFAA22 ) 
        
          \\ Μπορούμε να τυπώσουμε στο δεκαεξαδικό όπως στην Τύπωσε τυπώνουμε στο δεκαδικό.
          \\ αρνητικές τιμές ή εκτός ορίων τυπώνονται με ???-
          Δεκαέξ "ο αριθμός Χ=" ; 256, "το άθροισμα =" ; 0x0100 + 0xF0, 2567, "Εδώ είναι το λάθος" ; - 1

  
 
σε καλή ανάλυση