Παρασκευή, 4 Αυγούστου 2017

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

17.6 Λίστα.Εισαγωγής (Combo)
Το στοιχείο Λίστα.Εισαγωγής έχει πάνω στη φόρμα ένα στοιχείο Εισαγωγή (textbox) και εμφανίζει με το κάτω βελάκι ή με κλικ με το ποντίκι ένα στοιχειο Λίστα (listbox), σε ξεχωριστό παράθυρο (φαίνεται σαν αναπτυσσόμενη λίστα), λέγεται αναδιπλούμενη λίστα, και εξαφανίζεται όταν αλλάξει η εστίαση σε άλλο στοιχείο στη φόρμα. Η θέση του ξεχωριστού παράθυρου μπορεί να αλλάξει ανάλογα με το που βρίσκεται το στοιχείο σε σχέση με την οθόνη του υπολογιστή. Αν είναι χαμηλά θα βγει πάνω από το στοιχείο Εισαγωγή.  Στο στοιχείο Εισαγωγή θα υπάρχει ένας τίτλος (ιδιότητα "Label") και δίπλα ένα βελάκι σαν τρίγωνο με την βάση από πάνω. Όταν εισάγουμε κείμενο τότε αυτό φαίνεται αμέσως μετά το βελάκι. Στη διαφοροποίηση σε μενού δεν έχουμε κείμενο δεξιά από το βελάκι.


Χρήσεις της Λίστας Εισαγωγής
  • Μενού επιλογών, με διάφορα στοιχεία στη λίστα, χωρίς τη χρήση του πεδίου επιλογής για εμφάνιση επιλογής. Τα στοιχεία της λίστας μπορεί να είναι ομάδες στοιχείων με φερόμενη κουκίδα δεξιά, όπου μια κουκίδα είναι συνέχεια επιλεγμένη, μπορεί να είναι απλά στοιχεία με κουκίδα δεξιά (όπως το στοιχείο Επιλογή ή Checkbox), ή απλά στοιχεία (όπως πλήκτρο ή button), ή μια διαχωριστική γραμμή. Τα στοιχεία μπορεί να είναι ενεργά ή όχι.
  • Αναπτυσσόμενη λίστα για επιλογή στο πεδίο εισαγωγής μόνο από τη λίστα
  • Πεδίο εισαγωγής, με αυτόματη συμπλήρωση βάσει λίστας, με δυνατότητα συμπλήρωσης

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

Γεγονότα
  • About
  • MenuChecked item
  • DblClick item
  • Move item
  • Scroll item
  • Click item
  • OpenMenu
  • PickOther item
  • AutoCompleteDone word$
Ιδιότητες
UseOnlyTheList
AutoComplete
NoCaseSensitive
Index
ListText
Label μόνο για να αλλάξουμε τιμή
menuEnabled()  πέρνει στοιχείο στις παρενθέσεις και βάζουμε αληθές ή ψευδές
id(item) δίνει αλφαριθμητικό με αναγνωριστκό για μενού.
List(item) δίνει και παίρνει αλφαριθμητικό
Text δίνει και παίρνει το κείμενο που εμφανίζεται στην Εισαγωγή
locked
ListRadioPrivate() παίρνει μια τιμή Αληθής ή Ψευδής
ListSelected() διαβάζει και δίνει τιμή Αληθής ή Ψευδής
ListChecked() διαβάζει και δίνει τιμή Αληθής ή Ψευδής
ListMenu()
ListRadio()
ListSep()
(συνεχίζεται)
Μέθοδοι
Move
FontAttr
additem

MenuItem
(συνεχίζεται)

Παράδειγμα με αυτόματη συμπλήρωση και πρόσθεση στοιχείων
Σε αυτό το παράδειγμα ότι γράφουμε και βάζουμε στη λίστα θα είναι σε κεφαλαία γράμματα. Όταν επιλέγουμε κάτι στη λίστα με απλό κλικ, ή με βελάκια, ή με ολίσθηση ή με επιλογή πρώτου γράμματος, παράγονται γεγονότα Click(), Scroll(), PickOther() τα οποία τροφοδοτούν ένα στοχείο Εισαγωγή, το Εισ1. Το ίδιο γίνεται όταν γράφουμε τα πρώτα γράμματα στο πεδίο εισαγωγής της Λίστας Εισαγωγής και αυτόματα συμπληρώνεται, καθώς τότε παράγεται το γεγονός AutoCompleteDone().
Η ιδιότητα ListText έχει μια διαφοροποίηση σε σχέση με το τι κάνει όταν εκχωρούμε τιμή και το τι κάνει όταν διαβάζουμε τιμή. Στην εκχώρηση βάζει ένα αλφαριθμητικό με παραγράφους ως την νέα λίστα εισαγωγής. Στην ανάγνωση δίνει ή κενό αλφαριθμητικό αν δεν έχουμε επιλέξει κάτι στη λίστα, ή το επιλεγμένο στη λίστα. Έτσι διαβάζουμε τη λίστα! Θα μπορούσαμε να τη διαβάσουμε ως Λίστα$(Επιλ_λίστας) (επειδή έχουμε ορίσει το Επιλ_λίστας να είναι η ιδιότητα ListIndex, και το Λίστα$() να είναι η ιδιότητα List. Η ιδιότητα list έχει μια παράμετρο και έτσι φτιάχνουμε ένα πίνακα (ουσιαστικά φαίνεται σαν πίνακας, αλλά είναι αντικείμενο με μια παράμετρο που επιστρέφει τιμή, ή δέχεται τιμή, δηλαδή μπορούμε να αλλάξουμε κάποιο στοιχείο). 

Επειδή ανοίγουμε το παράθυρο σαν modal (δηλαδή περιμένει για να κλείσει), και επειδή δεν μπορούμε να πάμε την εστίαση σε ένα στοιχείο πριν η φόρμα γίνει ορατή, εκτελούμε ένα νήμα μιας χρήσης με την Μετά, όπου σε 2/10 του δευτερολέπτου στέλνουμε την εντολή για να κινηθεί η εστίαση στο στοιχείο Εισ1, αφού θα έχει ανοίξει η φόρμα..

Πώς δουλεύει η αυτόματη συμπλήρωση:
Καθώς πληκτρολογούμε γράμματα εμφανίζεται η λέξη που βρίσκει το στοιχείο στην λίστα. Όμως παρόλο που φαίνονται τα γράμματα που δεν έχουμε πληκτρολογήσει, αμέσως μετά το δρομεά, αυτά δεν υπάρχουν σε αυτό που μόλις έχουμε πληκτρολογήσει. Έτσι συνεχίζοντας να πληκτρολογούμε γίνεται νέα εύρεση και αν δεν βρεθεί βλέπουμε το συμπλήρωμα να εξαφανίζεται. Ομοίως αν πάμε στο τέλος της λέξης που έχει βρεθεί και ξεκινήσουμε να σβήνουμε γράμματα, τα γράμματα μετά το δρομέα δεξιά δεν φαίνεται να σβήνονται όσο ακόμα συμπληρώνονται αυτόματα, ή μπορεί να αλλάξουν αν για τα γράμματα που όντως υπάρχουν βρεθεί άλλο συμπλήρωμα. Σε κάθε περίπτωση αναζήτησης παράγεται ένα γεγονός AutoCompleteDone.

Πώς δουλεύει η επιλογή στη λίστα με πλήκτρο:
Όταν έχουμε ανοίξει τη λίστα, με κάτω βελάκι ή με το ποντίκι, μπορούμε να πατήσουμε το πρώτο γράμμα σε αυτό που μας ενδιαφέρει, και αν υπάρχει η επιλογή στη λίστα, που έχει αυτό το γράμμα στη πρώτη θέση, θα μεταφερθεί στο πρώτο που θα βρεθεί, μετγά από το σημείο που βρίσκεται η τωρινή επιλογή, ή απο την αρχή αν είμαστε στο τέλος της λίστας, ή δεν υπάρχει άλλο μέχρι το τέλος αυτής . Αν το ξαναπατήσουμε θα πάει στο επόμενο που θα βρεθεί. Κάθε φορά που κάνουμε αναζήτηση με γράμμα παράγεται ένα γεγονός PickOther. Αν πατήσουμε enter ή κάνουμε click στο επιλεγμένο ή σύρουμε δεξιά, θα παραχθεί το DblClick. Η επιλογή με γράμμα λειτουργεί σε κάθε διαμόρφωση, και όχι ειδικά στην αυτόματη συμπλήρωση.


Δοκιμάστηκε σε Windows 10 64bit (σε Virtual Box). O Edge δεν πέτυχε με την πρώτη να αντιγράψει σωστά το  παρακάτω. Υπάρχει πρόβλημα με το nbsp που κανονικά υπάρχει στα ΔΕΛΤΑ ΓΑΜΜΑ ΒΗΤΑ για να φαίνεται η εσοχή..


Όρισε Φόρμα1 Φόρμα
Όρισε ΛιστΕισ1 Λίστα.Εισαγωγής Φόρμα Φόρμα1
Όρισε Εισ1 Εισαγωγή Φόρμα Φόρμα1
Με Φόρμα1,"Title" ως Τίτλος$
Με ΛιστΕισ1,"Edit", Αληθές,"UseOnlyTheList", Ψευδές,"autocomplete", Αληθές, "ListIndex" ως Επιλ_λίστας, "ShowAlways", Αληθές
Με ΛιστΕισ1,"Label","ΛιστΕισ1", "ListText" ως Στοιχεία$, "list" ως Λίστα$(), "text" ως ΛιστΕισ1$
Στοιχεία$={ΑΛΦΑ
            ΔΕΛΤΑ
            ΓΑΜΜΑ
            ΒΗΤΑ
            }
Με ΛιστΕισ1,"Find" ως Βρες()
Μέθοδος ΛιστΕισ1,"Sort"
ΛιστΕισ1$=Λίστα$(Βρες("ΓΑΜ*"))

Μέθοδος ΛιστΕισ1,"Move", 1000,1000,6000,600
Μέθοδος Εισ1, "Move", 1000,2900,6000,600


Με Εισ1,  "text" ως Εισ1Κείμενο$ , "ShowAlways", Αληθές
Συνάρτηση ΛιστΕισ1.about {
      Περί "Βοήθεια ΛιστΕισ1", "Διάλεξε ή γράψε τα πρώτα γράμματα, μπορείς να προσθέσεις νέο στη λίστα"
}
Συνάρτηση ΛιστΕισ1.AutoCompleteDone {
      Εισ1Κείμενο$=Στοιχεία$
}
Συνάρτηση ΛιστΕισ1.PickOther {
      Εισ1Κείμενο$=Στοιχεία$
}
Συνάρτηση ΛιστΕισ1.dblclick {
      ΛιστΕισ1$=Κεφ$(ΛιστΕισ1$)
      Εισ1Κείμενο$=ΛιστΕισ1$
      Τίτλος$=ΛιστΕισ1$
      Αν Βρες(Τίτλος$)= -1 Τότε {
                  Μέθοδος ΛιστΕισ1,"additem", Τίτλος$
                  Μέθοδος ΛιστΕισ1,"Sort"
                  Επιλ_λίστας=Βρες(Τίτλος$)
      }
}
Συνάρτηση ΛιστΕισ1.click {
      Εισ1Κείμενο$=Στοιχεία$
}
Συνάρτηση ΛιστΕισ1.scroll {
      Εισ1Κείμενο$=Στοιχεία$
}
Μετά 200 {Μέθοδος Εισ1,"GetFocus"}
Μέθοδος Φόρμα1, "show", 1
Περί ""
Όρισε Εισ1 Τίποτα
Όρισε ΛιστΕισ1 Τίποτα
Όρισε Φόρμα1 Τίποτα





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


Παράδειγμα με επιλογή από τη λίστα




Όρισε Φόρμα1 Φόρμα
Όρισε ΛιστΕισ1 Λίστα.Εισαγωγής Φόρμα Φόρμα1
Όρισε εισ1 Εισαγωγή Φόρμα Φόρμα1
Με Φόρμα1,"Title" ως Τίτλος$
Με ΛιστΕισ1,"UseOnlyTheList", Αληθές, "ListIndex" ως Επιλ_λίστας
Με ΛιστΕισ1,"Label","ΛιστΕισ1", "ListText" ως Στοιχεία$, "list" ως Λίστα$(), "text" ως ΛιστΕισ1$
Στοιχεία$={ΑΛΦΑ
            ΔΕΛΤΑ
            ΓΑΜΜΑ
            ΒΗΤΑ
            }
Με ΛιστΕισ1,"Find" ως Βρες()
Μέθοδος ΛιστΕισ1,"Sort"
ΛιστΕισ1$=Λίστα$(Βρες("ΓΑΜ*"))

Μέθοδος ΛιστΕισ1,"Move", 1000,1000,6000,600
Μέθοδος Εισ1, "Move", 1000,2900,6000,600

Με Εισ1,  "text" ως Εισ1Κείμενο$ , "ShowAlways", Αληθές
Συνάρτηση ΛιστΕισ1.about {
      Περί "Βοήθεια ΛιστΕισ1", "Διάλεξε ή γράψε τα πρώτα γράμματα, μπορείς να προσθέσεις νέο στη λίστα"
}
Συνάρτηση ΛιστΕισ1.PickOther {
      Εισ1Κείμενο$=Στοιχεία$
}
Συνάρτηση ΛιστΕισ1.dblclick {
      Εισ1Κείμενο$=ΛιστΕισ1$
      Τίτλος$=ΛιστΕισ1$
}
Συνάρτηση ΛιστΕισ1.click {
      Εισ1Κείμενο$=Στοιχεία$
}
Συνάρτηση ΛιστΕισ1.scroll {
      Εισ1Κείμενο$=Στοιχεία$
}
Μετά 200 {Μέθοδος Εισ1,"GetFocus"}
Μέθοδος Φόρμα1, "show", 1
Περί ""
Όρισε Εισ1 Τίποτα
Όρισε ΛιστΕισ1 Τίποτα
Όρισε Φόρμα1 Τίποτα