Τετάρτη 16 Μαρτίου 2016

Αναθεώρηση 191

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

Κάποιοι βλέπουν την γλώσσα "Αρχαία", αλλά αυτό δεν είναι το ζήτημα. Το ζήτημα είναι αν κάνει κανείς την δουλειά του. Η Μ2000 θα μπορούσε να γραφτεί με άλλη γλώσσα. Όμως το περιβάλλον της συνδέεται με τα Windows, χρησιμοποιεί εξωτερικές βιβλιοθήκες που υπάρχουν από τα XP μέχρι και τα 10.

Επίσης κάποιοι φίλοι ρώτησαν γιατί δεν χρησιμοποιώ τα παράθυρα των Windows. Η απάντηση είναι απλή, δεν μου έκαναν για τη δουλειά που τα θέλω. Θέλω τα παράθυρα να έχουν την ίδια εμφάνιση παντού. Και πράγματι, από τα XP μέχρι και τα 10, η Μ2000 βγάζει ακριβώς τα ίδια παράθυρα! Δεν είναι μόνο αυτό το χαρακτηριστικό. Αλλά είναι βασικό.

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

Modal Παράθυρο είναι αυτό που όταν ανοίγει κάνει τα άλλα ανενεργά (της εφαρμογής). Εδώ όμως στη Μ2000, δεν ήθελα να ήταν ανενεργά και ως προς τα νήματα που τρέχουν πίσω, και να εμφανίζουν δράση στα παράθυρα! Δηλαδή μπορούμε να ανοίξουμε με τη μέθοδο "Show" ένα παράθυρο και να δώσουμε μια μη μηδενική τιμή ως παράμετρο. Τότε ανοίγει η φόρμα ως Modal. Δείτε όμως τι γίνεται ακόμα. Μπορεί αυτή η φόρμα να ανοίξει επιπλέον φόρμες, Modal ή όχι, και μπορεί να ανοίξει και το Msgbox που έγινε και αυτό τύπου Modal (δεν ήταν πριν αφού δεν υπήρχαν άλλα παράθυρα εκτός από το βασικό, την "κονσόλα" ή Οθόνη).
Κάθε φορά που ένα νέο Modal ανοίγει ξέρει ποια παράθυρα έχει μπλοκάρει, χωρίς να κρατήσει αναφορές σε αυτά (υπάρχει δυνατότητα να ξεφορτώσουμε -unload- παράθυρα, χωρίς να έχουμε θέμα με μια αναφορά που θα τα κρατάει "ζωντανά"). Αυτή ήταν η εκπληκτική δουλειά. Δουλεύει με τυχαίους αριθμούς. Κάθε φορά που εμφανίζεται ένα Modal παράθυρο (ο τρόπος που το ανοίγουμε το κάνει αυτό), μπλοκάρουν τα άλλα, και παίρνουν έναν αριθμό που τυχαία έχει επιλεγεί και γνωρίζει μόνο η ρουτίνα που χειρίζεται το Modal παράθυρο (και η οποία μπορεί να κληθεί και δεύτερη και τρίτη φορά και περισσότερες από άλλο νήμα,  άρα να έχουμε διαδοχικά πολλά ανοικτά modal παράθυρα.)..
Κανονικά αν ανοίξουμε εκτός νήματος ένα modal παράθυρο...σταματάει η ροή και επιστρέφει όταν κλείσουμε το παράθυρο. Όπως κάνει και το Msgbox.  (Ask() ή Ρωτα())
Για να έχουμε λειτουργία νημάτων, πρέπει να το ανοίξουμε τη φόρμα σε νήμα. Ένας εύκολος τρόπος είναι με την εντολή After 50 {}  (ή Μετά 50 { }),όπου μετά από 50 χιλιοστά του δευτερολέπτου, θα παίξει μια φορά...αλλά με μεγάλη διάρκεια, μέχρι να κλείσουμε το παράθυρο). Όλα τα νήματα θα τρέξουν μέσα στο βρόχο (loop) που περιμένει το Modal να τερματίσει. Βασικός βρόχος είναι το Main.Task ή Κύριο.Έργο που τερματίζει όταν δεν υπάρχουν άλλα νήματα (δεν λογαριάζει τα  νήματα για το Midi Synthesizer), ή τερματίζει αν κάνουμε exit, έξοδο. Ασφαλώς το πλήκτρο ESC κάνει την δουλειά της απόδρασης, κλείνει νήματα και παράθυρα...και μας βάζει στην γραμμή εντολών της Μ2000, ενώ έχει καθαρίσει μεταβλητές και αντικείμενα (μόνο στατικές μεταβλητές δεν καθαρίζει, αυτές καθαρίζουν με Clear ή Καθαρό και με New ή Νέο, που σβήνει και το πρόγραμμα)

Στο παράδειγμα με τα Ν παράθυρα "Τρία Μικρά Νήματα για Τρία Παράθυρα σε Μ2000 " ΄βλέπουμε ότι το msgbox δεν φεύγει από μπροστά, και τα παράθυρα πίσω δεν καταλαβαίνουν...όταν πάμε να τα επιλέξουμε, ενώ συνεχίζεται η "ζωγραφική" σε αυτά και η αναφορά της ώρας ανά δευτερόλεπτο στη κοσνόλα πίσω!
Στο ίδιο παράδειγμα βλέπουμε και κάτι άλλο ακόμα. Υπάρχει ένα Button  στο παράθυρο Form1(2) που γράφει TestMe και ανοίγει τον έλεγχο (μπορούμε να ελέγχουμε μεταβλητές, κώδικα και άλλα)
Πάμε λοιπόν μετά να κλείσουμε το παράθυρο και το γεγονός Unload μας εμφανίζει το Msgbox για να ρωτήσει τι θα κάνουμε. Σε αυτή τη φάση τα παράθυρα Form1(X), όλα τα Χ, π.χ. 0,1,2 θα σταματήσουν να δέχονται κλικ, και να επιλέγονται, αλλά όχι ο Έλεχγος, ο οποίος μπορεί να επιλεχτεί!

Για το EditBox θα γίνει χωριστή ανάρτηση. Εδώ θα δούμε μια απλή προσθήκη, buttons με στρογγυλεμένες γωνίες! Επιπλέον φτιάχτηκε και η εντολή Φόρμα να δουλεύει με τα παράθυρα, ώστε να καθορίζει την "κονσόλα" του παραθύρου. Π.χ. Φόρμα 20,10 θα κάνει το παράθυρο να γράφει (και κάτω από τον τίτλο, οπότε με χωριστή οθόνη το αποφεύγουμε - π.χ. Οθόνη 1,2 βάζει μπλέ χρώμα και ξεκινάει τη χωριστή οθόνη από την 3η γραμμή - οι γραμμές χαρακτήρων ξεκινούν από το μηδέν).

Κάθε φορά που θέλουμε να ασχοληθούμε με το παράθυρο ως Οθόνη πρέπει να ανοίξουμε ένα μπλοκ Επίπεδο. Εξ ορισμού το επίπεδο χωρίς όνομα είναι αυτό της κονσόλας. Οι εντολές που δεν φαίνονται σε κάποιο επίπεδο, είναι στο βασικό, ή μπορεί να έχει οριστεί κάτι άλλο ποιο πριν. Δηλαδή αν καλέσουμε ένα τμήμα που φτιάχνει ένα σχήμα με κύκλους, καμπύλες, πολύγωνα, τότε το τμήμα αυτό θα γνωρίζει ότι αντικείμενο εξόδου είναι το επίπεδο που είχε αυτός που το κάλεσε.. Τα μπλοκ με τα επίπεδα μπορούν να είναι φωλιασμένα. Τα νήματα έχουν πάντα το επίπεδο τη στιγμή της δημιουργίας τους. Στα Παράθυρα δεν λειτουργούν τα επίπεδα για είσοδο στοιχείων. Χρησιμοποιούμε τα στοιχεία ελέγχου Button, CheckBox, EditBox, TextBox και TextBox ως Spinner (για αριθμητικές τιμές)! Το Editbox όταν θα τελειώσει η εργασία που κάνω, θα έχει δυο διαμορφώσεις, εισαγωγή ακέραιου και εισαγωγή πραγματικού. To TextBox διαφέρει από το EditBox (ενώ και τα δυο χειρίζονται τον ίδιο τύπο αντικειμένου, το glist (Glis4.cls) με κώδικα 4,7 χιλιάδων γραμμών). Το EditBox έχει μεγάλο κώδικα, ενώ το TextBox μικρό. Το πρώτο δουλεύει με έγγραφο κειμένου ενώ το δεύτερο με μια λίστα ενός στοιχείου με δυνατότητα διόρθωσης, όπως την δίνει το glist.

Στο παράδειγμα εμφανίζουμε ένα παράθυρο με επιλογή ενός αρχικού μεγέθους 10000 επί 6000 twips. Αυτό το μέγεθος κόβεται για να χωράνε επακριβώς 8άρια γράμματα (στη προεπιλεγμένη γραμματοσειρά, ή δίνουμε μια εντολή Font "Arial" πριν την Window, θα είναι Unicode, τα παράθυρα και η οθόνη της Μ2000 γράφουν οποιονδήποτε χαρακτήρα Unicode, αρκεί να υπάρχει στη γραμματοσειρά που διαλέγουμε  αλλιώς θα πάρουμε τετραγωνάκι). Μετά καθαρίζουμε την οθόνη του παραθύρου με βασικό χρώμα μπλέ (1) και ορίζουμε γραμμή διαχωρισμού τη πρώτη (0). Δεν χρειάζεται το τελευταίο γιατί η επόμενη εντολή, Φόρμα ή Form 30,20 θα ορίσει γραμμή διαχωρισμού (από την οποία και κάτω θα έχουμε ολίσθηση, text scrolling) την πρώτη. Αλλά επίσης θα αλλάξει το μέγεθος των γραμμάτων για να βγουν 30 χαρακτήρες σε 20 γραμμές. Αυτό μας βοηθάει για να στοιχίσουμε στοιχεία ελέγχου, δηλαδή λειτουργεί ως πλέγμα 30 Χ 20 όπου με το χειρισμό που κάνουμε στο Form1.MouseDown δίνουμε πάντα θέση στο Button1 ακριβώς σε πάνω αριστερή γωνία χαρακτήρα. Οι Move! και Cursor! μπήκαν από αυτήν την αναθεώρηση. Η πρώτη κάνει τον δρομέα γραφικών εκεί που δείχνει ο δρομέας χαρακτήρων, και η δεύτερη κάνει το ανάποδο.Η πρώτη δουλεύει με πολλαπλασιασμό και η δεύτερη με ακέραια διαίρεση. Δείτε λοιπόν τι κάνουμε. Βάζουμε την θέση Χ,Υ (εντολή Move ή Θέση), μετά βάζουμε την Cursor! η οποία βρίσκει τη θέση σε χαρακτήρες και τοποθετεί το δρομέα χαρακτήρων εκεί. Μετά βάζουμε την Move! η οποία βρίσκει τη θέση της πάνω αριστερής γνωνίας του χαρακτήρα στη θέση του δρομέα, και την καταχωρεί ως θέση γραφικών!

Declare Form1 Form
Declare Button1 Button Form Form1
Bx=4
Layer Form1 {
      Linespace 0
      Window 8, 10000, 6000
      Cls 1,0
      Form 30, 20
      Print @(0,4),"123456789012345678901234567890"
      Cursor Bx, 5
      Move !
      Button1_Xpos=Pos.x
      Button1_Ypos=Pos.y
      Xt=Button1_Xpos div Bx
      Yt=Button1_Ypos div 5
}
Method Button1,"Move", Button1_Xpos, Button1_Ypos, Xt*5, Yt*2
Method Button1,"Curve",1 \\ 2 - 3 (single float)
Method Form1, "Show"
Function Form1.Unload {
      Keyboard "!"
}
Function Button1.Click {
      \\ print to console
      Print "Hello"
}
Function Form1.MouseDown {
      Drop 2 ' no need now (keycode and shift)
      Read New X, Y
      Layer Form1 {
            Move X, Y
            Cursor ! \\ transform to char coordinates
            Move ! \\ transform to graphic, at the up left corner of a char
            Method Button1,"Move", Pos.x, Pos.y
      }
}
A$=key$
Declare Button1 Nothing
Declare Form1 Nothing






Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.