Κυριακή, 23 Ιουλίου 2017

Εγχειρίδιο της Μ2000 - Τεύχος 31ο

17.3 Εισαγωγή (TextBox)

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

Το  στοιχείο εξ ορισμού έχει δυνατότητα για εισαγωγή 50 χαρακτήρων. Αυτό μπορεί να αλλάξει. Επειδή κατασκευάζουμε το στοιχείο δίνοντας τη θέση της πάνω αριστερής γωνίας και τα πλάτος και ύψος, μπορεί η εισαγωγή να είναι μεγαλύτερου πλάτους από το στοιχείο. Ο δρομέας αυτόματα καθώς προχωράμε προς τα δεξιά μεταφέρει κείμενο προς τα αριστερά, και κάνει το ανάποδο αν προχωράμε προς τα αριστερά. Δεν υποστηρίζει αντιγραφή, ή αποκοπή. Υποστηρίζει επικόλληση με Ctrl+V, αλλά με ταυτόχρονη διαγραφή της προηγούμενης τιμής. Δεν υποστηρίζει Σύρε και Άφησε (Drag and Drop). 

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

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


Γεγονότα του στοιχείου ΕΙΣΑΓΩΓΗ

  • About συμβαίνει όταν πατάμε το Ctrl+F1 
  • KeyDown &ΚωδικόςΠλήκτρου, &Τιμή_Shif_Ctrl_Alt  Οι τιμές είναι με αναφορά, μπορούμε να τις αλλάξουμε.
  • Click συμβαίνει με απλό κλικ στο στοιχείο
  • Enter
  • SpinnerValue aValue θα εξηγηθεί με παράδειγμα
  • ValidString &ThisValue$, &ThisPos  οι τιμές μπορούν να αλλάξουν

Ιδιότητες
  • index  αριθμός όταν ανήκει σε πίνακα στοιχείων Εισαγωγή και όλα τα γεγονότα δίνουν επιπρόσθετα, ως πρώτο στοιχείο τον αριθμό Index για να αναγνωριστεί από την συνάρτηση "υποδοχής" γεγονότων.
  • Text  δίνει και παίρνει ένα αλφαριθμητικό (ότι είναι γραμμένο στο στοιχείο Εισαγωγή
  • Info  δίνει και παίρνει ένα αλφαριθμητικό - μπορούμε να βάλουμε μια πληροφορία χωρίς να χαθεί η τιμή της Εισαγωγής, αλλάζει το χρώμα του στοιχείου. Πχ μπορεί να είναι ένα μήνυμα λάθους, ή ένα μήνυμα "Κλειστό".
  • Prompt  δίνει και παίρνει ένα αλφαριθμητικό (το σταθερό μέρος αριστερά)
  • Vartext δίνει και παίρνει ένα αλφαριθμητικό (το μεσαίο μέρος). Αυτό το κομμάτι εξ ορισμού παίρνει 50 χαρακτήρες.
  • ThisKind δίνει και παίρνει ένα αλφαριθμητικό (το τρίτο μέρος, η σταθερή ένδειξη τύπου)
  • Value η τιμή του spinner, δηλαδή μπάρας ολίσθησης. Από εδώ διαβάζουμε τον αριθμό, όταν το έχουμε στην διαμόρφωση για αριθμητικές τιμές.
  • MaxCharLength δίνει και παίρνει αριθμητική τιμή. Εξ ορισμού έχει το 50.
  • SelStart δίνει και παίρνει αριθμητική τιμή σχετικά με τον δρομέα και την απόστασή του σε χαραχτήρς από τον πρώτο και μετά (μαζί με τον πρώτο).
  • ShowAlways παίρνει μόνο τιμή, και κάνει το εξής. Όταν αφήσουμε το στοιχείο, δηλαδή πάει αλλού η εστίαση, με ShowAlways παραμένει το χρώμα του όπωςαυτό κατά την διόρθωση, αλλιώς αλλάζει σε χρώμα "ανάπαυσης".

  • Visible δίνει και παίρνει αριθμητική τιμή για το αν θα φαίνεται ή όχι. Αν δεν φαίνεται δεν μπορεί να πάρει την εστίαση.
  • Enabled  δίνει και παίρνει τιμή 0 ή -1 (΄ψευδές ή αληθές). με ψευδές γίνεται ανενεργό για διόρθωση από το χρήστη, αλλά μπορεί να αλλαχθεί εσωτερικά. Το στοχείο δεν μπορεί να πάρει εστίαση αν δεν είναι ενεργό.
  • Locked δίνει και παίρνει τιμή 0 ή -1 (΄ψευδές ή αληθές). με ψευδές γίνεται ανενεργό - δεν αλλάζει τίποτα.
  • Top δίνει και παίρνει τιμή, ως την απόσταση από την πάνω ακμή της φόρμας ως το πάνω αριστερό σημείο του στοιχείου
  • Left δίνει και παίρνει τιμή ως την απόσταση  από την αριστερή ακμή της φόρμας, ως το πάνω αριστερού σημείο του στοιχείου
Μέθοδοι

  • Retired γυρνάει το χρώμα στο χρώμα "μη εστίασης" και την θέση του δρομέα στην αρχή.
  • SetFoucs δίνει την εστίαση στο στοιχείο 
  • Spinner  δέχεται τέσσερα ορίσματα, το πρώτο είναι η εμφάνιση ή όχι της μπάρας ολίσθησης, το δεύτερο είναι η μικρότερη τιμή, το τρίτο η μεγαλύτερη τιμή, και το τέταρτο το μεγάλο βήμα, δηλαδή πόσο αλλάζει η τιμή όταν την αλλάζουμε με βελάκια άνω και κάτω, ή με το ροδελάκι του ποντικιού, ή από την μπάρα ολίσθησης με κλίκ στα πλήκτρα της.
  • Move δέχεται δυο ορίσματα συν δυο προεραιτικά, τα δυο πρώτα είναι η θέση στη φόρμα, τα left και top, και τα άλλα δυο είναι το πλάτος και ύψος του στοιχείου (σε twips).
  • FontAttr δέχεται ένα όρισμα με το όνομα γραμματοσειράς, και προαιρετικά δυο ακόμα, το μέγεθος και αν θέλουμε να έχουμε φαρδιά γράμματα (bold)
  • Transparent κάνει το φόντο διάφανο (η διαφάνεια λειτουργεί με αντιγραφή από τη φόρμα, όχι από τυχόν άλλο στοιχείο που μπορεί να βρίσκεται από κάτω.
  • ColorsReset  φέρνει τα χρώματα στα αρχικά
  • Colors δέχεται ένα όρισμα και τρία προαιρετικά. Το πρώτο είναι το χρώμα για το άσπρο, το δεύτερο για το μαύρο, και τα άλλα δυο τα χρώματα "μη εστίασης", και το "κόκκινο" ή έντονο  χρώμα.
Το παράδειγμα πραγματεύεται πέρα από τη χρήση του πλήκτρου και άλλα θέματα, όπως το πώς θα ανοίξουμε μια φόρμα κεντραρισμένη στην οθόνη μας, και  πώς θα την κατασκευάσουμε στο μέγεθος που θέλουμε, με γράμματα σε μέγεθος και γραμματοσειρά της επιλογής μας. Επίσης θα ζωγραφίσουμε και θα βάλουμε κείμενο! Θα δούμε πως με κλικ πάνω στη φόρμα μπορούμε να διαβάσουμε το χρώμα και να κάνουμε κάποια ενέργεια.



Σε Wine σε Linux τρέχει το πρόγραμμα, αλλά το Τοπικό 1032 (ελληνικά) δεν δίνει το κόμμα για υποδιαστολή (έχει θέμα το Wine). Αν χρησιμοποιήσουμε το 1036 θα πάρουμε την υποδιαστολή! Δείτε τα locale id εδώ. Το 1036 είναι για την Γαλλία.


Σημ 1 : Διαφυγή Όχι \\ αν το βάλουμε αυτό το Esc δεν θα πιάνει για διακοπή κώδικα
Περιθώριο {
      μέγισταΧ=χ.σημεία
      μέγισταΥ=υ.σημεία
}
Τοπικό 1032 ' με 1033  βάζει την τελεία ενώ με Τοπικό 1032 βάζει το κόμμα για υποδιαστολή
\\ Αυτό το τμήμα απλά παίρνει ότι έχει ήδη ο σωρός και τα επεξεργάζεται,
\\ έτσι δεν χρειάζεται να τα γράψουμε δυο φορές στις ρουτίνες εξυπηρέτησης γεγονότων
Τμήμα Αρ {
      Διάβασε &Αριθμ, πως$, πολ, χωρις, &τροφ1$, &μιαθεση
      \\ η Αριθμ είναι αναφορά σε αντικείμενο "ιδιότητα"
      \\ δηλαδή ένα αντικείμενο συνδεδεμένο με μια ιδιότητα άλλου αντικειμένου
      Τοπική προσ1
      αν όχι χωρίς τότε προσ1=αρισ$(τροφ1$,1)="-"
      Δες {
            Τοπική αλφα
            αλφα=Τιμη(τροφ1$,"")*πολ : Αριθμ=αλφα : Αλφα=Αριθμ
      }
      Αν Έγκυρο(άλφα) Τότε {
                 τροφ1$=γραφη$(απολ(αλφα)/πολ,πως$)
                Αν προσ1 Τότε τροφ1$="-"+τροφ1$
                Αν μιαθέση>μήκος(τροφ1$) τότε μιαθέση=1
      } Αλλιώς μιαθέση=100
}


\\ τώρα θα ορίσουμε τη φόρμα με την εντολή Όρισε
\\ δεν δίνουμε κάποιο αντικείμενο Γεγονός οπότε οι κλήσεις των γεγονότων
\\ θα οδηγηθούν σε αυτό το τμήμα.
\\ Δυο τύποι κλήσεων γίνονται από την φόρμα. Οι έμμεσες και οι άμεσες.
\\ Οι άμεσες έχουν παραμέτρους με αναφορά, και άμεσα ζητούν απάντηση
\\ Οι έμμεσες μπορούν να έχουν ορίσματα αλλά αυτά είναι για "κατανάλωση"
\\ και με ένα εξωτερικό γεγονός θα μπορούσαμε να τα μαζέψουμε και να τα διοχετεύσουμε αργότερα
\\ μέσω ενός σωρού, με χρήση του ως FIFO, το πρώτο εισερχόμενο γίνεται και πρώτο εξερχόμενο


Όρισε Φόρμα1 Φόρμα
\\ Με την ίδια εντολή θα ορίσουμε το στοιχείο Εισαγ1
\\ Κεντράρισμα φόρμας. Το πλάτος και το ύψος θα το ορίσουμε μέσα στην Επίπεδο
\\ θα μπορούσαμε και εδώ αλλά θέλουμε αλλαγή γραμματοσειράς και μεγέθους στη φόρμα:
Μέθοδος Φόρμα1,"move", μέγισταΧ/2-5000, μέγισταΥ/2-4000
Επίπεδο Φόρμα1 {
      Γραμματοσειρά "Arial Black"
      Παράθυρο 12, 10000,8000
      Οθόνη 4
      Πένα 14
      Θέση Χ.σημεία/2, Υ.σημεία/2
      Κύκλος Γέμισμα 5, 4000,1/2.5
      Δρομέας 0, Ύψος-6
      Αναφορά 2, {Δοκίμασε κλικ μέσα στην έλλειψη
                  Και απ' έξω!
                  Πάρε αριθμούς από το WordPad και κάνε Ctrl+V
                  για επικόλληση!
                  Δες τη χρήση με τα βελάκια και το Shift!
                  }

}


Όρισε εισαγ1 ΕΙΣΑΓΩΓΗ Φόρμα Φόρμα1
\\ και ένα δεύτερο!
Όρισε εισαγ2 ΕΙΣΑΓΩΓΗ Φόρμα Φόρμα1


\\ τώρα θα προγραμματίσουμε τις Εισαγωγές, για να δεχτούν αριθμούς.
\\ Η μέθοδος Spinner δέχεται στο τέλος τρεις ακέραιους αριθμούς. Ακόμα και αν θέλουμε να βάλουμε αριθμό με δεκαδικά θα δώσουμε τα όρια υπολογίζοντας χωρίς την υποδιαστολή με τα δεκαδικά σαν μέρος ενός ακέραιου αριθμού:


\\ Για το Εισαγ1
\\ Εμφανίζουμε τη μπάρα ολίσθησης δεξιά και δίνουμε τα όρια και το μεγάλο βήμα
Μέθοδος Εισαγ1 "Spinner", Αληθές, -1000, 2000, 50
\\ δίνουμε θέση και μέγεθος σε twips
Μέθοδος Εισαγ1,"move", 1000, 1400, 5000, 600
\\ Συνδέουμε τα "Value" και "VarText" με μεταβλητές (ουσιαστικά είναι αντικείμενα και αυτά)
\\ Θα εμφανίζεται το Ύψος : 1.23 μέτρα και θα μένει πάντα με άσπρο φόντο (αυτό λέει η ShowAlways)
\\ δοκιμάστε με ψευδές


Με Εισαγ1, "Prompt", "Ύψος: ",  "Value" ως Αριθ, "VarText" ως Τροφ$, "ThisKind"," μέτρα", "ShowAlways", Αληθές


\\ Για το Εισαγ2
\\ Εμφανίζουμε τη μπάρα ολίσθησης δεξιά και δίνουμε τα όρια και το μεγάλο βήμα
Μέθοδος Εισαγ2 "Spinner", Αληθές, 0, 10000, 5
\\ δίνουμε θέση και μέγεθος σε twips
Μέθοδος Εισαγ2,"move", 1000, 2200, 5000, 600
\\ ομοίως και εδώ με σύνδεση τιμών σε μεταβλητές (δείτε με Τύπωσε Τύπος$(Αριθ2) τι δίνει)
Με Εισαγ2, "Prompt", "Απόσταση: ",  "Value" ως Αριθ2, "VarText" ως Τροφ2$, "ThisKind"," μέτρα"
Μέθοδος Εισαγ2, "Transparent"
Μέθοδος Εισαγ2, "Colors", #FFFFFF, #FFFFFF
\\ Τώρα θα βάλουμε τις συναρτήσεις που καλούνται από γεγονότα
\\ θα έχουν το όνομα του αντικειμένου, μια τελεία και το όνομα του γεγονότος.
\\ αν χρειαστεί να διαβάσουμε παραμέτρους χρησιμοποιούμε την Διάβασε ή Διάβασε Νέο για περιπτώσεις που δεν θέλουμε να μπλέξει το διάβασμα με υπάρχον όνομα
\\ Οι συναρτήσεις γεγονότων καλούνται σαν να τρέχουν στο τμήμα, με τη διαφορά ότι έχουν δικό τους σωρό τιμών. Δηλαδή ότι αφήσουμε στο σωρό θα χαθεί μετά τη κλήση.
\\ Ακόμα και να τρέξει δυο φορές ταυτόχρονα δεν θα έχουμε θέμα ακόμα και αν δημιουργούμε μεταβλητές, γιατί θα σβηστούν με την ανάποδη φορά από αυτή που φτιάχτηκαν.
\\ Συμφέρει όμως να έχουμε ήδη έτοιμες κάποιες μεταβλητές στο τμήμα, αφού αυτές οι συναρτήσεις μπορούν να δουν τις μεταβλητές του τμήματος.
\\ Επίσης δείτε ότι οι συναρτήσεις δεν γυρίζουν τιμή. Καλούνται με την Κάλεσε Τοπικά, σαν τμήματα, με τη διαφορά όπως αναφέρθηκε ότι έχουν δικό τους σωρό τιμών.


\\ Στην πρώτη εισαγωγή θα βάλουμε αριθμό με δυο δεκαδικά και πρόσημο.
\\ όταν πατήσουμε Ctrl+F1 θα παραχθεί το παρακάτω γεγονός
\\ Πατάμε τα ctrl+F1 και όταν τα αφήσουμε παράγεται το γεγονός!
Συνάρτηση Εισαγ1.About {
      Περί "Εισαγωγή Ύψους","Περιεχόμενο βοήθειας 1"
}


Συνάρτηση Εισαγ1.ValidString {
      \\ εδώ καλούμε με την κάλεσε και όχι απλά με την Αρ
      \\ γιατί ενδέχεται να τρέξει παράλληλα μια δεύτερη Αρ από άλλο στοιχείο
      \\ η Αρ διαβάζει έξι ορίσματα, αλλά εδώ δίνουμε τέσσερα, ενώ υπάρχουν ήδη άλλα δύο
      \\ που φέρνει η ValidSrting. Η Αριθ είναι αντικείμενο, και μπορεί να περάσει με αναφορά
      \\ Το τμήμα Αρ δεν βλέπει έξω από το χώρο του μεταβλητές
      \\ η συνάρτηση Εισαγ1.ValidString βλέπει γιατί έχει κληθεί με Κάλεσε Τοπικά
      \\ δείτε ότι δεν γυρίζει κάτι, αλλά πράγματι γυρίζει τις δυο μεταβλητές που έχει περάσει με αναφορά
      \\ απλά τις διαβάζουμε στο τμήμα Αρ
      \\ (αυτή είναι μια δυνατότητα της Μ2000, επειδή εκθέτει το σωρό τιμών μεταξύ των κλήσεων τμημάτων)
      \\ (Ισχύει στην Μ2000 ότι τα τμήματα είναι υπεύθυνα για το πώς θα αφήσουν τον σωρό)
      \\ Οι μεταβλητές με αναφορά δεν χρειάζεται να ξαναμπούν στο σωρό, γιατί η Διάβασε τις έχει ενώσει,
      \\ άρα η μεταφορά τιμής έχει γίνει!
      \\ Όμως η  ValidSrting θα ενημερώσει για τις αλλαγές στην επιστροφή! Εδώ έχουμε το γνωστό:
      \\ copy in copy out, γιατί οι αυθεντικές μεταβλητές ουσιαστικά βρίσκονται σε άλλο πραγματικό νήμα!
      \\ Στη Μ2000 όπου βλέπουμε το & πριν από μεταβλητή είναι πραγματική ένωση, η νέα μεταβλητή δείχνει το χώρο της αναφερόμενης. Η διαφορά όπως αναφέρθηκε είναι με τις αναφορές από γεγονότα.

      Κάλεσε Αρ, &Αριθ, "0.00", 100, ψευδές
}
Συνάρτηση Εισαγ1.SpinnerValue {
      \\ εδώ διαβάζουμ σε μια απλή μεταβλητή. Αν τρέξει και δεύτερη φορά, δεν μας πειράζει να πάρει την πιο νέα τιμή!
            Διάβασε τιμ
            Τροφ$=γραφή$(τιμ/100,"0.00")
}
\\ Η Τροφ$ είναι αντικείμενο συνδεδεμένο με ιδιότητα αντικειμένου. Δίνουμε το 1.5 ως αλφαριθμητικό
\\ γίνεται η μετατροπή στη σωστή υποδιαστολή, και αποκόπτονται τυχόν περισσότερα δεκαδικά.
\\ Πριν μπει τελικά στη θέση του στην Εισαγ1 (στοιχείο τύπου Εισαγωγή) θα κληθεί η ValidString, και αυτόματα θα ρυθμιστεί και η μπάρα ολίσθησης!
Τροφ$=Γραφή$(1.5,"0.00")


\\ Τώρα ετοιμάζουμε τη δεύτερη εισαγωγή, με βοήθεια, και εδώ δεν έχουμε δεκαδικά και δεν έχουμε πρόσημο
Συνάρτηση Εισαγ2.About {
      Περί "Εισαγωγή Απόστασης","Περιεχόμενο βοήθειας 2"
}
Συνάρτηση Εισαγ2.ValidString {
      Κάλεσε Αρ, &Αριθ2, "", 1, αληθές
}
Συνάρτηση Εισαγ2.SpinnerValue {
            Διάβασε τιμ
            Τροφ2$=γραφή$(τιμ,"")
}
\\ δοκιμάστε με "500000"
Τροφ2$="200"  ' βάζουμε τώρα την τιμή, και θα παίξεο αμέσως το ValidSrting


\\ Τώρα μας ενδιαφέρει όταν πατήσουμε το τετράγωνο πάνω αριστερά να μας ρωτήσει το πρόγραμμα
\\ αν πράγματι θέλουμε να κλείσουμε τη φόρμα
Εξ=Ψευδές
Συνάρτηση Φόρμα1.MouseDown {
      Διάβασε Νέο Πληκτ, Μεταθ, Χ, Υ
      Επίπεδο Φόρμα1 {
            Θέση Χ, Υ
            Αν Σημείο= #800080 Τότε Μετά 100 {Με Εισαγ1, "Info",""} : Έξοδος
            Μετά 100 {Με Εισαγ1, "Info","Κλείσαμε ξανά!"}
      }
}
Συνάρτηση Φόρμα1.Unload {
      \\ χρησιμοποιούμε την Νέο για την περίπτωση που ξαναδωθεί το γεγονός
      \\ επειδή δεύτερη αναφορά δεν μπορούμε να βάλουμε.
      \\ η συνάρτηση καλείται με το Κάλεσε Τοπικά με θέαση μεταβλητών στο τμήμα
      Διάβασε Νεο &όχι_τώρα
      \\ ακυρώνουμε την έξοδο εδώ
      όχι_τώρα=Αληθές
      Μετά 100 {
            Εξ= Ρώτα("Θές να τερματίσεις την εφαρμογή")=1
            Αν Εξ Τότε Μέθοδος Φόρμα1, "CloseNow"
      }
}


Μετά 300 {Με Εισαγ1, "Info","Κλείσαμε!"}


Νήμα {
      \\ δεν κάνει τίποτα, απλά υπάρχει για να τρέξει η Κύριο.Έργο
} ως ΧΧ κάθε 5000


\\ Η διαφορά με τους τρεις τρόπους είναι:
\\ μεταξύ 1 και 2, στο δεύτερο τρόπο όταν ανοίξουμε με το Ρώτα το διάλογο επικοινωνίας (messagebox), η ροή της κάθε θα διακοπεί, ενώ στο ένα επειδή το Κύριο.Έργο είναι νήμα θα συνεχίσει να τρέχει.
\\ και στις τρεις περιπτώσεις χρησιμοποιούμε τον ίδιο τρόπο εξόδου από την μεριά του γεγονότος.
\\ Στην περίπτωση 3 η έξοδος γίνεται με απευθείας εντολής για να κλείσει η φόρμα
\\ Στις περιπτώσεις 1 και 2 η φόρμα θα κλείσει αυτόματα όταν αποδεσμεύσουμε τα αντικείμενα
\\ και δεν θα παραχθεί γεγονός. Για το σκοπό αυτό έχουμε την μεταβλητή Εξ που κάνει έξοδο από τα μπλοκ κώδικα, και στο Κύριο.Έργο {} και στη Κάθε {}
\\ Και στις δυο εντολές έχουμε το 1000 που σημαίνει ότι εκτελούνται ανά δευτερόλεπτο. Δεν περνάει ένα δευτερόλεπτο από την κάθε εκτέλεση, αλλά το υπόλοιπο από το δευτερόλεπτο από το χρόνο που καταναλώνει η εκτέλεση μέσα στο μπλοκ, έτσι ξέρουμε ότι κάθε επανάληψη μπλοκ θα ξεκινάει ανά δευτερόλεπτο! Σε περίπτωση που η εκτέλεση χρειαστεί περισσότερο χρόνο, θα ξεκινήσει η επόμενη μόλις πάρει το χρόνο της (θα χάσει φάση όπως λέμε)
\\ Τα νήματα τρέχουν με το στάνταρ πλάνο το Σχέδιο.Νημάτων Διαδοχικό. Δείτε τη βοήθεια!


Επίλεξε Με 1
Με 1
      {
            Μέθοδος Φόρμα1 ,"Show"
            \\ η Κύριο.Έργο είναι νήμα και για να τρέξει πρέπει να υπάρχει ένα νήμα ακόμα.
           Κύριο.Έργο 1000 { \\ εδώ το Esc πιάνει και διακόπτει τη Κύριο.Έργο, εκτός και παίξει η πρώτη εντολή
            \\ η εντολή Διαφυγή Όχι βγάζει εκτός το Esc (δουλεύει μόνο ως έξοδος από διορθωτή κειμένου)
                  Τύπωσε Γραφή$(Τώρα, "hh:nn:ss")
                  Ανανέωση
                  Αν εξ τότε Έξοδος
            }
      }
Με 2
      {
            Μέθοδος Φόρμα1 ,"Show"
           Κάθε 1000 { \\ εδώ το Esc πιάνει και διακόπτει τη Κάθε, εκτός και παίξει η πρώτη εντολή
            \\ η εντολή Διαφυγή Όχι βγάζει εκτός το Esc (δουλεύει μόνο ως έξοδος από διορθωτή κειμένου)
                  Τύπωσε Γραφή$(Τώρα, "hh:nn:ss")
                  Ανανέωση
                  Αν εξ τότε Έξοδος
            }
      }
Με 3 \\ Εδώ θα ανοίξουμε τη φόρμα με τρόπο Modal
      Μέθοδος Φόρμα1 ,"Show", 1
Τέλος Επιλογής
\\ από εδώ συνεχίζουμε όταν κλείσει η φόρμα1
\\ τα δυο πρώτα είναι προεραιτικά, ίσως και τρίτο, αλλά για κάθε περίπτωση καλό είναι να αποδεσμεύουμε τα αντικείμενα με την ανάποδη σειρά από αυτή που δημιουργήθηκαν
\\ Γενικά πάντως η Μ2000 θα τα αποδεσμεύσει
\\ Το Esc το αφαιρέσαμε με την Διαφυγή Όχι, αλλά και χωρίς αυτό, τα Modal παράθυρα δεν βγαίνουν χωρίς να τα κλήσουμε.


\\ Τα νήματα θα τα σβήσει το τμήμα, εκτός από αυτά τα νήματα που δεν δημιουργήθηκαν από αυτό!
\\ Εδώ με την εντολή αυτή σβήνουμε όλα τα νήματα (ακόμα και αυτά που θα ξεκινήσουνε μετά το πέρας του νήματος θα διαβάσουν το μήνυμα τερματισμού και θα βγουν εκτός)
Νήματα Σβήσε


Όρισε Εισαγ2 Τίποτα
Όρισε Εισαγ1 Τίποτα
Όρισε Φόρμα1 Τίποτα



Παραλλαγή.
Στην επιλογή 3, όπου ανοίγουμε ένα Modal Παράθυρο (σαν παράθυρο διαλόγου δηλαδή, που απενεργοποιεί τα ήδη ανοικτά), μπορούμε να βάλουμε αντί για μια εντολή το παρακάτω μπλοκ, το οποίο θα τρέχει ένα νήμα που θα δείχνει την ώρα όπως και στις περιπτώσεις 1 και 2. Αυτό αυμβαίνει γιατί η αναμονή για να κλείσει ο "Διάλογος" δίνει χρόνο σε νήματα! Η διαφορά με το Κύριο.Έργο είναι ότι εδώ δεν θα τερματιστούν τα νήματα, αλλά θα γίνει ο τερματισμός όταν τερματίσει το τμήμα που δημιουργήθηκαν (ουσιαστικά το αντικείμενο εκτέλεσης όπου το νήμα είναι "παιδί" του).
      {
      Νήμα {
            Τύπωσε Γραφή$(Τώρα, "hh:nn:ss")
            Ανανέωση
      } ως ΑΑΑ κάθε 1000
      Μέθοδος Φόρμα1 ,"Show", 1
      }