Εμφάνιση αναρτήσεων με ετικέτα Visual Basic 6. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα Visual Basic 6. Εμφάνιση όλων των αναρτήσεων

Παρασκευή 16 Οκτωβρίου 2015

Αναθεώρηση 65. Έκδοση 8.

Σήμερα έγιναν μαζέματα..μερεμέτια δηλαδή. Πέρασε το περιβάλλον της γλώσσας από σειρά τεστ με παλιά προγράμματα από την έκδοση 5.6 (2003).



Κάπου στο τέλος του βίντεο τρέχω δυο προγράμματα που χρησιμοποιούν νήματα, μέσα από την Vb6 (δεν υπήρχαν στην παλιά έκδοση). Αν προσέξετε σε κάποια φάση η Vb6 κρασάρει. Πολλές φορές τα καταφέρνει να μην κρασάρει. Το περιβάλλον όμως της Μ2000, το πρόγραμμα m2000.exe δεν κρασσάρει (σε παλαιότερες εκδόσεις και σε σπασμένα 7 είχε παρατηρηθεί ότι ορισμένες φορές δεν τερματίζει, αλλά έχει καιρό να δείξει τέτοια συμπεριφορά...)
Αν κάποιος φίλος της Μ2000 την κατέβασε και την δοκιμάζει ας γράψει κάποιο σχόλιο εδώ.

Δευτέρα 17 Νοεμβρίου 2014

Η επέκταση της Quick Sort

Quick Sort extended
ή ελληνικά Μέθοδος ταξινόμησης Quick Sort με μια παραλλαγή δική μου!

Δημοσιεύτηκε εδώ: http://www.vbforums.com/showthread.php?781043-VB6-Dual-Pivot-QuickSort

Η ταξινόμηση τύπου Quick Sort είναι πολύ γρήγορη αλλά έχει μερικά μελανά σημεία. Μπορεί να γίνει πολύ χρονοβόρα αν υπάρχουν ορισμένες συνθήκες. Όπως αν έχουμε εναλλαγή 1 και 0 σε έναν πίνακα, ή αν έχουμε για μεγάλη έκταση μια αντιγραφή από το ίδιο στοιχείο (σταθερή τιμή).

Η πρότασή μου περιλαμβάνει μια προσθήκη στο κώδικα της ταξινόμησης Quick Sort, όπου κάποιες φορές την κάνει πιο γρήγορη. Σε κάθε περίπτωση το πρόβλημα των εναλλαγών 1 και 0 καθώς και των σταθερών τιμών το ξεπερνάει σε ελάχιστο χρόνο.

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

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

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

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

αν παραστήσουμε τα όμοια με 1 και θεωρήσουμε αυτή την λίστα
11111101111001001
τότε  θα πάρει το σύστημα την μεσαία τιμή (εδώ 1) θα δει ότι είναι όμοια
και θα την παρατήσει! Θα ξεκινήσει από την αρχή+1 και θα κοιτάξει που σταματούν τα όμοια! θα βρει το 0 και θα το αλλάξει..
01111111111111001
οπότε το 0 είναι σε σωστή θέση και συνεχίζει την κανονική quick sort με μεσαία τιμή το 1 στη θέση 7.
Ας το δούμε αναλύτικά:
ελέχγει από το 17 (το τέλος) αν έχει τιμή μεγαλύτερη από το 1, δεν έχει και πάει για αλλαγή (τζούφια) και αλλάζει τους δείκτες 8 και 16.
τώρα ελέγχει αν στο 8 υπάρχει μικρότερη τιμή...δεν υπάρχει
πάμε για το 16 αν υπάρχει μεγαλύτερη τιμή...δεν υπάρχει...και αλλάζει τιμές
01111110111111011 και έχει δείκτες 9 και 15
στο 9 δεν βρίσκει μικρότερη τιμή...στο δεκαπέντε δεν βρίσκει μεγαλύτερη
κάνει αλλαγή
01111110011111111 και έχει δείκτες 10 και 14
τώρα κάνει τζούφιες αλλαγές ...και αλλάζει δείκτες 11 και 13, 12 και 12 και 13 και 11...
τώρα βγαίνουμε από την επανάληψη και πάμε σε δυο κλήσεις τις ίδιας ρουτίνας (αναδρομική διαδικασία), όπου οι λίστες είναι
1 εως 11 και 13 εως 17 (το 12 είναι στην θέση του...)
01111110011 και 111111
η δεύτερη λίστα με τη προσθήκη που έχω βάλει με μια εξέταση ότι δεν υπάρχει άλλη τιμή από 1 τερματίζει (δεν κάνει καθόλου αλλαγές).
Η πρώτη λίστα δίνει μεσαίο  1 στην θέση 6 είναι διαφορετικός από το στοιχείο στη θέση 0 οπότε πάμε σε κανονική εκτέλεση της quicksort με δείκτες 1 και 11
βρίσκει ότι στην 1 έχει μικρότερη τιμη και αυξάνει το δείκτη σε 2
τώρα κοιτάει στο 11 δεν βρίσκει μεγαλύτερη τιμή και πάει σε τζούφια αλλαγή...και δείκτες 3 και 10...ομοίως και πάμε σε 4 και 9..εδώ δεν έχουμ τζούφια αλλαγή:
01101110111  και δείκτες 5 και 8 πάλι αλλαγή
01100111111 και 6 και 7...τζούφια αλλαγή και 7 και 6 (7>6 βγαίνουμε από την επανάληψη).
πάμε πάλι σε δυο λίστες
την 1 εως 6 και την 7 εως 11
011001 και 11111 η δεύτερη με την προσθήκη κάνει απλά έναν έλεγχο και τερματίζει χωρίς καθόλους αλλαγές.
η δεύτερη  πέρνει μεσαίο το 3 δηλαδή το 1 και φτιάχνει δείκτες 1 και 6
στο 1 έχει μικρότερο και το αφήνει πάμε σε 2 και 6 και κάνουμε τζούφια αλλαγή...και πάμε σε 3 και 5...όπου
010011 και πάμε στα 4 και 4 το 4 γίνεται 5 (αφου το 0<1) και δεν γίνεται
καμία αλλαγή και βγαίνουμε σε δυο λίστες 1 - 4 και 5-6
0100 και 11 η δεύτερη λιστα είναι η περίπτωση που εξετάζει η επέκταση που έχω βάλει και βγαίνει αμέσως από την ρουτίνα.
τώρα βρίσκει το μεσαίο το 2 και παίρνει το 1 και φτιάχνει τους δείκτες 1 και 4
ο δείκτης 1 γίνεται 2 και κάνει την πρώτη αλλαγή μεταξύ 2 και 4
0001 και αλλάζει τους δείκτες σε 3 και 3...και κάνει μια ζούφια αλλαγή και 4 και 2 οι δείκτες
βγάζει μόνο μια λίστα την 00 (το τελευταίο 0 και το 1 τα θεωρεί στη θέση τους ο αλγόριθμος και είναι) και καλεί πάλι την ρουτίναι, η οποία βάση της προσθήκης την τερματίζει αμέσως..

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

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

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


Public Sub NaiveQuickSortExtended(Arr() As Long, ByVal LB As Long, ByVal UB As Long)
Dim M1 As Long, M2 As Long
Dim Piv As Long, Tmp As Long '<- adjust types here, when switching to something different than Long
     If UB - LB = 1 Then
     M1 = LB
      If Arr(M1) > Arr(UB) Then Tmp = Arr(M1): Arr(M1) = Arr(UB): Arr(UB) = Tmp
      Exit Sub
     Else
       M1 = (LB + UB) \ 2
             If Arr(M1) = Arr(LB) Then
                M2 = UB - 1
                M1 = LB
                Do
                    M1 = M1 + 1
                    If M1 > M2 Then
                        If Arr(UB) < Arr(LB) Then Tmp = Arr(LB): Arr(LB) = Arr(UB): Arr(UB) = Tmp
                        Exit Sub
                    End If
                Loop Until Arr(M1) <> Arr(LB)
                Piv = Arr(M1)
                If M1 > LB Then If Arr(LB) > Piv Then Arr(M1) = Arr(LB): Arr(LB) = Piv: Piv = Arr(M1)
            Else
                Piv = Arr(M1)
                M1 = LB
                Do While (Arr(M1) < Piv): M1 = M1 + 1: Loop
            End If
    End If
    M2 = UB
    Do
      Do While (Arr(M2) > Piv): M2 = M2 - 1: Loop
      If M1 <= M2 Then
        Tmp = Arr(M1): Arr(M1) = Arr(M2): Arr(M2) = Tmp 'swap
        M1 = M1 + 1
        M2 = M2 - 1
      End If
      If M1 > M2 Then Exit Do
      Do While (Arr(M1) < Piv): M1 = M1 + 1: Loop
    Loop
    If LB < M2 Then NaiveQuickSortExtended Arr, LB, M2
    If M1 < UB Then NaiveQuickSortExtended Arr, M1, UB
End Sub








Σάββατο 18 Οκτωβρίου 2014

Nice TextBoxes

Επιτέλους μετά από προσπάθεια μερικών ημερών κατάφερα να φτιάξω μια συλλογή στοιχείων ελέγχου, τα οποία μπορούν να χρησιμοποιηθούν στην Visual Basic 6.

Δύο πράγματα τα κάνουν ξεχωριστά. Ένα είναι ότι δεν απαιτούν βιβλιοθήκες και δεν αλλάζουν ανάλογα με το λειτουργικό (όπως όταν χρησιμοποιούμε τα στάνταρ στοιχεία ελέγχου των Windows). Το δεύτερο είναι η αλλαγή σχεδίασης, όπου όλα τα στοιχεία είναι ένα βασικό  και μερικές κλάσεις που το τροποποιούν παρέχοντάς μας ιδιότητες και γεγονότα για να τα χειριστούμε.
Πέρα από αυτά επιπλέον σχεδιαστικά καλούδια είναι η δυνατότητα χρήσης Unicode γραμματοσειρών χωρίς όμως δυνατότητα γραφής από δεξιά προς αριστερά. Μπορούμε όμως να εμφανίσουμε κυριλλικό αλφάβητο με ευρωπαϊκό και ελληνικό. Επίσης το υπόστρωμα, το στοιχείο δηλαδή που πράγματι εμφανίζεται, το glist, έχει την δυνατότητα να χειρίζεται την απόσταση των στοιχείων του, ή αλλιώς το line spacing. Είναι βασικό αυτό για να φαίνονται περισσότερο όμορφα τα στοιχεία, και τα κάνει ξεχωριστά. Τα αντίστοιχα της Microsoft...δεν έχουν απόσταση γραμμής, αντί αυτού ορισμένα έχουν ύψος γραμμής αλλά αυτό δεν είναι το ίδιο, η απόσταση γραμμής εδώ είναι το άνω και κάτω περιθώριο κάθε γραμμής -  TextBlock Class .NET Framework 4.5

Αποκορύφωμα των κλάσεων είναι η TextViewer κλάση που διαχειρίζεται ένα στοιχείο glist (αυτό χωρίς χρήση κλάσης είναι ένα στοιχείο που μοιάζει με το listbox), και με την χρήση μια κλάσης MyDOC (αυτή κρατάει κείμενο με παραγράφους σε μια διπλή συνδεδεμένη λίστα), προβάλει και δίνει για επεξεργασία κείμενο. Παράλληλα λειτουργούν πλήκτρα όπως Ctl X, Ctrl C & Ctrl V για αποκοπή, αντιγραφή και επικόλληση, αλλά και τα Ctrl A, επιλογή όλων, shift Ctrl A, καμία επιλογή, Ctrl Z αναίρεση (Undo), και Ctrl Y αναίρεση αναίρεσης (Redo) - μάλιστα υποστηρίζει πολλαπλά undo/redo. Επίσης δουλεύει το drag and drop,  ή ελληνικά οι ενέργειες σύρε και άφησε.

Η συλλογή των στοιχείων περιλαμβάνει διαμορφώσεις του glist ως button όπου η ενεργοποίηση γίνεται με διπλό πάτημα ή με σύρσιμο δεξιά, το checkbox όπου μια κουκκίδα αριστερά δηλώνει την  θέση διακόπτη (ανοικτός - κλειστός), το infobox που δηλώνει απλά μια ένδειξη αλλά μπορεί να αλλάξει σε εισαγωγή κειμένου για κάποια ρύθμιση. Άλλες διαμορφώσεις είναι το spin box όπου δέχεται αριθμητική τιμή και η οποία αλλάζει η με τη μπάρα ολίσθησης και τα βελάκια του πληκτρολογίου, ή αν θέλουμε με απευθείας εγγραφή τιμής. Στο παράδειγμα φαίνεται μια λίστα που τροφοδοτεί τιμές το spin box. Τέλος ένα επίσης ωραίο στοιχείο είναι το combobox όπου δυο λίστες glist συνδέονται, η μία ως ένα textbox μιας γραμμής με την προσθήκη ενός χειριστή αριστερά ο οποίος ανοίγει μια δεύτερη λίστα, μια λίστα τιμών. Μπορούμε να γράψουμε στο πρώτο textbox και αυτόματα θα εμφανίζεται το υπόλοιπο της λέξης από όποια λέξη βρεθεί στη δεύτερη λίστα. Αυτό λέγεται αυτόματη συμπλήρωση.

Όλα τα στοιχεία ελέγχου μπορούμε να τα χειριστούμε μόνο με πληκτρολόγιο (εκτός του drag & drop που απαιτεί ποντίκι εξ ορισμού). Έχει δοκιμαστεί το παράδειγμα σε Linux και Wine. Αν και στην έκδοση που έχω το Wine ενώ δίνει ελληνικά δεν αφήνει να περάσουν γράμματα με τόνο απευθείας στις φόρμες (πιστεύω σε νεότερη έκδοση του Wine, θα το έχουν λύσει το θέμα).


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


Το στοιχεί ελέγχου change wrapping αλλάζει την αναδίπλωση γραμμής, και το Show Paragraph δείχνει ή κρύβει το σημάδι παραγράφου (φαίνεται στην εικόνα). Οι μπάρες ολίσθησης στις λίστες (και στο TextViewer) φαίνονται όταν πάμε στην άκρη το ποντίκι ή όταν κάνουμε ολίσθηση με σπρώξιμο - με πατημένο το αριστερό πλήκτρο κουνάμε το ποντίκι και μετακινούμε τη λίστα, με αυξανόμενη ταχύτητα ανάλογα με την κίνηση που κάνουμε - και αυτό δεν υπάρχει στα στάνταρ στοιχεία ελέγχου).



Εδώ υπάρχει ο κώδικας (δείτε στο τέλος την τελική έκδοση) Δημοσιευμένος Κώδικας


2022 Στο περιβάλλον της Μ2000, τα στοιχεία ελέγχου έχουν επεκταθεί σε δυνατότητες. Έχει μπει και η RTL (right to left) γραφή προσαρμοσμένη να λειτουργεί και τμηματικά, δηλαδή να έχουμε κώδικα της Μ2000 σε LTR με αλφαριθμητικά σε RTL, σε συνδυασμό με πληροφορίες χρώματος (το αλφαριθμητικό έχει διαφορετικό χρώμα, οπότε εκεί εφαρμόζεται χωριστά η RTL γραφή).
Υπάρχει μια παραλλαγή (παλαιότερη αυτή της Μ2000) όπου μπορούν να επαναπροσδιοριστούν οι χαρακτήρες για ασιατικές γλώσσες. Ίσως μπει και στη Μ2000.

Τετάρτη 24 Σεπτεμβρίου 2014

Νέα στοιχεία ελέγχου - για φόρμες της VB6



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

Στην εικόνα παραπάνω είναι ένα στοιχείο ελέγχου σε διάφορες μορφές. Η πιο κοπιαστική μορφή είναι αυτή του επεξεργαστή κειμένου. Εδώ έχουμε έναν επεξεργαστή κειμένου χωρίς μίξη γραμματοσειρών και μεγεθών/τύπου χαρακτήρων, αν και μπορούμε να αλλάξουμε οποτεδήποτε αυτά για όλα μαζί. Αυτό που προσφέρει είναι ότι χρησιμοποιεί εμφάνιση UNICODE χαρακτήρων, αλλάζει την απόσταση γραμμών, αλλάζει όποτε θέλουμε την αναδίπλωση λέξεων, μπορούμε να αποκόψουμε ή αντιγράψουμε προς το πρόχειρο ή να επικολλήσουμε από το πρόχειρο, μπορούμε να μεταφέρουμε σε άλλο ίδιο ή ακόμα και στο Word το κείμενο με "σύρε και απέθεσε" ενέργεια (Drag & Drop). Υπάρχει μπάρα οριζόντιας ολίσθησης που εμφανίζεται όταν πάμε στην δεξιά πλευρά και όταν μετακινήσουμε τις γραμμές πάνω ή κάτω με ώθηση κρατώντας πατημένο το αριστερό πλήκτρο του ποντικού. Μπορεί να χειριστεί τεράστιο κείμενο και σε μια φόρμα που αλλάζει μέγεθος μπορεί να αλλάξει την αναδίπλωση λέξεων άμεσα χωρίς καθυστέρηση. Υποστηρίζει απλή αναίρεση (αν μεταφέρουμε τον κέρσορα και δεν έχουμε πατήσει κάποιο πλήκτρο τότε ισχύει η αναίρεση της προηγούμενης ενέργειας με ctrl z). Δεν μπορούμε να αναιρέσουμε την προσθήκη πάνω από μια παράγραφο (αυτό θέλει περισσότερο προγραμματισμό). Αντί αυτού μπορούμε να μαρκάρουμε το κείμενο που θέλουμε να αφαιρέσουμε και να το κάνουμε και άμεσα μπορούμε να το επαναφέρουμε...

Επιπλέον υπάρχουν στοιχεία ελέγχου όπως, το Check Me, ή ελληνικά το Επίλεξέ Με όπου η επιλογή ή η μη επιλογή εμφανίζεται ως κουκκίδα τετράγωνη. Στην επιλογή του στοιχείου έχουμε αλλαγή χρωματισμού, στην εικόνα φαίνεται πράσινο. Με το πλήκτρο "διάστημα" μπορούμε να εναλλάσσουμε την τιμή του (την εμφάνιση ή απόκρυψη της κουκκίδας), και κάθε αλλαγή δίνει ένα "γεγονός" στο πρόγραμμα για να "εξυπηρετηθεί". (event service routine, event programming). 

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

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

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

Τέλος υπάρχει ένας συνδυασμός δυο στοιχείων ελέγχου που δίνει το Combobox, όπου μπορούμε να γράψουμε με αυτόματη συμπλήρωση από μια λίστα τιμών (εδώ  λέξεων πόλεων/μερών). Με τα άνω και κάτω βελάκια ανοίγουμε την λίστα, όπως και με πάτημα και τράβηγμα του πρώτου στοιχείου ελέγχου. Μπορούμε να επιλέξουμε από τη λίστα με Enter ή αν θέλουμε να τροποποιήσουμε την επιλογή στο κύριο στοιχείο χωρίς να κλείσουμε την λίστα. Η λίστα φεύγει αν πατήσουμε TAB για να κινηθούμε στο επόμενο στοιχείο ή SHIFT TAB στο προηγούμενο, ή απλά αν επιλέξουμε άλλο στοιχείο (ακόμα και με επιλογή από το ποντίκι του πρώτου στοιχείου πάλι κλείνει η λίστα, ουσιαστικά δεν κλείνει αν πληκτρολογούμε κάτι στο πρώτο στοιχείο ενώ είναι ανοικτή, με τα βελάκια άνω και κάτω πάμε στη λίστα και με τα δεξιά και αριστερά στην διόρθωση της επιλογής)

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

Τα παραπάνω καλούδια είναι γραμμένα με VB6, και το πρόγραμμα επίδειξης τρέχει σε XP, 7, Linoux με WINE. Ο κώδικας είναι ανοικτός και βρίσκεται εδώ:
http://www.vbforums.com/showthread.php?776741-Nice-Textboxes-version2







Παρασκευή 22 Αυγούστου 2014