Τρίτη 22 Μαρτίου 2016

Αναθεώρηση 194 ListBox

Σε αυτή την αναθεώρηση έκανα αρκετή δουλειά. Έπρεπε να προσαρμόσω το Listbox που έχω φτιάξει εδώ και καιρό και παίζει στις προκαθορισμένες φόρμες ως κλάση της VB 6 να μπορεί να γίνει κλάση GuiListBox για να μπαίνει στα παράθυρα με δυναμικό τρόπο. Επέκτεινα και την δυνατότητα ανάγνωσης και αλλαγής ιδιοτήτων αντικειμένων, να δουλεύουν με δείκτες (όχι αυτών της Μ2000 αλλά αυτών που σχετίζονται με COM αντικείμενα, το GUI της Μ2000 έχει ενσωματωμένα τέτοια αντικείμενα). Παράδειγμα με αυτή την επέκταση υπάρχει εδώ, στο πρόγραμμα που εμφανίζει το ListBox.

Το ListBox δεν κάτι απλό όπως φαίνεται ένα απλό listbox. Π.χ. αντί να χειρίζεται τη δική του λίστα στοιχείων μπορεί να παίρνει στοιχεία από εξωτερική λίστα. Επίσης μπορεί να καταργήσει την μπάρα που επιλέγει το στοιχείο της λίστας και να δείχνει χρώμα διαφορετικό και ταυτόχρονα να έχει διαφάνεια με το φόντο! Η διαμόρφωση του listbox σε μενού, με radio buttons, checkboxes και άλλα θα γίνει σε ξεχωριστό MenuList, σε λίγες μέρες (το δεξί μενού στον επεξεργαστή κειμένου βγάζει ένα τέτοιο μενού, αλλά εδώ θέλει προγραμματισμό για να ενταχθεί στο κώδικα της Μ2000)

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

Βάζουμε κείμενο τριών γραμμών το οποίο πιάνει τρία στοιχεία στη λίστα. Το List$() είναι το καινούργιο στη Μ2000, είναι ιδιότητα με δείκτη. Εμφανίζεται ως πίνακας, γιατί έτσι φαίνεται, αλλά στον χειρισμό διαβάζει ο διερμηνευτής ένα flag που του λέει ότι είναι ιδιότητα, και πράγματι υπάρχει αυτή η ιδιότητα, σε ένα αντικείμενο κρυμμένο στο πίνακα! Οπότε παίρνει το νούμερο, σαν να ήταν συνάρτηση και δίνει ή παίρνει το στοιχείο που ζητάμε ή δίνουμε, στο ή από το αντικείμενο. Ο πίνακας θα σβηστεί στο τέλος του τρέχοντος τμήματος. Απ΄ όλα όσα φτιάξαμε, μόνο τη φόρμα (Παράθυρο) σβήνουμε, γιατί με αυτό το τρόπο κάνει "Unload" (το ίδιο κάνει αν πατήσουμε Esc)
Αντί να έχουμε μια επανάληψη για να περιμένουμε να κλείσει το παράθυρο, περιμένουμε να πατηθεί ένα πλήκτρο (αν πάρει την εστίαση η κονσόλα, θα πάρει και το πληκτρολόγιο). Όσο έχουμε το παράθυρο ενεργό, το πληκτρολόγιο πηγαίνει στα στοιχεία του παραθύρου.



Declare Simple Form
Declare ListBox1 Listbox Form Simple
Declare TextBox1 Textbox Form Simple
Declare Button1 Button Form Simple
Declare Button2 Button Form Simple
Declare Button3 Button Form Simple

Method ListBox1, "move", 1000,1000,3000,3000
Method TextBox1, "move", 5000,1000,3000,600
Method Button1, "move", 5000,1800,3000,600
Method Button2, "move", 5000,2600,3000,600
Method Button3, "move", 5000,3400,3000,600


\\ we can adjust the lines using height and a divisor
\\ here we use 5
With Button1,"Caption", "Delete"
With Button2,"Caption", "Insert"
With Button3,"Caption", "Change"
With TextBox1, "Text" As TextBox1.Text$
With ListBox1, "DisplayLines", 5, "ListCount" As ListCount, "ShowAlways", True
With ListBox1, "ListIndex" As ListIndex, "List" As List$(), "Text", {FirstLine
                                          SecondLine
                                          ThirdLine
                                          }
Function Listbox1.Click {
        With TextBox1, "Text", List$(Listindex)
}
Function Listbox1.DblClick {
            Print List$(Listindex)
}
Function Listbox1.Scroll {
        With TextBox1, "Text", List$(Listindex)
}
Function TextBox1.Enter {
      If Trim$(TextBox1.Text$)="" Then Exit
      Method Listbox1, "Add", TextBox1.Text$
      ListIndex=Listcount-1
      TextBox1.Text$=""   
}
Function Button1.Click {
      X=Listindex
      If X>=0 Then Method Listbox1, "Delete", Listindex
      If X>0 Then {
            Listindex=X-1
      } Else.If Listcount>0 Then {
            Listindex=0
      }
}
Function Button2.Click {
      If Trim$(TextBox1.Text$)=""  Then Exit
      If Listindex>=0 Then {
            Method Listbox1, "Insert", TextBox1.Text$
            TextBox1.Text$=""
      } Else.If ListCount=0 Then {
            Method Listbox1, "Add", TextBox1.Text$
            ListIndex=0
            TextBox1.Text$=""
      }
}
Function Button3.Click {
      If Listindex>=0 Then {
            List$( ListIndex)=TextBox1.Text$
            TextBox1.Text$=""
      }
}
Method Simple,"Show"
A$=Key$
\\ Unload the Window
Declare Simple Nothing






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

(όλα τα στοιχεία ελέγχου έχουν το ίδιο βασικό στοιχείο από κάτω, το GList4)


Παρακάτω είναι το EditBox. Με Ν=4 φτιάχνονται 4 παράθυρα με ένα EditBox το καθένα, όπου τα μισά χρωματίζουν κώδικα σε java και τα άλλα μισά κώδικα σε VB6.
Δοκιμάστε τα Ctrl+Tab και το Ctrl+F4. Επίσης δοκιμάστε το αναδιπλούμενο μενού και ενεργοποιήστε το Drag (drop έχει ενεργό εξ ορισμού). Με αντιγραφή στο πρόχειρο ο χρωματισμένος κώδικας πηγαίνει στο πρόχειρο ως Html κώδικας. Δουλεύουν τα Ctrl+X,Ctrl+C,Ctrl+V, Ctrl+Z, Ctrl+A, Ctrl+Y

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

Για να έχουμε ένα μήνυμα από τα textbox και από τις τέσσερις φόρμες κάνουμε την "πατέντα", να το δηλώσουμε με το ίδιο όνομα! Αλλά αναφορά κρατάμε σε ένα πίνακα με κλάση ενός στοιχείου, μεταφέρουμε το αντικείμενο με την Swap.

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

Το twipsx είναι το πλάτος.σημείου σε twips, δηλαδή κάθε ένα twipsx  είναι ένα pixel.


N=4
Declare Form1(N) Form
Class TextClass {Text1} \\ hold a reference to a textbox
Dim Text1(N)=TextClass()
For I=0 to N-1 {
      For Text1(i) {
            Declare Text1 editBox Form Form1(i)
            if i mod 2=-0 then {
                  With Text1, "Text", "Write something...", "NoWrap", True , "ColorCollection1", "|AND|OR|XOR|NOT|CLS|DEBUG.|PRINT|DECLARE|CONST|GOTO|DO|LOOP|WHILE|WEND|WITH|REFRESH|LET|GET|SET|DOEVENTS|SELECT|CASE|FALSE|TRUE|OPTION|EXPLICIT|LIB|DIM|REDIM|PUBLIC|PRIVATE|FUNCTION|SUB|IF|THEN|ELSE|ELSEIF|END|SELECT|FOR|NEXT|TO|AS|LONG|BOOLEAN|STRING|OBJECT|EXIT|BYVAL|NEW|LEFT$(|LEFT(|RIGHT$(|RIGHT(|MID$(|MID(|UBOUND(|LBOUND(|CSTR(|CDBL(|CLNG(|STR$(|STRING$(|INSTR(|ASC(|CHR(|CHR$(|COS(|SIN(|LOG(|RGB(|REPLACE(|"
                  With Form1(i), "Sizable", True,"Title", "Insert Your VB6 Code Here", "TitleHeight" as tHeight
            } else {
                  With Text1,  "Text", "Write something...", "NoWrap", True , "ColorCollection1", "|ABSTRACT|ASSERT|BOOLEAN|BREAK|BYTE|CASE|CATCH|CHAR|CLASS|CONST|CONTINUE|DEFAULT|DO|DOUBLE|ELSE|ENUM|EXTENDS|FINAL|FINALLY|FLOAT|FOR|FOR(|GOTO|IF|IMPLEMENTS|IMPORT|INSTANCEOF|INT|INTERFACE|LONG|NATIVE|NEW|PACKAGE|PRIVATE|PROTECTED|PUBLIC|RETURN|SHORT|STATIC|STRICTFP|SUPER|SWITCH|SYNCHRONIZED|THIS|THROW|THROWS|TRANSIENT|TRY|VOID|VOLATILE|WHILE|WHILE(|" , "MultiLineComment1","/*","MultiLineComment2", "*/","ColorCollection2","|STATIC|CLASS|FOR|FOR(|WHILE|WHILE(|"
                  With Form1(i), "Sizable", True,"Title", "Insert Your Java Code Here", "TitleHeight" as tHeight
            }
            Method Form1(i),"Move", 2000, 4000, 8000, 4000
            Layer Form1(i) { Cls Color(255, 160, 0) ,0}
            Method Text1,"Move", twipsx*2, tHeight, 8000-twipsx*4,4000-tHeight-twipsy*2
            Swap Text1, .Text1 \\ we can assign an object by swapping
      }
}
\\ We use one function for resize() for N Windows
Function Form1.Resize {
      read index
      layer Form1(index) { Cls Color(255, 160, 0) ,0}
      For Text1(index) {
      With Form1(index), "Width" as Form1.Width, "Height" as Form1.Height, "TitleHeight" as tHeight
      Method .Text1,"Move", twipsx*2, tHeight, Form1.Width-twipsx*4,Form1.Height-tHeight-twipsy*2
      With .Text1, "NoWrap" as NoWrap
      if Not NoWrap then Method .Text1,"Resize"
      }
}
\\ we use one Function for N EditBoxes, one in each Window
Function Text1.PopUp {
      Read X, Y
      Drop 2 ' code and line dropped
      Read Index
      for Text1(index) {
            Method .Text1,"PopUpMenu", "",X , Y
      }
}
for i=0 to N-1
      Method Form1(i),"Show" ', 1 \\ modal  means wait to return
next i


A$=key$
Show
Dim Text1()
Declare Form1() Nothing






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

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

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