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

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

17.5 Λίστα (ListBox) 
Το στοιχείο Λίστα περιέχει γραμμές ή και έναν τίτλο. Μια λίστα μπορεί να κάνει χρήση ενός εσωτερικού πίνακα γραμμών ή με κατάλληλο προγραμματισμό να δέχεται στοιχεία απ΄έξω, πιθανόν από εξωτερικό πίνακα, ή άλλη δομή.


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

Ο εσωτερικός πίνακας γραμμών έχει δυνατότητα ταξινόμησης και αναζήτησης.

Σε μια λίστα ο δρομέας εμφανίζεται με έναν από τους τρεις τρόπους:
  • Προκαθορισμένος με αλλαγή χρώματος φόντου και γραμμάτων
  • Με αλλαγή χρωματισμού του κειμένου μόνο. Αυτό χρησιμοποιούμε όταν έχουμε διάφανο φόντο στο στοιχείο
  • Με δρομέα κάθετο (Caret) που αναβοσβήνει, για εισαγωγή κειμένου
Η κίνηση του δρομέα μεταξύ των στηλών γίνεται με τα βελάκια, με την μπάρα ολίσθησης που είναι κρυμμένη και εμφανίζεται όταν χρειάζεται, με τα Home/End/PageUp/PageDown. Με χρήση του shift και τα βελάκια ή όταν πάμε στις άκρες πάνω και κάτω μπαίνει η αυτόματη αλλαγή γραμμής, και ολισθαίνει η λίστα. Από το μέσον δεξιά της λίστας λειτουργεί και το τράβηγμα της λίστας, δηλαδή κρατάμε πατημένο το αριστερό πλήκτρο του ποντικιού και σπρώχνουμε τη γραμμή πάνω ή κάτω. Αν σταματήσουμε να σπρώχνουμε και κρατάμε ακόμα πατημένο το πλήκτρο του ποντικιού μπαίνει η αυτόματη ολίσθηση. Η διαφορά του τραβήγματος με την ολίσθηση με τα βελάκια (ή με το ροδελάκι του ποντικιού) είναι στο ότι με το τράβηγμα δεν αλλάζουμε το δρομέα, απλά αλλάζουμε τη θέαση της λίστας (αυτό ισχύει σε όλα τα στοιχεία της Μ2000, που δείχνουν πολλές γραμμές, ακόμα και στον διορθωτή τμημάτων και συναρτήσεων, και αυτός έχει το ίδιο στοιχείο εσωτερικά)

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

Η επιλογή γραμμής μπορεί να γίνεται και με τράβηγμα της γραμμής δεξιά (και ρύθμιση μιας ιδιότητας και με τράβηγμα στα αριστερά). Υπάρχει γεγονός  (DblClick) που παράγεται όταν σε μια επιλεγμένη γραμμή δίνουμε κλικ με το ποντίκι, ή Enter, ή τράβηγμα δεξιά. Αυτό το γεγονός είναι διαφορετικό από την απλή επιλογή (σε μη επιλεγμένη γραμμή, έχουμε το Click ή το Scroll).

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

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


Γεγονότα
  • ValidList  με αναφορά περιεχόμενο$, θέση, στοιχείο
  • About παράγεται όταν πατάμε το Ctrl+F1
  • ListCount  με αναφορά μέγεθος_λίστας (όταν δώσουμε νούμερο, τότε δείχνει η λίστα ότι έχει τα στοιχεία που ορίσαμε, και μπορούμε να τα φορτώνουμε στο γεγονός External)
  • KeyDown με αναφορά κωδικός_πλήκτρου, θέση_ειδικών_πλήκτρων (shift, control, alt)
  • DblClick  γυρίζει δυο αριθμούς το στοιχείο και τη θέση αριστερά ή δεξιά (0 ή -1) που προκύπτει  ανάλογα το τράβηγμα (αν έχουμε ορίσει PanDouble ως αληθές, μπορούμε να σπρώχνουμε την γραμμή - στοιχείο- αριστερά, και παράγεται το DblClick με 0.  Επειδή αυτό το γεγονός βγαίνει και με Enter, μπορούμε να χρησιμοποιούμε το Shift μαζί με το Enter για να δίνουμε την κατεύθυνση αριστερά. Το ίδιο γίνεται και όταν κάνουμε κλικ με το ποντίκι και έχουμε πατημένο το Shift.
  • External  με αναφορά  περιεχόμενο$  (δίνουμε το περιεχόμενο, όταν έχουμε την ιδιότητα External με τιμή Αληθής)
  • Unicode  με αναφορά  χαρακτήρας_unicode$
  • Move γυρίζει το στοιχείο (τον αριθμό του) που είναι το πρώτο στη φανερή λίστα.
  • Scroll γυρίζει το στοιχείο (τον αριθμό του)
  • Click γυρίζει το στοιχείο (τον αριθμό του)
  • Color  με αναφορά  χρώμα (είναι αρνητικός αριθμός, πχ το #FF0000 (κόκκινο) είναι το -255)
  • Ascii με αναφορά  χαρακτήρας_ascii   (είναι αριθμός) 
Ιδιότητες
  • Index  αριθμός  στοιχείου Λίστας όταν έχουμε πίνακα Λιστών
  • locked κλειδώνει τη λίστα
  • Εnabled με Ψευδές δεν παράγονται τα γεγονότα ValidList, ListCount, External, Color
  • Title  βάζει/διαβάζει μια γραμμή τίτλου
  • Linespace βάζει/διαβάζει το διάστιχο
  • List() δίνει ένα πίνακα για να βάζουμε και να διαβάζουμε τα στοιχεία της λίστας
  • ListIndex  βάζει/διαβάζει το επιλεγμένο
  • ListIndex2 βάζει μόνο το επιλεγμένο χωρίς επανασχεδιασμό της λίστας.
  • listcount διαβάζει τον αριθμό των στοιχείων στη λίστα
  • Text βάζει/διαβάζει τα στοιχεία σε μια ένα κείμενο με γραμμές.
  • External βάζει/διαβάζει και με τιμή Αληθές λειτουργεί η εξωτερική λίστα
  • DisplayLines  βάζει μόνο τον αριθμό των φανερών στοιχείων στη λίστα (υπολογίζει αυτόματα το διάστιχο)
  • Transparent βάζει μόνο, με Αληθές κάνει τη λίστα διάφανη (σε αυτό το στοιχείο δεν έχουμε μέθοδο αλλά ιδιότητα Transparent
  • Center βάζει μόνο, με Αληθές κάνει τα στοιχεία να είναι κεντραρισμένα στη γραμμή
  • Edit βάζει μόνο, με Αληθές κάνει τις γραμμές της λίστας να διορθώνονται από το χρήστη
  • ScrollTo βάζει μόνο, παίρνει τον αριθμό στοιχείου στη κορυφή της φανερής λίστας
  • ScrollFrom διαβάζει μόνο, δίνει τον αριθμό στοιχείου στη κορυφή της φανερής λίστας
  • ShowAlways βάζει μόνο, με Αληθές μένει το στοιχείο με άσπρο φόντο
  • Find(), διαβάζει μόνο δέχεται ως όρισμα ένα αλφαριθμητικό (μπορεί να έχει * στο τέλος), και κάνει αναζήτηση στην εσωτερική λίστα.
  • HideCaret διαβάζει μόνο,  με Αληθές κρύβει την επιλογή
  • PanDouble διαβάζει μόνο, με Αληθές επιτρέπει και το τράβηγμα προς τα αριστερά.

Μέθοδοι
  • GetFocus δίνει εστίαση στο στοιχείο, βάσει ονόματος (ουσιαστικά κάνει ότι και η SetFocus)
  • SetFocus δίνει εστίαση στο στοιχείο, απευθείας στο στοιχείο στη φόρμα
  • Move δέχεται δυο ορίσματα συν δυο προεραιτικά, τα δυο πρώτα είναι η θέση στη φόρμα, τα left και top, και τα άλλα δυο είναι το πλάτος και ύψος του στοιχείου (σε twips).
  • FontAttr δέχεται ένα όρισμα με το όνομα γραμματοσειράς, και προαιρετικά δυο ακόμα, το μέγεθος και αν θέλουμε να έχουμε φαρδιά γράμματα (bold) 
  • Refresh
  • Add περιεχόμενο$, προσθέτει μια γραμμή στο τέλος (στην εσωτερική λίστα/εσωτερικό πίνακα)
  • AddFast δείκτης,  περιεχόμενο$ (ο δείκτης δεν χρησιμοποιείται προς το παρόν), προσθέτει περιεχόμενο χωρίς επανασχεδιασμό της λίστας.
  • Insert περιεχόμενο, προσθέτει ακριβώς μετά το επιλεγμένο
  • Clear καθαρίζει τη λίστα
  • Delete αριθμός_στοιχείου, διαγράφει το στοιχείο (από την εσωτερική λίστα)
  • ShowThis αριθμός_στοιχείου και προαιρετικά με αληθές αν δεν θα είναι επιλεγμένο,  ρυθμίζει τη λίστα για να φαίνεται το στοιχείο με αριθμό που δίνουμε
  • Sort με προαιρετική έναν αριθμό θέσης στη κάθε γραμμή απ΄όπου θα ξεκινάει η σύγκριση για την ταξινόμηση.
  • ColorsReset ορίζουμε τα χρώματα στα εξ ορισμού.
  • Colors ορίζουμε το "άσπρο" και προαιρετικά άλλα τρια χρώματα.

Το παρακάτω παράδειγμα βάζει μια λίστα σε μια φόρμα, και η λίστα έχει ένα μόνο στοιχείο που γράφει το όνομά της Λιστ1! Όμως δεν έχει επιλεχθεί η γραμμή με το Λιστ1

Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Φόρμα1, "move", 2000,2000,10000,8000
Μέθοδος Λίστ1, "move", 2000,2000,4000,4000
Μέθοδος Φόρμα1,"Show", 1
Όρισε Λιστ1 Τίποτα
Όρισε Φόρμα1 Τίποτα

Η όρισε Λιστ1 Τίποτα μπορεί να παραληφθεί, όπως και σε όλα τα στοιχεία μιας φόρμας, ακόμα και η Όρισε Φόρμα1 Τίποτα, γιατί θα συμβούν αυτόματα στην έξοδο από το τμήμα. Όμως καλό είναι να φαίνεται, γιατί μπορεί να εννοείται αλλά διαβάζεται καλύτερα όταν δίνουμε την εντολή.

Ένα ακόμα παράδειγμα για το πώς διαβάζουμε τη λίστα, εδώ δεν δίνουμε μέγεθος και θέση στη φόρμα, θα πάρει τα εξ ορισμού θέση και μέγεθος. Στη λίστα βάζουμε το ShowAlways (το έχουμε δει και στα άλλα στοιχεία). Σε μια ιδιότητα text βάζουμε τις γραμμές που θέλουμε να δείξουμε ως γραμμές της λίστας. Συνδέουμε μια μεταβλητή με την ιδιότητα Listindex. Όταν κάνουμε κλικ στην φόρμα τότε μας γράφει στη κονσόλα (πίσω από τη φόρμα) την τιμή της Επιλεγμένο (της ιδιότητας Listindex). Χωρίς επιλογή γυρίζει το -1, ενώ αν επιλέξουμε το Αθήνα γυρίζει το 0. Θα μπορούσαμε πριν την εμφάνιση της φόρμας να δώσουμε το Επιλεγμένο=1 και έτσι να έχει γίνει η επιλογή στη γραμμή με τη πόλη Θεσσαλονίκη. Εδώ βλέπουμε μια απλή λειτουργία όπου θέτουμε την επιλογή στη λίστα, και μπορούμε να διαβάσουμε την επιλογή από κάποιο άλλο γεγονός και όχι ειδικά κατά την αλλαγή επιλογής!

Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 2000,1000,4000,3000
Με Λίστ1, "ShowAlways",Αληθές,"text",{Αθήνα
                                    Θεσσαλονίκη
                                    Πάτρα
                                    }
Με Λιστ1, "Listindex" ως Επιλεγμένο
Συνάρτηση Φόρμα1.Click {
      Τύπωσε Επιλεγμένο
      Ανανέωση
}
Μέθοδος Φόρμα1,"Show", 1
Όρισε Φόρμα1 Τίποτα

Στο παρακάτω παράδειγμα έχουμε αφαιρέσει το γεγονός Φόρμα1.Click και έχουμε βάλει δυο άλλα, το Λιστ1.Click και το Λιστ1.Scroll. Όταν επιλέγουμε με κλικ (αριστερό πλήκτρο του ποντικού) στη λίστα παράγεται γεγονός, το ίδιο όταν αλλάζουμε γραμμή με βελάκια άνω και κάτω ή με το ροδελάκι του ποντικού (κάνει PageUp ή PageDown αλλά όταν είναι λίγες γραμμές πάει ανά γραμμή) ή με πλήκτρα PageUp και PageDown. Όταν κρατάμε πατημένο το αριστερό πλήκτρο και το μετακινούμε πάλι παράγεται γεγονός αλλά τώρα είναι διαφορετικό. Και στις δυο περιπτώσεις αλλάζει η ίδια ιδιότητα. Δείτε επίσης ότι όταν αλλάζουμε την ιδιότητα Listintex (ως μεταβλητή εδώ είναι η Επιλεγμένο) δεν παράγεται γεγονός click ή scroll.

Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 2000,1000,4000,3000
Με Λίστ1, "ShowAlways",Αληθές,"text",{Αθήνα
                                    Θεσσαλονίκη
                                    Πάτρα
                                    }
Με Λιστ1, "Listindex" ως Επιλεγμένο
Συνάρτηση Λιστ1.Click {
      Τύπωσε Επιλεγμένο
      Ανανέωση
}
Συνάρτηση Λιστ1.Scroll {
      Τύπωσε Επιλεγμένο, "Ολίσθηση"
      Ανανέωση
}
Επιλεγμένο=1
Μέθοδος Φόρμα1,"Show", 1
Όρισε Φόρμα1 Τίποτα

Στο παρακάτω παράδειγμα έχουμε βάλει μια ιδιότητα που παίρνει μια παράμετρο, και φαίνεται σαν πίνακας, την Λιστ1$(). Αυτή μπορεί να παίρνει τιμές ή να δίνει τιμές. (ότι όνομα  θέλουμε βάζουμε, ακόμα και με τελεία, δηλαδή το Λιστ1.Λιστα$() θα ήταν αποδεκτό. Εδώ έχουμε επιπλέον μια προσθήκη στη λίστα με τη μέθοδο Add, και μια αλλαγή εμφάνισης στο στοιχείο της λίστας 0.
Προστέθηκε και η ιδιότητα Find η οποία λειτουργεί σαν συνάρτηση και επιστρέφει τιμή βάσει ενός αλφαριθμητικού που μπορεί να έχει χαρακτήρες όπως * και ? και άλλους (δείτε την ~ στα αλφαριθμητικά, είναι η Like της Visual Basic 6)
Επίσης μπήκε μια Αν Αληθές Τότε {} για να το δούμε και χωρίς το Αληθές, με Ψευδές,όπου στην μια περίπτωση κάνουμε ταξινόμηση και επιλέγουμε τη Θεσαλλονίκη, που εδώ δεν αλλάζει θέση, αλλά θα μπορούσε να αλλάξει, και στην άλλη απλά επιλέγουμε απευθείας το στοιχείο 1 (το δεύτερο).

Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 2000,1000,4000,3000
Με Λίστ1, "ShowAlways",Αληθές,"text",{Αθήνα
                                    Θεσσαλονίκη
                                    Πάτρα
                                    }
Με Λιστ1, "Listindex" ως Επιλεγμένο, "List" ως Λιστ1$(), "Find" ως Λιστ1Εύρεση()
Συνάρτηση Λιστ1.Click {
      Τύπωσε Επιλεγμένο, Λιστ1$(Επιλεγμένο)
      Ανανέωση
}
Συνάρτηση Λιστ1.Scroll {
      Τύπωσε Επιλεγμένο, Λιστ1$(Επιλεγμένο), "Ολίσθηση"
      Ανανέωση
}
Συνάρτηση Φόρμα1.click {
     τοπική Μ=Λιστ1Εύρεση("Π*")
    Αν Μ>-1 τότε Επιλεγμένο=Μ
}
Μέθοδος Λιστ1, "Add", "Καβάλα"
Λίστ1$(0)="*Αθήνα*"
Αν Αληθές Τότε {
      Μέθοδος Λιστ1, "Sort"
      Επιλεγμένο=Λιστ1Εύρεση("Θ*")
} Αλλιώς Επιλεγμένο=1
Μέθοδος Φόρμα1,"Show", 1
Όρισε Φόρμα1 Τίποτα


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

Αυτό που δεν έχουμε δει είναι το γεγονός dblclick, το οποίο παράγεται όταν κάνουμε κλικ στο επιλεγμένο, ή όταν το τραβάμε δεξιά, ή όταν πατάμε Enter.  Εδώ καλούμε το γεγονός και προγραμματιστικά όταν κάνουμε κλικ στη φόρμα, με μια κάλεσε τοπικά (η κάλεσε τοπικά βλέπει συναρτήσεις που ανήκουν στο τρέχον τμήμα ή συνάρτηση, και τις καλεί ως τμήμα - αν υπάρχει επιστροφή με = τότε θα το δει ως λάθος με το νούμερο της επιστροφής, οπότε δεν βάζουμε σε αυτές τις συναρτήσεις εξυπηρέτησης γεγονότων το = τιμή...)
Γιατί υπάρχει ξεχωριστό γεγονός, ενώ όπως είδαμε πριν μας βόλευε και τα Click και Scroll; Η απάντηση είναι ότι αυτό το γεγονός είναι το σημαντικό, ενώ τα άλλα απλά βολεύουν ορισμένες φορές όπου η χρήση τους είναι για να αλλάζουμε κατάσταση σε άλλα στοιχεία, πριν γίνει η όποια "σημαντική" επιλογή.

Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 2000,1000,4000,3000
Με Λίστ1, "ShowAlways",Αληθές,"text",{Αθήνα
                                    Θεσσαλονίκη
                                    Πάτρα
                                    }
Με Λιστ1, "Listindex" ως Επιλεγμένο, "List" ως Λιστ1$()
Συνάρτηση Λιστ1.DblClick {
      Τύπωσε Επιλεγμένο, Λιστ1$(Επιλεγμένο), "Διπλό κλικ"
      Ανανέωση
}
Συνάρτηση Λιστ1.Click {
      Τύπωσε Επιλεγμένο, Λιστ1$(Επιλεγμένο)
      Ανανέωση
}
Συνάρτηση Λιστ1.Scroll {
      Τύπωσε Επιλεγμένο, Λιστ1$(Επιλεγμένο), "Ολίσθηση"
      Ανανέωση
}
Συνάρτηση Φόρμα1.Click {
      Επιλεγμένο=2
      Κάλεσε Τοπικά Λιστ1.DblClick()
}
Επιλεγμένο=1
Μέθοδος Φόρμα1,"Show", 1
Όρισε Φόρμα1 Τίποτα


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

Όρισε Φόρμα1 Φόρμα
Με Φόρμα1, "Title" Ως ο_Τίτλος_μου$
Επίπεδο Φόρμα1 {
      Διάστιχο 60
      Γραμματοσειρά "Arial Black"
      Παράθυρο 16, 8000,6000
      Οθόνη 1,0
      Δρομέας 0, Ύψος δια 2
      Αναφορά 2,"Γειά σου Κόσμε"
}
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 1000,1000,6000,4000
Με Λίστ1,"Text",{London
                                    Paris
                                    Athens
                                    Rome
                                    Tirana
                                    Nicosia
                                    Brussels
                                    Copenhagen
                                    Berlin
                                    Dublin
                                    Luxembourg
                                    }
Με Λίστ1, "transparent", Αληθές , "ListIndex" Ως Που
Με Λίστ1, "Find" Ως Βρες()
Με Λίστ1, "List" Ως Λίστα$()
Μέθοδος Φόρμα1, "Show"
Με Φόρμα1,"Sizable", Αληθές, "SizerWidth", 90
Συνάρτηση Λιστ1.Color {
      Διάβασε Νέο &rgb
            rgb=#FF7700
}
Συνάρτηση Λιστ1.DblClick {
            Διάβασε Τι
            Αν Δεξί$(Λίστα$(Τι),1)="✓" Τότε {
                  Λίστα$(Τι)=ΑριστερόΜέρος$(Λίστα$(Τι)+" "," ")
            } Αλλιώς {
                  Λίστα$(Τι)=ΑριστερόΜέρος$(Λίστα$(Τι)+" "," ")+" ✓"
            }
            Μέθοδος Λίστ1,"Refresh"
            ο_Τίτλος_μου$= Λίστα$(Τι)
}
Συνάρτηση Φόρμα1.click {
            Αν Που>=0 Τότε {
                  local K$=Λίστα$(Που), i
                  Μέθοδος Λίστ1,"Sort"
                  Που=Βρες(K$)
                  Επίπεδο {
                        Τύπωσε ">>", φορμα$
                        Ανανέωση
                  }
            } Αλλιώς Μέθοδος Λίστ1,"Sort"
}
Συνάρτηση Φόρμα1.Resize {
      Επίπεδο Φόρμα1 {
            Τύπος 16
            Οθόνη 1,0
            Δρομέας 0, Ύψος δια 2
            Αναφορά 2,"Γειά σου Κόσμε"
            Μέθοδος Λίστ1,"Refresh"
      }
}
Μέθοδος Φόρμα1, "Show", 1
Όρισε Φόρμα1 Τίποτα



Στο παράδειγμα παρακάτω χρησιμοποιούμε μια Κατάσταση και έχουμε ορίσει ότι θα έχει η λίστα 1000 στοιχεία. Κάθε στοιχείο μπορεί να υπάρχει ή όχι στην Κατάσταση (λίστα με κλειδί και τιμή). Αν δεν υπάρχει εμφανίζει κενή γραμμή. Με το Enter, ή με σπρώξιμο της γραμμής δεξιά, αλλάζει σε λίστα εισαγωγής και το ανάποδο, σε λίστα που προβάλει τα στοιχεία. Κάθε φορά που μετακινείται ο δρομέας της λίστας εμφανίζεται η τιμή (η γραμμή) στον τίτλο της φόρμας. Δείτε ότι η λίστα είναι σε κατάσταση διόρθωσης, τα πλήκτρα Home και End δουλεύουν για τη γραμμή, ενώ όταν γυρίσουμε σε προβολή για τη λίστα (με το End πάμε στο τελευταίο στοιχείο άμεσα). Η ιδιότητα HideCaret μπήκε πριν μερικές αναθεωρήσεις. Επειδή η ιδιότητα Edit αλλάζει την προβολή της Caret, με αληθές βγάζει επιλογή της γραμμής και βάζει την κάθετη γραμμή του δρομέα εισαγωγής, και στην αλλαγή σε ψευδές απλά αφαιρεί την κάθετη γραμμή, χρειάζεται να δώσουμε στην HideCaret τιμή Ψευδές, οπότε ανοίγει την επιλογή με χρωματισμό όλης της γραμμής.

Όρισε Φόρμα1 Φόρμα
Όρισε Λιστ1 Λίστα Φόρμα Φόρμα1
Κατάσταση Α=999:="Τέλος"
Προσθήκη Α, 0:="Πρώτο",3:="στο 3", 4:="στο 4"
Μ=Αληθές
Με Φόρμα1, "Title" ως Τιτλος$
Με Λιστ1, "Edit" ως Διόρθωση, "HideCaret" ως ΚρύψεΕπιλογή, "Listindex" ως Ποιο
Συνάρτηση Λιστ1.Scroll {
      Αν Υπάρχει(Α, Ποιο) Τότε {
             Τιτλος$=Μορφή$("{0::-4}:{1}",Ποιο, Εκφρ$(Α))
      } Αλλιώς Τιτλος$=Μορφή$("{0::-4}:",Ποιο)
}
Συνάρτηση Λιστ1.Click {
      Αν Υπάρχει(Α, Ποιο) Τότε {
             Τιτλος$=Μορφή$("{0::-4}:{1}",Ποιο, Εκφρ$(Α))
      } Αλλιώς Τιτλος$=Μορφή$("{0::-4}:",Ποιο)
}
Συνάρτηση Λιστ1.DblClick {
       Διόρθωση=Μ
       Αν Μ Αλλιώς ΚρύψεΕπιλογή=Μ
       Μ~

}
Συνάρτηση Λιστ1.ListCount {
      Διάβασε Νέο &πόσα
      πόσα=1000
}
Συνάρτηση Λιστ1.External {
      Διάβασε Νέο Που, &τι$
      Αν Υπάρχει(Α, Που) Τότε {
            τι$=Εκφρ$(Α)
      } Αλλιώς τι$=""
}
Συνάρτηση Λιστ1.ValidList {
       Διάβασε Νέο &περιεχ$, &θεσηΧ, &στοιχειο
      Αν Υπάρχει(Α, στοιχειο) Τότε {
            Επιστροφή Α, στοιχειο:=περιεχ$
      } Αλλιώς.Αν περιεχ$<>"" Τότε Προσθήκη Α, στοιχειο:=περιεχ$
   
}
Με Λιστ1, "External", Αληθές, "DisplayLines", 5
Μέθοδος Λίστ1, "move", 2000,1000,4000,3000
Μέθοδος Φόρμα1,"Show", 1
Όρισε Λιστ1 Τίποτα
Όρισε Φόρμα1 Τίποτα




Δείτε επίσης το πρόγραμμα - παράδειγμα εδώ  όπου συνδέουμε δυο λίστες, η μια δουλεύει με εξωτερικό πίνακα, και λειτουργούν ως εξής: Όταν μετακινούμε την επιλογή στη μια, μετακινείται και στην άλλη, είτε η μετακίνηση γίνει με τα βελάκια, είτε με το ροδελάκι, είτε με την μπάρα ολίσθησης (εμφανίζεται αυτόματα όταν πάμε το δείκτη του ποντικού πάνω από την περιοχή της). Για να το πετύχουμε αυτό χρειάζεται να παίρνουμε ένα γεγονός Move που δίνει την νέα πάνω γραμμή (από εκεί που ξεκινάει και εμφανίζει τις γραμμές η Λίστα). Επειδή μπορεί να μην συμβεί αυτό το γεγονός, δηλαδή να μην χρειαστεί να αλλάξει η πάνω γραμμή, χειριζόμαστε και άλλα γεγονότα όπως το Click και το Scroll. Ένα ακόμα πράγμα χρειαζόμαστε, να μπορούμε να επιλέγουμε στο δίπλα στοιχείο χωρίς να παίρνει εντολή για επανασχεδιασμό, επειδή θα το δώσουμε με την εντολή τοποθέτησης νέας πάνω γραμμής. Υπάρχει λοιπόν το ListIndex2 το οποίο μόνο διαβάζει, και κάνει νέα επιλογή στη λίστα "αθόρυβα". Στα στοιχεία είναι χρήσιμο να εκτελούμε διαδοχικές εντολές σε αυτά χωρίς να γίνεται άμεσα ανανέωση, για δυο λόγους. Ένας λόγος γιατί κάθε ανανέωση συχρονίζεται με την ανανέωση της φόρμας άρα μπαίνει καθυστέρηση, που μπορεί να φθάσει το μέγιστο του διαστήματος αυτόματης ανανέωσης, και ο δεύτερος γιατί θα δείχνουμε κάτι που δεν έχει ολοκληρωθεί, και θα προκαλεί γρήγορες εναλλαγές, σαν τρεμόπαιγμα (flickering), το οποίο δεν είναι καλαίσθητο.





Αναθεώρηση 23 (Έκδοση 8.9)

Διόρθωσα ένα πρόβλημα που μπορούσε να προκύψει, αν διορθώναμε κείμενο στη κονσόλα της Μ2000 ενώ είχαμε ανοικτή μια φόρμα χρήστη. Υπήρχε πρόβλημα με το μηχανισμό για να παίρνει ο διορθωτής το γεγονός από το ροδελάκι του ποντικιού. O μηχανισμός για να πάρει το γεγονός χρειάζεται επειδή δεν το δίνει η Visual Basic 6 στις φόρμες της. Ουσιαστικά οι φόρμες της VB6 είναι αντικείμενα πάνω στα αντικείμενα παραθύρων των Windows (παρόμοιος τρόπο δουλεύει και η Μ2000, όπου οι φόρμες χρήστη είναι αντικείμενα πάνω από τις φόρμες της VB6).
Ο μηχανισμός κάνει Hook (αγκιστρώνει) μια συνάρτηση που ελέγχει τα μηνύματα γεγονότων όπως παράγονται από το σύστημα των Windows. Όταν δεν το χρειαζόμαστε τότε γίνεται Unhook, δηλαδή βγαίνει εκτός. Για να κατανοήσει κανείς αυτό το αγκίστρωμα, αρκεί να σκεφτεί ότι κάθε παράθυρο δηλώνει μια διεύθυνση μιας συνάρτησης που εξυπηρετεί γεγονότα, την λεγόμενη και WindowProc (η διαδικασία παραθύρων). Για να γίνει subclassing, πρέπει να πάρουμε αυτή τη διεύθυνση και να την φυλάξουμε, και αυτό γίνεται γιατί γνωρίζουμε μια ιδιότητα των παραθύρων, το hWnd, ή window handler, τον χειριστή του παραθύρου, που είναι ένας αριθμός. Κάθε παράθυρο, ακόμα και στοιχείο στο παράθυρο που είναι αντικείμενο Window, έχει τον δικό του χειριστή, που ορίζεται από το σύστημα των Windows. Όπως όταν ανοίγουμε ένα αρχείο μας δίνει το σύστημα ένα χειριστή αρχείου (file handler) έτσι είναι και ο χειριστής παραθύρου.  Με αυτόν τον χειριστή βρίσκουμε πολλά πράγματα για το παράθυρο, και ένα από αυτά είναι η διεύθυνση της συνάρτησης (ή ρουτίνας αν θέλουμε να την πούμε και έτσι), που δέχεται τα μηνύματα από τα γεγονότα και οφείλει να τα αποδεσμεύσει, είτε τα ικοανοποιήσει είτε όχι, διαφορετικά το σύστημα βγάζει συμπέρασμα, μετά από κάποιο χρόνο, ότι η εφαρμογή έχει κρεμάσει! Όταν χρησιμοποιούνται χειριστές (αυτοί οι αριθμοί) σημαίνει ότι τα δεδομένα είναι εκτός διαδικασίας, ή process, δηλαδή ανήκουν κάπου αλλού. Πράγματι τα δεδομένα για τα παράθυρα ανήκουν στον Window Manager, στο πρόγραμμα που λειτουργεί τα παράθυρα και τα στοιχεία τους στο λειτουργικό. Υπάρχει περιορισμός για τα πόσα παράθυρα μπορούμε να ανοίξουμε. Μπορούμε να δούμε ένα πρόγραμμα πόσους handlers χρησιμοποιεί μια δεδομένη στιγμή από τον Windows Task Manager, στη καρτέλα Processes, αν επιλέξουμε να μας δείχνει την στήλη Handlers. H M2000 χρησιμοποιεί περίπου 240, το Notepad περίπου 78, ενώ ο explorer περνάει τους 1000. Βέβαια το νούμερο δεν μας δείχνει μόνο τους handlers του Window Manager, αλλά και όλους τους άλλους, για αντικείμενα των windows που δεν είναι απαραίτητα στοιχεία των παραθύρων.

Για να γίνει λοιπόν το subclassing πρέπει να ενημερώσουμε τον Window Manager ότι αλλάζει η ρουτίνα εξυπηρέτησης, αλλά προσοχή εδώ, η δική μας ρουτίνα πρέπει στο τέλος να καλεί την από πριν καθορισμένη! Όταν γίνεται Unhook τότε απλά ενημερώνουμε τον Windows Manager δίνοντας την καθορισμένη ως την μόνη ρουτίνα εξυπηρέτησης.

Παρακάτω είναι το πρόγραμμα που έβγαζε κόλλημα (hang), γιατί όταν ξεκίναγε ο διορθωτής στη κονσόλα (είχε γραφτεί πριν υπάρξουν φόρμες χρήστη στη Μ2000), με τρόπο κλείδωνε την φόρμα (ενώ δεν ήταν κλειδωμένη, μια σημαία (flag) εσωτερικά έκοβε την πρόσβαση στη φόρμα), με σκοπό να κάνει το στοιχείο "διορθωτής" να είναι το μόνο με το οποίο δουλεύουμε. Νήματα μπορούσαν να τρέξουν πίσω, καθώς επίσης μπορούσε το παράθυρο επιλογών (το βλέπουμε ως αναπτυσσόμενη λίστα επιλογών ή context menu), το οποίο όμως έχει ξεχωριστή ρουντίνα hook, για τη δική του μπάρα ολίσθησης). Όταν φτιάχτηκαν οι φόρμες χρήστη έπρεπε να βρεθεί ένας τρόπος, ώστε οποιοδήποτε στοιχείο πάνω στη φόρμα να παίρνει το γεγονός αλλαγής της ροδέλας του ποντικιού, χωρίς να χρειάζεται ξεχωριστή ρουτίνα hook. Το πρόβλημα με τις ρουτίνες αυτές είναι ότι απαιτούν σταθερή διεύθυνση μνήμης, πριν ακόμα εκτελεστεί το περιβάλλον της Μ2000, έτσι πώς θα ήταν δυνατόν να έχουμε οποιοδήποτε αριθμό φορμών και στοιχείων και να έχουμε μια Hook ευκολία; Το πρόβλημα λύθηκε με την ιδέα ότι η συνάρτηση αυτή θα δίνεται και θα παίρεται από το κάθε ενδιαφερόμενο στοιχείο. (και η φόρμα Ρυθμίσεις λειτουργεί έτσι, για όλα τα στοιχεία της). Όμως δεν είχε ξεκαθαριστεί το πώς θα γίνονταν στο διορθωτή κειμένου της κονσόλας (είναι διαφορετικό αντικείμενο, πάνω σε ένα κοινό αντικείμενο usercontrol της VB6, σε σχέση με το στοιχείο TextBox, ή Κείμενο), Τώρα λοιπόν ξεκαθαρίστηκε (Αφού επισημάνθηκε το πρόβλημα).




declare form1 form
declare inp1 TextBox form form1

method form1, "show"
show
document a$
\\ now open in console the editor
\\ when open move form1
\\ before revision 23 m2000 environment hang
\\ because edit.doc editor subclassing mouse enent
\\ we can't use subclassing in the mouse event while we leave console form
\\ can't work so now is fixed by unhooking subclassing when form deactivated.
edit.doc a$
print "ok"
declare form1 Nothing

Σάββατο, 29 Ιουλίου 2017

Αναθεώρηση 22 (Έκδοση 8.9)

Ανέβηκε μια νέα αναθεώρηση με προχωρημένες λειτουργίες για το στοιχείο ελέγχου Λίστα (ListBox)

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


Όρισε Φόρμα1 Φόρμα
Όρισε Λίστ1 Λίστα Φόρμα Φόρμα1
Όρισε Λίστ2 Λίστα Φόρμα Φόρμα1
Μέθοδος Λίστ1, "move", 2300,1000,2000,3000
Μέθοδος Λίστ2, "move", 4300,1000,4000,3000
Με Λίστ1, "ScrollTo" ως Ολισθ1, "ScrollFrom" ως Ολισθ1_τιμή, "DisplayLines", 5 ', "Transparent", Αληθές
Με Λίστ1, "listIndex2" ως Επιλ01, "listIndex" ως Επιλ1,"HideCaret", Αληθές ,  "ShowAlways", Αληθές
Με Λιστ2, "ScrollTo" ως Ολισθ2, "ScrollFrom" ως Ολισθ2_τιμή, "Edit",Αληθές,  "ShowAlways", Αληθές
Με Λίστ2, "listIndex2" ως Επιλ02, "listIndex" ως Επιλ2, "DisplayLines", 5
Με Λιστ1, "Title","Πεδία"
Με Λιστ2, "Title","Τιμές", "Center", Αληθές, "PanDouble", Αληθές
Με Λίστ1,"Text", {Όνομα
                                    Διεύθυνση1
                                    Διεύθυνση2
                                    Διεύθυνση3
                                    Πληροφορία1
                                    Πληροφορία2
                                    Πληροφορία3
                                    Πληροφορία4
                                    }
Πίνακας Βάση 0, α$(8)
α$(0)="Γιώργος"
Συνάρτηση Λιστ2.Listcount {
            Διάβασε Νέο &πόσα
            πόσα=8
}
Συνάρτηση Λιστ2.External {
      Διάβασε Νέο Που, &τι$
      τι$=α$(που)

}
Με Λίστ2, "External", Αληθές
Συνάρτηση Λιστ2.ValidList {
       Διάβασε Νέο &περιεχ$, &θεσηΧ, &στοιχειο
       Τύπωσε περιεχ$, θέσηΧ, στοιχείο : Ανανέωση
       α$(στοιχείο)=περιεχ$
}

Συνάρτηση Λιστ1.Color {
      Διάβασε Νέο &χρ
      Χρ=#FF3311
}
Συνάρτηση Λιστ2.Color {
      Διάβασε Νέο &χρ
      Χρ=#1133FF
}
Συνάρτηση Λιστ2.dblClick {
      Διαβασε που
      Τύπωσε "doule click", αριθμός, α$(που)
      Ανανέωση
}
Συνάρτηση Λιστ2.Click {
      Επιλ01=Επιλ2
      Επιλ2=Επιλ2
      Ολισθ1=Ολισθ2_τιμή
}
Συνάρτηση Λιστ1.Click {
      Επιλ02=Επιλ1
      Επιλ1=Επιλ1
      Ολισθ2=Ολισθ1_τιμή
}
Συνάρτηση Λιστ2.Scroll {
      Επιλ1=Επιλ2
      Ολισθ1=Ολισθ2_τιμή
}
Συνάρτηση Λιστ1.Scroll {
      Επιλ2=Επιλ1
      Ολισθ2=Ολισθ1_τιμή
}
Συνάρτηση Λιστ2.Move {
      Διάβασε Νέο πάνω1
      Επιλ01=Επιλ2
      Ολισθ1=πάνω1
}
Συνάρτηση Λιστ1.Move {
      Διάβασε Νέο πάνω1
      Επιλ02=Επιλ1
      Ολισθ2=πάνω1
}
Μέθοδος Φόρμα1, "Show", 1
Όρισε Φόρμα1 Τίποτα
Τύπωσε α$()

Παρασκευή, 28 Ιουλίου 2017

Αναθεώρηση 21 (Έκδοση 8.9)


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

Παράλληλα γράφτηκε και το τεύχος εγχειριδίου για το προγραμματισμό του στοιχείου Κείμενο, με τρία παραδείγματα. Δεν έχουν γραφτεί όλες οι ιδιότητες και όλες οι μέθοδοι του στοιχείου, αλλά θα προστεθούν αργότερα!

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

17.4 Κείμενο (EditBox)
Το στοιχείο Κείμενο είναι ο επεξεργαστής κειμένου. Δεν έχει δυνατότητα για ανάμεικτα διαφορετικού μεγέθους γράμματα. Όλα δηλαδή θα έχουν την ίδια γραμματοσειρά και μέγεθος. Μπορούμε να ορίσουμε λέξεις που θα χρωματίζονται (χρωματισμός κώδικα, έχουν δοθεί παραδείγματα στο Blog για χρωματισμό κώδικα Visual Basic και της Java)

Δυνατές λειτουργίες (οι2 και 3 έχουν διαμορφωθεί από την αναθεώρηση 21 έκφοση 8.9):

1. Λειτουργία διόρθωσης κειμένου πολλών γραμμών (εξ ορισμού αυτή είναι η λειτουργία του)
2. Λειτουργία  Εισαγωγής Κειμένου σε μια γραμμή
Μοιάζει με την εισαγωγή, αν και εδώ το κείμενο είναι στοιχεισμένο στην πάνω ακμή του πλαισίου. Για να γυρίσει σε αυτήν την λειτουργία το στοχείο θα πρέπει να επιλέξουμε την ιδιότητα UsedAsTextBox με τιμή Αληθής, με μια εντολή, αν υποθέσουμε ότι το στοιχείο λεγεται Κειμ1:
Με Κειμ1, "UsedAsTextBox ", Αληθής
(η εντολή Με Αντικείμενο  παίρνει σειρά ιδιοτήτων)
Οι διαφορές με το στοιχείο Εισαγωγή είναι ότι αυτό το στοιχείο έχει δυνατότητα για να συνδέσουμε σχετιζόμενη λίστα επιλογών (context menu), μπορούμε να κάνουμε όπου θέλουμε επικόλληση, αποκοπή, και αντιγραφή (έχει πολλαπλά Undo/Redo), αλλά δεν έχει γεγονός "ολοκλήρωσης", δηλαδή δεν έχει Click ή Enter, και δεν επίσης δεν έχει γεγονός για να ελέγχουμε τις αλλαγές πριν προβληθούν. Αν πατήσουμε το enter τότε αυτό προωθείται στη φόρμα και αυτή στέλνει ένα γεγονός Enter, στη φόρμα, χωρίς να λέει από που είναι. Ουσιαστικά το enter είναι χρήσιμο για να ξεκινήσει μια συνολική διεργασία ελέγχου των στοιχείων και κατόπιν να δοθούν όπου υπάρχει πρόβλημα μηνύματα, ή αν δεν υπάρχει να προχωρήσει στο επόμενο βήμα, πχ την καταχώρηση σε βάση δεδομένων ή την εκκίνηση κάποιας διεργασίας υπολογισμού.
Σε αυτήν την λειτουργία μπορούμε να ορίσουμε το μέγιστο μήκος χαρακτήρων με την ιδιότητα MaxCharLength.
3. Λειτουργία Εισαγωγής Αριθμού
Εδώ έχουμε δυο παραλλαγές, την εισαγωγή αριθμού με κινητή υποδιαστολή ή την εισαγωγή ακέραιου. Δεν γίνεται έλεγχος μεγέθους (ισχύει και εδώ το MaxCharLength), αλλά γίνεται έλεγχος αν υπάρχει αριθμός και αν ναι τότε γίνεται αλλαγή κατά την πληκτρολόγηση, κατά την εισαγωγή μέσω κώδικα,  κατά την εισαγωγή με επικόλληση. Ισχύει και εδώ ότι αν πατήσουμε Enter θα παραχθεί το Enter γεγονός στην φόρμα.
Αλλάζουμε "πεδία" με Tab και Shift Tab (προς τα πίσω) όπως κάνουμε με κάθε στοιχείο, και σε αυτά περιλαμβάνεται και η φόρμα (το στοιχείο στην ουσία που μετακινεί την φόρμα, έχει τον τίτλο και δέχεται τα Ctrl+F1 και το Ctrl+F4 για κλείσιμο).
Αν θέλουμε αριθμό βάζουμε στην ιδιότητα NumberOnly τιμή Αληθές, ή αν θέλουμε ακέραιο βάζουμε στην ιδιότητα NumberIntOnly τιμή Αληθές. Σε κάθε περίπτωση μπορούμε να διαβάσουμε το περιεχόμενο σαν κείμενο ή σαν αριθμό. Σαν κείμενο με την ιδιότητα "text" και σαν αριθμό με την ιδιότητα "value". Μάλιστα η "text" δέχεται και αριθμό, γιατί είναι εσωτερικά τύπου Variant.

4. Λειτουργία προβολής μόνο
Αυτή η λειτουργία ξεκινάει με κλήση μεθόδου. Στη μέθοδο γίνονται οι αναγκέες αλλαγές για να μπορεί το στοιχείο να επιλέγεται, να διαβάζει τα πλήκτρα αλλαγής σελίδας και βελάκια άνω και κάτω, και να δέχεται με το ποντίκι ολίσθηση ή και χρήση την κρυμμένης κάθετης μπάρας ολίσθησης.
Η μέθοδος είναι η  TextViewOnly και δίνεται με μια εντολή:
Μέθοδος Κειμ1, "TextViewOnly"
Μπορούμε να αλλάζουμε προγραμματιστικά το κείμενο με την ιδιότητα "text". Επίσης μπορούμε να έχουμε το φόντο διάφανο με την μέθοδο Transparent. Δείτε ένα παράδειγμα παρακάτω.


Ολίσθηση με κράτημα και σπρώξιμο γραμμών!
Αν το κείμενο έχει περισσότερες γραμμές από αυτές που φαίνονται τότε μπορούμε να σύρουμε γραμμές με πατημένο το αριστερό πλήκτρο του ποντικιού κια κατεύθυνση προς τα εκεί που θέλουμε να κινηθούν οι γραμμές, σαν να σπρώχνουμε τις γραμμές. Αν πάμε στην δεξιά πλευρά εμφανίζεται η μπάρα ολίσθησης. Αυτή δουλεύει ανάποδα, όταν την κατεβάζουμε τότε η γραμμές πάνε προς τα πάνω. Μπορούμε να χρησιμοποιήσουμε τα πλήκρα για την αλλαγή σελίδας PageUp και PageDownΗ αλλαγή σελίδας γίνεται με τρόπο ώστε να εμφανίζεται η τελευταία γραμμή της προηγούμενης σελίδας στη πρώτη γραμμή της επόμενης, ή αν πάμε προς τα πίσω να εμφανίζεται στη τελευταία γραμμή η πρώτη γραμμή της επόμενης σελίδας. Επιπλέον όταν γράφουμε η γραμμή όπου εισάγουμε μετακινείται στο κέντρο (αν είναι δυνατόν, αν υπάρχουν τόσες γραμμές πριν για να φθάσουμε στο μέσον του στοιχείου). Αυτό βοηθάει όταν γράφουμε κείμενα για να κοιτάμε σε ένα σταθερό ύψος.

Αυτόματη οριζόντια ολίσθηση!
Δεν υπάρχει οριζόντια μπάρα ολίσθησης, γιατί υπάρχει αυτόματη οριζόντια ολίσθηση. Επιπλέον με το F1 μπορούμε να αλλάζουμε το τρόπο εμφάνισης με ή χωρίς αναδίπλωση λέξης. Οπότε με ενεργή την αναδίπλωση λέξης δεν υπάρχει περίπτωση να έχουμε ολίσθηση οριζόντια. Όταν αλλάζουμε με το F1 ο δρομέας δεν χάνει τη θέση του, και γίνεται αυτόματα και ομαλά με διαδοχικές αλλαγές,  αν χρειάζεται, ολίσθηση από "με αναδίπλωση" σε "χωρίς αναδίπλωση".

Απουσία Flickering
Τα στοιχεία της Μ2000 δεν έχουν "αναλαμπές" ή flickering, όπως μερικά στοιχεία των Windows. Στο κώδικα της Μ2000 δεν γίνεται χρήση των στοιχείων φορμών των Windows, για πολλούς λόγους, όπως να έχουμε απλά στοιχεία, και ένας άλλος να έχουμε κοινά στοιχεία σε όλα τα λειτουργικά, αλλά υπάρχουν και άλλοι λόγοι που δεν θα αναφερθούν εδώ, και σχετίζονται με το προγραμματισμό του διερμηνευτή. Από τις φόρμες της Visual Basic 6, η Μ2000 χρησιμοποιεί την κενή φόρμα, και ένα στοιχείο User Control που και αυτό είναι ανάλογο της κενής φόρμας, εξαιρούνται το στοιχείο για το βίντεο και το στοιχείο για τις ιστοσελίδες, οι οποίες βγαίνουν στην κονσόλα και όχι σε φόρμες, δηλαδή δεν αποτελούν στοιχεία των φορμών χρήστη. Γενικά ο ρόλος των φορμών χρήστη είναι να φτιάχνει δικές του φόρμες διαλόγων για συλλογή στοιχείων, για ενημέρωση ή προβολή αποτελεσμάτων. Όταν θέλουμε βίντεο ή κινούμενες διαφάνειες (sprites) τότε χρησιμοποιούμε την κονσόλα (και πάνω από αυτήν τα 32 επίπεδα των sprites, ή πρόσθετων οθονών όπως η οθόνη της κονσόλας). Οι φόρμες της Μ2000 βγαίνουν πάνω από την κονσόλα και όπως φάνηκε στο προηγούμενο τεύχος μπορούμε να την κρύψουμε. Ένα πρόγραμμα που δείχνει την χρήση αυτή και τη χρήση του στοιχείου Κείμενο (TextBox) είναι εδώ Eίναι το M2000 Pad με δυνατότητα προβολής χρωματισμένου κώδικα Visual Basic 6.

Και αυτό το στοιχείο έχει δυνατότητα να εμφανίζει το φόντο, το περιεχόμενο της φόρμας πίσω από τα γράμματα, αν θέλουμε.

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

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

Τα πλήκτρα στο στοιχείο λειτουργούν όπως στο διορθωτή κώδικα, με την διαφορά ότι δεν υπάρχουν τα πλήκτρα Esc (για έξοδο από το διορθωτή) και το Shift +F12 για έξοδο χωρίς αλλαγές.;Άλλα πλήκτρα είναι αυτά της αναζήτησης πάνω και κάτω F2 και F3, ή με το Shift ανοίγει φόρμα διαλόγου και βάζουμε το προς αναζήτηση κείμενο (λέξη ή λέξεις). Το F4 αλλάζει σε μια λέξη παντού στο κείμενο τα γράμματα αν αλλάξουμε κάποια από πεζά σε κεφαλαία ή το ανάποδο. Το F5 κάνει αλλαγή λέξεων μαζικά με δυνατότητα αναίρεσης (ένα προς ένα). Τα F6, F7, F8, είναι οι σελιδοδείκτες, προγραμματίζουν αυτόματα παράγραφο και θέση δρομέα.Το F9 μετράει τις λέξεις (είναι πολύ γρήγορο,λειτουργεί αστραπιαία), και εμφανίζει σε μια γραμμή  με ξεχωριστό χρώμα το αποτέλεσμα (όπως και οι λειτουργίες των σελιδοδεικτών εμφανίζουν μηνύματα). Η γραμμή μηνυμάτων εξαφανίζεται όταν γράφουμε στο κείμενο, και η γραμμή αποδίδεται στο κείμενο.Το F10 εμφανίζει ή αποκρύπτει τους μη φανερούς χαρακτήρες όπως το διάστημα (εμφανίζεται ως άνω τελεία), την παράγραφο, το μη διαχωρίσιμο διάστημα (εμφανίζετια ως διάστημα) και το διάστημα αριθμών με κάτω κουτάκι (είναι σαν παύλα με άκρες προς τα πάνω). Το μη διαχωρίσιμο διάστημα (δηλαδή το μετράει ως χαρακτήρα και όχι ως διάστημα, είναι ο χαρακτήρες 160), μπαίνει με Ctrl Shift Space, ενώ το σταθερού πλάτους διάστημα αριθμών μπαίνει με Ctrl Alt Space (αυτά ισχύουν και στον διορθωτή τμημάτων και συναρτήσεων). Μπορούμε να βάζουμε όποιον Unicode χαρακτήρα θέλουμε (μέχρι το 65535) με Alt και τον αριθμό σε δεκαδικό σύστημα, ή το Alt το  + και το δεκαεξαδικό νούμερο. (το Alt το κρατάμε μέχρι το τελευταίο νούμερο. Ο επεξεργαστής κειμένου χειρίζεται και τους χαρακτήρες που πέφτουν πάνω σε άλλους χαρακτήρες. Πχ το Alt+301 είναι ο τόνος

Μπορούμε να κάνουμε επικόλληση και αντιγραφή, και μπορούμε να σύρουμε από άλλο πρόγραμμα, ή άλλο στοιχείο Κείμενο το κείμενο που θέλουμε. Υπάρχει επιλογή στη λίστα επιλογών που επιτρέπει  αν θέλουμε την χρήση σε επιλεγμένο κείμενο με κλικ να κάνουν μεταφορά (σύρσιμο) στο ίδιο ή άλλο στοιχείο Κείμενο, ή σε άλλο πρόγραμμα, και λειτουργεί το με το Shift η αντιγραφή ή αποκοπή κατά το σύρσιμο (φαίνεται από το σημάδι + στην αντιγραφή στο βελάκι του ποντικιού).

Στη στη βασική λειτουργία μπορούν να γίνουν και αυτά:
Μια "παραξενιά" του στοιχείου αυτού είναι ότι δεν παίρνει τον χαρακτήρα Tab ως χαρακτήρα Tab αλλά τον μετατρέπει σε διαστήματα. Επιπλέον τα Shift Tab και Tab δουλεύουν για μια ή πολλές γραμμές και μεταθέτουν τις γραμμές δεξιά ή αριστερά βάζοντας εσοχή. Αν έχουμε και άλλα στοιχεία ελέγχου στην φόρμα, τότε τα Τab και Shift Tab αλλάζουν την εστίαση σε επόμενο στοιχείο (δουλεύει κυκλικά), ενώ για να βάζουμε εσοχές πρέπει να πατάμε και το Ctrl με Tab ή με Shift Tab. Υπάρχουν μέθοδοι που βάζουν ή βγάζουν την εσοχή, για να καλούνται από μενού επιλογής εκτός του στοιχείου αυτού (ή από στοιχεία τύπου Πλήκτρο)

Μπορούμε να φορτώσουμε το στοιχείο με πολύ μεγάλο κείμενο, της τάξης των MBytes, και έχει δοκιμαστεί και με κείμενο, πρόγραμμα που χρωματίζεται σε Visual Basic 6, με 45000+ γραμμές. Ο χρωματισμός γίνεται "κατ΄απαίτηση" δηλαδή όταν εμφανίζονται γραμμές τότε εμφανίζονται χρωματισμένες ενώ δεν ήταν πριν τις καλέσουμε για εμφάνιση. Μπορούμε να κάνουμε αλλαγή μεγέθους και γίνεται αυτόματα νέος υπολογισμός για αναδίπλωση λέξης. Τα δεδομένα του χρωματισμού δεν συμμετέχουν στην διεργασία της αναδίπλωσης! Εϊναι συνδεδεμένα με την παράγραφο, και η εμφάνιση χρώματος γίνεται για οποιαδήπτε αναδίπλωση. Κάθε παράγραφος έχει εσωτερικά μια δομή γραμμών, όπως υπολογίζονται στην αναδίπλωση. Η αλλαγή μεγέθους του στοιχείου μπορεί να αλλάξει τον αριθμό γραμμών της κάθε παραγράφου (αλλά δεν αλλάζει τον χρωματισμό του αφού αποθηκεύονται χωριστά). Ο χρωματισμός αλλάζει καθώς πληκτρολογούμε σε μια παράγραφο. Με το F11 μπορούμε να εξαφανίζουμε ή να εμφανίζουμε τον χρωματισμό.

Και εδώ ισχύει το διπλό αντικείμενο. Ένα αντικείμενο στη φόρμα και ένα δεύτερο που παίρνει τα γεγονότα και καθοδηγεί το αντικείμενο στη φόρμα. Εδώ μάλιστα το κείμενο δεν βρίσκεται σε κανένα από αυτά τα δύο αντικείμενα αλλά σε ένα τρίτο τύπου Document ή Έγγραφο. Κάθε φορά που αλλάζουμε θέση στην κάθετη μπάρα ολίσθησης το αντικείμενο στη φόρμα ζητάει "εικόνα" που θα δείξει στην θέση, παρέχοντας το κομμάτι του φόντου του (και έτσι γίνεται να έχουμε διαφάνεια, επειδή δίνει το στοιχείο αντί για ένα μονόχρωμο φόντο, το κομμάτι της φόρμας που αντιστοιχεί πίσω ακριβώς από το στοιχείο). Σε αυτό το κομμάτι φόντου γράφει το αντικείμενο που παίρνει τα γεγονότα, αντλώντας στοιχεία για τη γραμμή από το αντικείμενο Έγγραφο.Όταν ολισθαίνουμε πολύ γρήγορα την μπάρα ολίσθησης, αυτή δεν ακούει στο ρυθμό μας αλλά στέλνει σε ένα χρονιστή το μήνυμα...ξεκίνα να μετράς για να γράψεις...Έτσι διαδοχικές γρήγορες αλλαγές της μπάρας ολίσθησης δεν απασχολούν το σύστημα! Όταν θα έρθει η ώρα να εμφανίσει τις γραμμές το στοχείο τότε θα δει την θέση της μπάρας και θα βρει την "πάνω γραμμή" και θα συνεχίσει με τις επόμενες. Την οριζόντια μετάθεση δεν την γνωρίζει το στοιχείο πάνω στην φόρμα. Είναι σχετική με μεταβλητές στο στοιχείο που οδηγεί το στοιχείο στη φόρμα. Και αυτή όμως έχει χρονιστή και για το λόγο αυτό γίνεται με βήματα.Γενικά τα στοιχεία της Μ2000 για τις φόρμες δουλεύουν σαν "ρολόγια", και έτσι έχουν καλή απόκριση, δεν έχουν αναλαμπές- flickering, και δεν επιβαρύνουν το σύστημα.
Εκεί που ζορίζεται το στοιχείο αυτό είναι όταν έχουμε πχ 45000 παραγράφους και περιορίζουμε πολύ το πλάτος (άρα παράγονται πολλές γραμμές ανά παράγραφο). Ακόμα και εκεί όμως είναι πιο γρήγορο από το NotePad των Windows. Λόγω των ρολογιών δεν θα δούμε αναλαμπές αλλά λιγότερα ενδιάμεσα βήματα.μέχρι το σημείο που θα αφήσουμε την αλλαγή μεγέθους φόρμας (που συνάμα μέσω του γεγονότος της φόρμας Resize θα κάνουμε και αλλαγή μεγέθους του στοιχείο Κείμενο, ίσως και άλλων).

Γεγονότα
Θα παρατηρήσετε εδώ ότι δεν έχουμε click ή enter. Συνήθως υπάρχει κάποιο άλλο στοιχείο που ξεκινάει τη διακασία επεξεργασίας της πληροφορίας του στοιχείου αυτού.

  • Inform    γραμμή_δρομέα,  θέση_δρομέα
  • PopUp  θέση_Χ, Θέση_Υ, Τιμή_Πλήκτρων_ποντικού, γραμμή_δρομέα
  • MarkNo  στην μετάβαση από επιλεγμένο σε μη επιλεγμένο κείμενο
  • MarkOut στην μετάβαση ή στην αλλαγή επιλεγμένου κειμένου
  • Word στην επιλογή λέξης μόνο.
  • About όταν πατάμε το Ctrl+F1 χωρίς να έχουμε επιλέξει λέξη
  • Help  επιλεγμένη_λέξη$ όταν πατάμε το Ctrl+F1 με επιλεγμένη λέξη

Ιδιότητες
  • Index   αριθμός όταν ανήκει σε πίνακα στοιχείων Κείμενο και όλα τα γεγονότα δίνουν επιπρόσθετα, ως πρώτο στοιχείο τον αριθμό Index για να αναγνωριστεί από την συνάρτηση "υποδοχής" γεγονότων.
  • Title γράφεται - ο τίτλος σε μια γραμμή πάνω από τις γραμμές κειμένου αλλά μέσα στο πλαίσιο του κειμένου.
  • Text όλο το κείμενο (γράφεται και διαβάζεται)
  • TextLines γυρίζει τον αριθμό γραμμών (όπως έχουν διαμοφωθεί από την αναδίπλωση, ή αν δεν έχουμε αναδίπλωση τότε συμπίπτει με τον αριθμό παραγράφων
  • TextParagraphs γυρίζει τον αριθμό παραγράφων
  • CharPosStart γυρίζει τη θέση του δρομέα σε όλο το κείμενο, δηλαδή πόσους χαρακτήρες έχει το κείμενο ακριβώς πίσω από τον δρομέα.
  • InsertText εισάγει κείμενο μετά το δρομέα
  • InsertText2 εισάγει κείμενο μετά το δρομέα, διατηρεί τη θέση του δρομέα.
  • InsertTextNoRender εισάγει κείμενο χωρίς να προκαλεί επανασχεδιασμό.
  • Length  το μήκος του κειμένου μαζί με τα Cr και Lf (χαρακτήρες 13 και 10).
  • Value  η αριθμητική τιμή (γράφεται και διαβάζεται)
  • SelStart γυρίζει τη θέση του δρομέα σε όλο το κείμενο, δηλαδή πόσους χαρακτήρες έχει το κείμενο ακριβώς πίσω από την επιλογή, ή αν δεν υπάρχει επιλογή, τότε δίνει ότι και το CharPosStart
  • SelText  το επιλεγμένο κείμενο (γράφεται και διαβάζεται)
  • SelLength  γράφεται και διαβάζεται το μήκος σε χαρακτήρες της επιλογής
  • SelLengthSilent  γράφεται χωρίς να φαίνεται άμεσα
  • Visible γράφεται και διαβάζεται, κάνει το στοιχείο ορατό ή αόρατο (αν δεν είναι ορατό η SetFocus θα βγάλει λάθος, ενώ η GetFocus θα εξαφανίσει το λάθος)
  • FontSize διαβάζει η γράφει το μέγεθος χαρακτήρων
  • Font  δίνει και παίρνει αντικείμενο γραμματοσειράς.
  • BackColor διαβάζει και γράφει το χρώμα φόντου
  • ForeColor διαβάζει και γράφει το χρώμα χαρακτήρων
  • ReplaceTitle  Δείχνει μηνύματα σε μια νέα πάνω γραμμή, αν υπάρχει τίτλος τότε η γραμμή δεν φεύγει, αλλιώς με τη πρώτη επανασχεδίαση φεύγει.
  • ShowAlways  Δείχνει πάντα άσπρο φόντο, ακόμα και αν χάσει την εστίαση
  • NumberOnly   Λειτουργία αριθμού κινητής υποδιαστολής
  • NumberIntOnly Λειτουργία αριθμού ακεραίου
  • UsedAsTextBox  Λειτουργία απλής γραμμής κειμένου
  • ScrollKeyUpDown βάζει ή βγάζει τη λειτουργία ολίσθησης με τα βελάκια, δηλαδή όταν αλλάζουμε γραμμή ο διορθωτής τίνει να φέρει την γραμμή στο μέσον, με ολίσθηση. Αυτό μπορούμε να το αναιρέσουμε.
  • Linespace διαβάζεται και γράφεται 
  • LineSpacingSilent γράφεται χωρίς να γίνει εμφάνιση
  • DisplayLines   μπορούμε να ορίσουμε πόσες γραμμές θα φαίνονται, και αυτόματα ρυθμίζεται το ύψος κάθε γραμμής.
  • LineHeight διαβάζεται σε Twips
  • Locked  με Αληθές κλειδώνει για αλλαγές από τον χρήστη
  • Enabled το Aληθές ισοδυναμεί με Lociked  Ψευδές, το ψευδές δεν αλλάζει το Locked, αλλά κάνει το δρομέα να μην αναβοσβήνει, όπως δηλαδή όταν χάνει την εστίαση το στοιχείο.
  • Textinform  διαβάζεται, αλλάζει όταν αλλάζει ο δρομέας, και πριν κληθεί το γεγονός Inform.
  • NoColor διαβάζεται και γράφεται, βάζει ή βγάζει το χρωματισμό. 
  • SelHtmlText  επιστρέφει την επιλογή ως Html (κωδικοποιεί το χρώμα)
  • tabwidth 
  • CommentSymbols  σε αυτό και τα επόμενα μέχρι το ColorCollection4 ρυθμίζουμε πώς θα χρωματίζει το κείμενο το στοιχείο. Η NoColor ρυθμίζει αν θα έχει ή όχι χρωματισμό το κείμενο.
  • ComSymbolsWidth
  • MultiLineComment1
  • LineComment1
  • LineComment2
  • ColorCollection1 οι λέξεις μπαίνουν με κεφαλαία γράμματα με διαχωριστικό | (κάθετη γραμμή)
  • ColorCollection2
  • ColorCollection3
  • ColorCollection4
  • ShadowMarks
  • AutoNumber βάζει αυτόματη αρίθμηση στις παραγράφους
  • Charpos η θέση του δρομέα στη τρέχουσα παράγραφο, για καλύτερα διαβάζουμε τη θέση  με την επόμενη ιδιότητα, γιατί μπορεί να μην έχει τεθεί ο δρομέας και απλά διαβάζουμε το 0 το οποίο δεν το ξεκαθαρίζει! Σε μια παράγραφο δυο γραμμάτων η θέση του δρομέα μπορεί να είναι 0, 1 ή 2 δηλαδή πριν το πρώτο γράμμα, αμέσως μετά το πρώτο και μετά το δεύτερο.
  • ParaSelStart υπολογίζει την θέση στη παράγραφο του δρομέα. Δίνει 0 αν δεν έχει τεθεί ο δρομέας, αλλιώς δίνει από 1 τη θέση του δρομέα. Στο πρώτο γράμμα δίνει 1 είτε είναι ο δρομέας πριν το γράμμα ή ακριβώς μετά.
  • Showparagraph αν είναι αληθές τότε δείχνει τους μη φανερούς χαρακτήρες
  • SelectionColor  το χρώμα φόντου της επιλογής, η μέθοδος ResetSelColors το επαναφέρει
  • SelectionTextColor το χρώμα κειμένου της επιλογής, όπως το προηγούμενο.
  • Top  η θέση Υ πάνω αριστερά του στοιχείου σε twips
  • Left η θέση Χ πάνω αριστερά του στοιχείου σε twips
(θα συμπληρωθεί αργότερα)

Μέθοδοι
  • Show επανασχεδιάζει το στοιχείο (με χρονική καθυστέρηση), χωρίς να κάνει υπολογισμό ξανά για τυχόν αναδιπλώσεις (δες το Render)
  • SetFocus  βάζουμε την εστίαση σε αυτό το στοιχείο (εφόσον είναι ορατό).
  • GetFocus  καλεί το SetFocus αλλά μπορεί να μην γίνεται, και περιορίζει το σφάλμα.
  • SetRowColumn Γραμμή, Στήλη, και προαιρετικά αν θα εμφανιστεί στο θεατό τμήμα του παραθύρου.
  • Move δέχεται δυο ορίσματα συν δυο προεραιτικά, τα δυο πρώτα είναι η θέση στη φόρμα, τα left και top, και τα άλλα δυο είναι το πλάτος και ύψος του στοιχείου (σε twips).
  • FontAttr δέχεται ένα όρισμα με το όνομα γραμματοσειράς, και προαιρετικά δυο ακόμα, το μέγεθος και αν θέλουμε να έχουμε φαρδιά γράμματα (bold) 
  • Colors ρυθμίζει τα χρώματα
  • ColorsReset γυρνάει τα χρώματα στα αρχικά 
  • ResetSelColors γυρνάει τα χρώματα επιλογής στα αρχικά
  • Transparent  Διάφανο φόντο
  • TextViewOnly  Λειτουργία προβολής κειμένου μόνο
  • PressKey Κωδικός_πληκτρολογίου, Θέση_ειδικών_πλήκτρων.
  • PopUpMenu τίτλος$, Χ, Υ  ανοίγει την εσωτερικική λίστα επιλογής
  • Mn1sub κάνει αποκοπή στο επιλεγμένο κείμενο (αυτή τη μέθοδο την  βάζουμε καλούμε από  ένα μενού επιλογών στη φόρμα)
  • MarkCut ίδιο με το mn1sub
  • Mn2sub κάνει αντιγραφή
  • MarkCopy ίδιο με το mn2sub
  • Mn3sub κάνει επικόλληση
  • Wordwrapsub κάνει εναλλαγή από αναδίπλωση σε χωρίς αναδίπλωση 
  • Rthissub ανοίγει το διάλογο για  αλλαγή λέξης παντού στο κείμενο, με undo.
  • Mscatsub αλλάζει μια λέξη όπου την βρει με διαφορετικά κεφαλαία - πεζά, κάποια γράμματα. (αυτό που κάνει το F4 στο διορθωτή)
  • Supsub αναζήτηση προς τα πάνω, βάσει του επιλεγμένου
  • Sdnsub αναζήτηση προς το κάτω, βάσει του επιλεγμένου
  • HelpmeSub προκαλεί το γεγονός Help
  • SearchUp λέξη_αναζήτησης$ και προαιρετικά αληθές αν ψάχνουμε οτιδήποτε και όχι μια λέξη.
  • SearchDown λέξη_αναζήτησης$ και προαιρετικά αληθές αν ψάχνουμε οτιδήποτε και όχι μια λέξη.
  • ReColor κάνει επαναχρωματισμό
  • Resize το εκτελούμε μετά από μια Move για να κάνει τις απαιτούμενες ενέργειες.
  • GetLCIDFromKeyboard συνάρτηση γυρίζει τον αροθμό "τοπικού" της γλώσσας του πληκτρολογίου. Καλούμε συνάρτηση έτσι:.   Μέθοδος Κειμ1, "GetLCIDFromKeyboard" ως Κ
  • WrapAll κάνει αναδίπλωση σε όλες τις παραγράφους 
  • Render  επανασχεδιάζει το στοιχείο
(θα συμπληρωθεί αργότερα)



Παράδειγμα 1




Σε αυτό το παράδειγμα έχουμε επιλέξει σε μια φόρμα, την Φόρμα1 να έχουμε ένα μόνο στοιχείο, το στοιχείο Κειμ1. Σε αυτό το στοιχείο θέλουμε να φαίνεται μια επικεφαλίδα που θα γράφει ότι είναι δήθεν το αρχείο alfa.txt, στοιχισμένο στα αριστερά. Δίπλα στον τίτλο, δηλαδή στην ίδια γραμμή μπορούμε να εμφανίζουμε πληροφορίες. Αν δεν δώσουμε το "Title" τότε οι πληροφορίες θα εμφανίζονται και στην επόμενη φορά που θα μετακινήσουμε το δορμέα θα εξαφανιστεί η γραμμή πληροφορίας. Το πρόγραμμα διαβάζει δυο γεγονότα, το MarkNo και το MarkOut. Το πρώτο συμβαίνει όταν από επιλεγμένο κείμενο πάμε σε μη επιλεγμένο. Το δεύτερο συμβαίνει κάθε φορά που αλλάζει το επιλεγμένο κείμενο, ακόμα και την πρώτη φορά που από μηδενικό γίνετια κάποιο. Στα δυο αυτά γεγονότα ενημερώνουμε τον τίτλο του στοιχείου, και παράλληλα γράφουμε και στην κονσόλα πίσω από την φόρμα. Η ιδιότητα ShowAlways απλά κάνει το στοιχείο να φαίνεται με λευκό φόντο συνέχεια, ακόμα και αν χάσει την εστίαση (πραγματικά υπάρχει ένα στοιχείο ακόμα, ο τίτλος της φόρμας, και μπορεί και αυτό να πάρει εστίαση, απλά δεν φαίνεται ότι παίρνει)
Όταν κάνουμε κλικ στη φόρμα τότε αλλάζει μια μεταβλητή κατάσταση (από αληθές σε ψευδές, και την επόμενη το ανάποδο), και αυτό γίνεται με το Ζ=όχι Ζ που γράφεται για μεταβλητές για πιο σύντομα έτσι Z~, και στην αλλαγή κλειδώνουμε ή ξεκλειδώνουμε το στοιχείο. Όταν είναι κλειδωμένο το στοιχείο δεν μπορούμε να το διορθώσουμε.





Όρισε Φόρμα1 Φόρμα
Όρισε Κειμ1 Κείμενο Φόρμα Φόρμα1
Μέθοδος Κειμ1, "Move", 1000,1200,6000,3000
Με Κειμ1, "ShowAlways", Αληθές, "SelText" ως ΕπιλΚειμ$ , "Title", "alfa.txt", "ReplaceTitle",""

Συνάρτηση Κειμ1.MarkNo {
      Τύπωσε "Όχι"
      Με Κειμ1, "ReplaceTitleHold","Όχι"
      Ανανέωση
}
Συνάρτηση Κειμ1.MarkOut {
      Τύπωσε "Ναι", ΕπιλΚειμ$
      Με Κειμ1, "ReplaceTitleHold","Ναί"
      Ανανέωση
}
Ζ=Ψευδές
Συνάρτηση Φόρμα1.Click {
      Με Κειμ1,"Locked", Ζ
      Ζ~
}
Μέθοδος Φόρμα1, "Show",1
Όρισε Κειμ1 Τίποτα
Όρισε Φόρμα1 Τίποτα

Παράδειγμα 2


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

Αριστερά από κάθε Κείμενο βάζουμε μια ετικέτα. Οι ετικέτες γράφονται στο φόντο, στη φόρμα. Δηλαδή δεν αποτελούν κάποιο στοιχείο. Θα μπορούσαμε να είχαμε άλλα στοιχεία Κείμενο με λειτουργία προβολής μόνο και με διαφάνεια, αλλά αυτό στην περίπτωση που θα θέλαμε να αλλάζαμε το περιεχόμενό τους, σε κάποια αλλαγή κατάσταση. Εδώ δεν μας ενδιαφέρει να αλλάξουμε τις ετικέτες. Επιπλέον μας ενδιαφέρει οι τελευταίες δυο γραμμές να αλλάζουν, για να τις χρησιμοποιήσουμε ως οθόνη κατάστασης (κάτι σαν status line, αλλά εδώ εχουμε περισσότερες από μια γραμμές). Χρησιμοποιούμε την δυνατότητα να ορίζουμε χωριστή οθόνη ακόμα και σε φόρμα χρήστη, με την εντολή Οθόνη, ώστε το κάτω μέρος να ολισθαίνει μόνο, και η επόμενη εντολή οθόνη σε αυτό το επίπεδο (δείτε ότι καλούμε την εντολή Επίπεδο με το όνομα της φόρμας) θα καθαρίσει το κάτω μέρος όπως έχουμε ορίσει. Πρέπει να λέμε τι χρώμα θέλουμε να καθαρίσει, αλλιώς βάζει το χρώμα της κοσνόλας!
Έχουμε ρυθμίσει στο Click και στο Enter της φόρμας να αυξάνεται κατά ένα η τιμή στο Κειμ1 που ορίσαμε ως αριθμό κινητής υποδιαστολής. Όποτε στα Κειμ1, Κειμ2 και Κειμ3 πατήσουμε το Enter, θα κληθεί το Φόρμα1.Enter και αυτό θα κάνει την αλλαγή τιμής!
Αν πατήσουμε το Ctrl+F1 μέσα στα Κειμ1, Κειμ2 και Κειμ3 θα κληθούν ξεχωριστά γεγονότα. Δείτε όμως εδώ πώς κατευθύνουμε αυτά τα γεγονότα στην συνάρτηση που εξυπηρετεί το Ctrl+F1 της φόρμας (γεγονός About).
Δείτε λίγο τι κάνουμε στην εντολή Επίπεδο Φόρμα1 {} με την εντολή Παράθυρο καθορίζουμε το μέγεθος χαρακτήρων και δίνουμε και ένα επιθυμητό μέγεθος σε πλάτος και ύψος. Αυτή η εντολή θα κόψει αν χρειαστεί από το ύψος για να έρθουν οι γραμμές χαρακτήρων χωρίς περίσσευμα, πχ μισής γραμμής.
Μπορείτε να πάτε στην μεθεπόμενη παράγραφο (παρακάτω υπάρχουν πληροφορίες για τη λειτουργία της Μ2000 και τα Επίπεδα)
Ο τρόπος εμφάνισης στην Τύπωσε μπορεί να αλλάξει (από το 0 έως το 9) και αυτό έχει να κάνει με το πώς γράφει, αναλογικά ή μη αναλογικά, και πώς στοιχίζει γράμματα και αριθμούς. Ο τρόπος 4 είναι η αναλογική γραφή. Η Τύπωσε είναι μια πολύπλοκη εντολή, και μπορεί κανείς να διαβάσει την βοήθεια για αυτήν ή να δει παραδείγματα. Επειδή επιφέρει αλλαγές που σχετίζονται με τις επόμενες Τύπωσε, η Μ2000 κρατάει για κάθε επίπεδο χωριστή κατάσταση, που περιλαμβάνει πολλές παραμέτρους, όπως για παράδειγμα τη θέση του δρομέα γραφικών, του δρομέα χαρακτήρων, τα χρώματα φόντου και πένας και άλλα. Μέχρι και για 100 φόρμες χρήστη μπορεί να κρατήσει στοιχεία επιπέδου. Κρατάει για το περιθώριο (Επίπεδο πίσω από την Κονσόλα), για την Κονσόλα, για 32 επίπεδα πάνω από την κονσόλα αλλά εντός του περιθωρίου (η κονσόλα και τα 32 επίπεδα -αυτά τα τελευαία γίνονται και κινούμενα αντικείμενα) ανήκουν στο περιθώριο, τη βασική φόρμα της Μ2000, και όλες οι φόρμες χρήστη βρίσκονται πάνω από αυτό, ακόμα και αν η βασική φόρμα είναι ελαχιστοποιημένη. Υπάρχει άλλο ένα επίπεδο, το χαρτί του εκτυπωτή, και μια φόρμα που λέγεται Επιφάνεια, και βρίσκεται κάτω από την βασική φόρμα, και μέσω αυτής ρυθμίζουμε την διαφάνεια, και το τρόπο που λειτουργεί αυτή, για την βασική φόρμα. Με την χρήση της επιφάνειας μπορούμε να δώσουμε σχήμα στην κονσόλα και να φύγουμε από το τετράπλευρο!

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

Όρισε Φόρμα1 Φόρμα
Όρισε Κειμ1 Κείμενο Φόρμα Φόρμα1
Όρισε Κειμ2 Κείμενο Φόρμα Φόρμα1
Όρισε Κειμ3 Κείμενο Φόρμα Φόρμα1
θεσηΧ=4000
Μέθοδος Κειμ1, "Move", θεσηΧ,1200,5000,400
Μέθοδος Κειμ2, "Move", θεσηΧ,1800,5000,400
Μέθοδος Κειμ3, "Move", θεσηΧ,2400,5000,400
νγ$={
}
Με Κειμ1, "ShowAlways", Αληθές, "NumberOnly",Αληθές, "Value" ως Τιμ1
Με Κειμ2, "ShowAlways", Αληθές, "NumberIntOnly",Αληθές, "Value" ως Τιμ2
Με Κειμ3, "ShowAlways", Αληθές, "UsedAsTextBox", Αληθές,"Text" ως Τιμ3$
Τιμ1=93.112
Τιμ2=1456
Τιμ3$="Μια γραμμή μόνο"
Συνάρτηση Κειμ1.About {
      Κάλεσε Τοπικά Φόρμα1.About()
}
Συνάρτηση Κειμ2.About {
      Κάλεσε Τοπικά Φόρμα1.About()
}
Συνάρτηση Κειμ3.About {
      Κάλεσε Τοπικά Φόρμα1.About()
}
Συνάρτηση Φόρμα1.About {
      Επίπεδο Φόρμα1 {
            Οθόνη #606060
            Τύπωσε $(Τρόπος),"Κάνε κλικ εδώ ή πάτα Enter"
      }
}
Συνάρτηση Φόρμα1.Enter {
      Κάλεσε Τοπικά Φόρμα1.Click()
}
Συνάρτηση Φόρμα1.Click {
      Επίπεδο Φόρμα1 {
            Τιμ1=Τιμ1+1 \\ δεν δουλεύει το Τιμ1++ γιατί είναι αντικείμενο και όχι μεταβλητή
            Οθόνη #606060
            Τύπωσε Τιμ1, Τιμ2, " Ctrl+F1"
            Τύπωσε Πάνω $(9), Τιμ3$
            Ανανέωση
            Μέθοδος Κειμ1, "Show"
      }
}
Τρόπος=4
Επίπεδο Φόρμα1 {
      Γραμματοσειρά "Arial Black"
      Παράθυρο 16, 10000,4500
      Πένα 15
      Οθόνη #202020
      Οθόνη #606060, Ύψος-2
      Θέση θεσηΧ, 1200+400
      Επιγραφή "Ετικέτα ", Γραμματοσειρά$, Τύπος, 0, 1
      Θέση θεσηΧ, 1800+400
      Επιγραφή "Άλλη ετικέτα ", Γραμματοσειρά$, Τύπος, 0, 1
      Θέση θεσηΧ, 2400+400
      Επιγραφή "Και άλλη ετικέτα ", Γραμματοσειρά$, Τύπος, 0, 1
      Πένα 13
      Τύπωσε $(Τρόπος),"Κάνε κλικ εδώ ή πάτα Enter"
}
Μέθοδος Φόρμα1, "Show",1
Όρισε Κειμ1 Τίποτα
Όρισε Φόρμα1 Τίποτα



Παράδειγμα 3

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


Όρισε Φόρμα1 Φόρμα
Επίπεδο Φόρμα1 { Οθόνη 7
   Θέση χ.σημεία/2, υ.σημεία/2
   Πένα 14 { Κύκλος Γέμισμα 14, 100, 0.5}
   Πλ=χ.σημεία
}
Όρισε Κειμ1 Κείμενο Φόρμα Φόρμα1
Όρισε Εισ1 Εισαγωγή Φόρμα Φόρμα1
Μέθοδος Κειμ1, "move",1000,1000,Πλ-2000,2000
Μέθοδος Εισ1, "move",1000,3600,Πλ-2000,600
Με Φόρμα1, "Title" ως Τιτλ1$
Με Εισ1, "VarText" ως Εισ1$
Εισ1$="Γράψε εδώ ότι θες..."
Με Κειμ1, "Text",{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
}
Μέθοδος Κειμ1,"TextViewOnly"
Μέθοδος Κειμ1, "Transparent"
Μέθοδος Κειμ1, "Colors", 15, 15
Μέθοδος Εισ1, "Transparent"
Μέθοδος Εισ1, "Colors", 15,15
μ=10 : σ=1
Επίπεδο Φόρμα1 {
      Νήμα {
            Οθόνη 7
            Πένα 0 { Κύκλος Γέμισμα 0, μ*100, 0.5}
            μ+=σ
            Αν μ>=40 Τότε σ=-1
            Αν μ<2 Τότε σ=1
            Μέθοδος Φόρμα1, "RefreshAll"
      } ως μμ κάθε 30
}
Συνάρτηση Εισ1.Enter {
      Τιτλ1$=Εισ1$
      Εισ1$=""
}
Μέθοδος Φόρμα1, "Show", 1
Νήματα Σβήσε
Όρισε Φόρμα1 Τίποτα





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