Κυριακή 13 Μαρτίου 2016

Αναθεώρηση 188 - Γραφικά στα παράθυρα!

Στην αναθεώρηση 188 έκανα τα παράθυρα να δέχονται εντολές γραφικών όπως και ο εκτυπωτής. Συνάμα έβαλα και τα γεγονότα MouseMove, MouseUp και MouseDown. ;Επιπλέον έφτιαξα την φόρμα ελέγχου (ανοίγει με την εντολή Δοκιμή ή Test). Στο παράδειγμα παρακάτω ανοίγει μέσα από το πρόγραμμα με το κουμπί στο τρίτο παράθυρο (από 0 ξεκινούν άρα το 2), στο πλήκτρο (1, το δεύτερο αφού ξεκινούν από το 0).

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

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



Δείτε κάτι προχωρημένο. Όλα τα στοιχεία ελέγχου στη Μ2000 είναι από ένα και μοναδικό UserControl. Αυτό κάνει τα πάντα με χρήση περισσότερων κλάσεων πάνω σε αυτό.Ο διορθωτής δουλεύει με αυτό. Ο τίτλος στο παράθυρο είναι επίσης το ίδιο, τα button, checkbox,combo, labels, valuebox (για αριθμητικές τιμές, δείτε τον διάλογο Ρυθμίσεις), το editbox, και το Textbox, καθώς και άλλα που έχουν οι φόρμες που επιλέγουμε γραμματοσειρές, χρώματα, φακέλους, αρχεία, και εικόνες. Για να μπουν όμως στην φόρμα που βάζουμε δυναμικά, δηλαδή κατά βούληση και αφού τρέχει το πρόγραμμα, στοιχεία ελέγχου, πρέπει να έχουμε νέες, τροποποιημένες κλάσεις. Κάθε κλάση δέχεται τα μηνύματα του βασικού στοιχείου και μας τα προωθεί στη Μ2000, μέσω ενός αντικειμένου γεγονότος (αυτό ήταν το στοιχείο που άλλαξε την πορεία της Μ2000, και το σκέφτηκα διαβάζοντας τη C#, ελάχιστα με αλλά μου έδωσε ιδέες). Όταν φτιάξουμε τα Button, το σύστημα μας φέρνει τις κλάσεις και όχι τα στοιχεία ελέγχου. Αν θέλουμε όμως φθάνουμε στο βάθος...Και για το λόγο αυτό με πέντε γραμμές κώδικα της Vb6, έβαλα μια μέθοδο στην φόρμα GuiM2000, η οποία είναι μια Sub Control(Index)  που γυρίζει μια αναφορά στο αντικείμενο, με πρώτο, στο 0 τον τίτλο του παραθύρου. Με την εντολή Method (την χρησιμοποιούμε και για να χειριζόμαστε το Word, όπως έχω δείξει σε παράδειγμα στο blog) καλούμε την μέθοδο, περνάμε την τιμή του Index, το 0 καθώς και μια μεταβλητή (τη δημιουργεί) που στην ουσία είναι αντικείμενο συνδεδεμένο με το στοιχείο ελέγχου (πρόσκαιρα γιατί θα τερματίσει η συνάρτηση και θα καθαρίσει ό,τι νέο, μαζί και αυτό). Δεν σταματάμε εδώ όμως. Ορίζουμε την ιδιότητα Visible σε μια μεταβλητή, την οποία διαβάζουμε και γράφουμε, και εδώ διαβάζουμε (είναι Boolean, αν και εμείς όλες τις τιμές τις βλέπουμε ως double), που σημαίνει ότι είναι η αληθής (-1) ή ψευδής (0) και την αναστρέφουμε με την Not, και την ξαναγράφουμε. Έτσι με το δεξί κλικ button=1, χειριζόμαστε σαν διακόπτη On off τον τίτλο του παραθύρου. Επειδή έχουμε πίνακα φορμών, πιάνει και για τα πέντε παράθυρα (και Ν=10 να βάλει κανείς, θα βγάλει 10 παράθυρα με 20 συνολικά στοιχεία ελέγχου + 10 τίτλους - και αυτό στοιχείο είναι)
(έγινε αλλαγή από 0 σε 1, το Control 0 είναι για την μετακίνηση)

            Method Form1(K), "Control", 1 As UserControl
            With UserControl, "Visible" As uVisible
            uVisible=not uVisible \\ we can't use X~ As X = Not X     


Το πρόγραμμα το γράφουμε σε ένα τμήμα έστω Α με τη Σ Α ή αγγλικά edit a.
Μπορούμε να κάνουμε αντιγραφή από εδώ. Μετά το σώνουμε με Save Form55  (αυτό ήταν το νούμερό του)...

Cls,0
Title "Start Up", 0
\\\\\\\\\\
      N=5
\\\\\\\\\\
Declare Form1(N) Form


Class Buttons {
      Dim Butt()
}


Dim Controls(N)=Buttons()


For i=0 to N-1 {
      For Controls(i) {
            Declare Button1(2) button Form Form1(i)
            For j=0 To 1 {
                  Method Button1(j), "move", 1000+4000*j, 2000,3000,1000
            }
            .Butt()=Button1()
      }
     Layer Form1(i) {
            Gradient 1,4
            Cursor 0,2
            Report 2, "Hello There"
     }
      Method Form1(i), "Show"
}


Form1_1=True
\\ we can use any control because we have references to arrays
For Controls(1) {
      With .Butt(1), "Caption","ok"
}


\\ we make a variable bound to a property
With form1(0), "Visible" As visible


CloseThisForm=0
Function CloseAfter {
      If Ask("Close Form?")=1 Then {
      If CloseThisForm=1 Then Form1_1=false
      Method Form1(CloseThisForm), "CloseNow"
      }
}
Function Form1.Unload {
      Read New index, &Nook
      Nook=True \\ no unload now
      \\ After make an unamed thread
      \\ we use this of async waiting for user to
      \\ provide feedback from a message box
      CloseThisForm=Index
      After 50 { Call Local CloseAfter() }
}
Function Button1.Click {
      Read K, L
      Print "Form:";L,"Button:",K
      For Controls(L) {
           With .Butt(K), "Caption"  As that$
           Print That$
           If k=1 and l=2 Then Title "Test" : Test
     }
}
Function Form1.MouseMove {
      Read K, Button, Shft, X, Y
      If Button=1 Then {
           Layer Form1(K) {
                  move X, Y
                  circle 500, 1, 14-K
            }
      }
}
Function Form1.MouseDown {
      Read K, Button, Shft, X, Y
      If Button=2 Then {
            Method Form1(K), "Control", 1 As UserControl
            With UserControl, "Visible" As uVisible
            uVisible=not uVisible \\ we can't use X~ As X = Not X     
      }
}
Function Form1 {
     Read FormMsg$
     Try { Call Local FormMsg$ }
}


Thread {
      Print Str$(Now,"hh:mm:ss")
} As Inform Interval 1000


\\ Need a thread to run a Main.Task
Main.Task 100 {
      \\ using property  \\
      Rem 1 : Print Type$(Visible), Type$(Form1_1)
      If Not visible Then Exit
      \\ using simple variable
      If Form1_1 Then {
             Layer Form1(1) {
                        draw to random(scale.x), random(scale.y)
            }
      }
}


\\  Cleaning;
For i=0 to N-1 {
      For Controls(i) {
            Dim .Butt()
      }
}
Declare Form1() Nothing
Title "End"
Show



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

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

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