Τετάρτη 17 Ιουνίου 2020

Αναθεώρηση 29, Έκδοση 9.9

Σε αυτή την αναθεώρηση έγιναν τα ακόλουθα:
1) Αναβάθμιση στους διορθωτές κειμένου, στον εσωτερικό της κονσόλας και στο στοιχείο ελέγχου Κείμενο (EditBox). 
2) Στόχοι στις φόρμες χρήστη.

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

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

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

Οι στόχοι στις φόρμες διαφέρουν από τα Πλήκτρα (Button), Ενώ στα πλήκτρα έχουμε εστίαση, και μπορούμε να την μετακινήσουμε, οι στόχοι δεν έχουν εστίαση, είναι σχεδιασμένοι πάνω στο επίπεδο, και μπορούμε να γράψουμε ότι θέλουμε πάνω τους, είναι "ισοπεδωμένοι". Τα πλήκτρα έχουν μεθόδους να μετακινηθούν, να γίνουν διάφανα, να έχουμε καμπύλες, και έχουν και ένα χρονιστή αν θέλουμε να δίνουμε με μια συχνότητα αλλαγές στο πλήκτρο ή σε άλλο σημείο του προγράμματος (δουλεύει σαν timer).

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


Στο παράδειγμα παρακάτω φτιάχνουμε δυο στόχους. Ο ένας εκτελεί οδηγία και ο άλλος προκαλεί γεγονός. Ο δεύτερος κάθε φορά αλλάζει κατάσταση στον πρώτο, τον ενεργοποιεί και τον απενεργοποιεί διαδοχικά. Παράλληλα διαβάζουμε και τα κλικ πάνω στο επίπεδο της φόρμας. Όταν ο πρώτος στόχος είναι ανενεργός (αλλάζουμε και το χρώμα του), είναι σαν να μην υπάρχει, και ;otan η φόρμα δέχεται στο χώρο κλικ παράγει γεγονότα form1.MouseUp, form1.MouseDown, form1.MouseMove. Εδώ πιάνουμε το form1.MouseDown.

Παρατηρήστε ό,τi το τμήμα ZZ ενώ τρέχει με θέαση του τμήματος που βρίσκεται (λόγω της οδηγίας του στόχου), το αντικείμενο εξόδου είναι το επίπεδο της φόρμας. Στα γεγονότα, στις συναρτήσεις εξυπηρέτησης, το αντικείμενο είναι η κονσόλα (ακόμα και αν δε φαίνεται). Οπότε αν θέλουμε να γράψουμε σε άλλα επίπεδα βάζουμε τις εντολές που θέλουμε στην Επίπεδο Αντικείμενο { }. Για την κονσόλα βάζουμε Επίπεδο { }. Δείτε επίσης ότι βάζουμε και το Ανανέωση (Refresh) γιατί θέλουμε να ανανεωθεί η κονσόλα άμεσα (ενώ δεν έχει την εστίαση).

Εστίαση λέμε ότι έχει ένα στοιχείο αν κουμπώνει στο πληκτρολόγιο. Ο τίτλος της φόρμας είναι ένα στοιχείο πάνω στη φόρμα, το οποίο δέχεται την εστίαση για τη φόρμα. Στο αρχείο Info, υπάρχει το Form44, που δείχνει πώς γίνεται δυναμικά να αφαιρέσουμε το τίτλο! Πάλι η φόρμα μπορεί να επιλεχθεί, και κάποιο στοιχείο της να πάρει την εστίαση, αλλά όχι αυτή. Όποτε βάλουμε το τίτλο (αλλάζει με δεξί κλικ στη φόρμα, στο Form44 παράδειγμα), ο τίτλος μπορεί να επιλεχθεί με TAB και SHIFT TAB, με κάτω βελάκι ανοίγουμε το σχετικό μενού επιλογών (στο παράδειγμα δεν είναι ενεργό), με ALT+F4 κλείνουμε τη φόρμα (στέλνει γεγονός και μπορούμε να ακυρώσουμε το κλείσιμο).  Οι φόρμες έχουν γεγονός για να διαβάζουν το πληκτρολόγιο ανάμεσα από τα άλλα στοιχεία. Αυτό σημαίνει ότι για τη φόρμα μπορούμε να ορίσουμε συνδυασμούς πλήκτρων. Αυτοί θα λειτουργούν, παρόλο που εστίαση θα έχει ένα άλλο στοιχείο πάνω στη φόρμα. Έτσι βάζουμε συντομεύσεις πλήκτρων και ενώ φαίνονται να είναι σε αναδιπλούμενο μενού επιλογών είναι στη βάση, στη φόρμα, ο μηχανισμός ανάγνωσης.

Για στόχους στη κονσόλα δείτε το Wind4 πρόγραμμα (υπήρχε και σε παλιότερα Info αρχεία).


Παράδειγμα στόχων σε φόρμα χρήστη
Πρόγραμμα FORMTARGET στο INFO (υπάρχει στο Setup της γλώσσας)

\\ FROM 9.9 REVISION 29
\\ WE CAN PLACE TARGETS ON FORMS
\\ TARGETS ARE LIGHTWEIGHT OBJECTS
\\ WE MAKE IT ONCE


\\ STATEMENTS:
\\ TARGET  (2 VARIATIONS, ONE TO DEFINE AND ONE TO ENABLE/DISABLE)
\\ CHANGE  WE HAVE NAMED ARGUMENTS HERE
\\ TARGETS NEW  (WE CAN ERASE PER FORM)
\\ THEY DON'T NEED A SCAN STATEMENT (USED FOR CONSOLE ONLY)
\\ OLD VERSIONS OF M2000 AND THE LAST ONE CAN USE THE BASIC TARGETS


\\ FORM TARGETS VS BASIC TARGETS
\\ BASIC TARGETS CAN BE USED TO EXECUTE A LINE OF STATEMENST AT GLOBAL SCOPE
\\ FORM TARGETS EXECUTE CODE AT THE SAME SCOPE WHERE FORM DEFINED


\\ EACH TARGET HAS TWO FUNCTIONALITIES:
\\ BASIC TARGET:  SEND KEYS TO CONSOLE/EXECUTE CODE TO GLOBAL SCOPE
\\ FORM TARGET:  SEND EVENT TARGET/ EXECUTE CODE TO MODULE SCOPE
\\ EVENT TARGET IS COMMON FOR ALL TARGETS, SENDING THE HANDLER OF TARGET


\\ ONE PARAMETER BEFORE THE LASTING TEXT:
\\ CAN BE 1 TO 9 FOR POSITION OF TEXT, +10 TO USE "SEND" FUNCTION
\\ +100 TO USE PROPORTIONAL TEXT RENDERING.
\\ A 5 IS CENTER VERTICAL END HORIZONTAL.


\\ BASIC TARGETS CAN BE USED IN 34 LAYERS: BACKGROUND, CONSOLE, PLAYERS (32 MAX).
\\ TO SCAN FOR THEM WE USE SCAN STATEMENT USING A NUMBER FOR A TIME WINDOW.


\\ TARGETS VS BUTTONS ON FORMS
\\ A BUTTON IS A CONTROL, WITH METHODS AND PROPERTIES.
\\ TAB AND SHIFT TAB CAN CHOOSE ANY ENABLED BUTTON TO GET FOCUS
\\ TARGETS HAVE NO FOCUS. USED ONLY WITH MOUSE
\\ EACH TARGET IS AN ARRAY OF DATA TO BE USED FOR RENDERING AND SCANNING
\\ SCANNING HAPPEN AT THE MOUSE DOWN EVENT. SO TARGETS GET A CLICK ONLY
\\ BUTTONS GET DOUBLE CLICK, OR SHIFT CAPTION LEFT, OR ENTER, BUT NOT A SIMPLE CLICK


Declare form1 Form
m=false
Module zz {
    \\ target call zz to own object
    \\ so we have to use Layer {} to send to console
    Layer {
        print "ok", timecount
        refresh
        }
    change A, text "ok"
}
Function form1.MouseDown {
    Stack
    refresh
}
Function form1.Target {
    \\ normal events executed to console
    \\ so we have to use Layer to redirect to Form1 layer
    Print "target:", number, A
    Refresh
    Layer Form1 {
        Target A, m
        if m then
            change A, back 2
        else
            change A, back 0
        end if
    }
    m~
}
Layer form1 {
    window 12, 12000, 8000
    form 32, 20
    motion.w; ' center window
    cls #333333, 0
    cursor 4, 4
    \\ we use immediate execution, in this module
    \\ so we call zz as this module (call local pass current scope to zz)
    target A, "call local zz", 10, 3, 2,15, 105, "press me"
    cursor 4, 8
    \\ 115 means 5 center, 10 use target event, 100 proportional font rendering
    target B,"z", 10, 3, 5,15, 115, "press me too"
}
Method form1,"show",1
Declare form1 nothing




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

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

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