Σε αυτήν την αναθεώρηση πρόσθεσα το πίνακα φορμών. Είχα φτιάξει πίνακες για στοιχεία ελέγχου αλλά τώρα φτιάχτηκε και το αντίστοιχο για τις φόρμες.
Το ερώτημα είναι τι γίνεται αν έχουμε ας πούμε τρεις φόρμες και σε κάθε φόρμα έχουμε στοιχεία ελέγχου σε πίνακα!
Αυτό το δείχνει το παράδειγμα. Επιπλέον στο παράδειγμα έχω βάλει και τη χρήση του Unload() γεγονότος όταν κάνουμε κλικ στο τετραγωνάκι πάνω δεξιά. Αν θέλουμε ακυρώνουμε το κλείσιμο της φόρμας. Στο παράδειγμα κάνουμε την ακύρωση και αμέσως δημιουργούμε ένα νήμα με την After το οποίο ασύγχρονα ενεργοποιεί ένα message box και μας ρωτάει αν θα κλείσουμε την φόρμα. Αν επιλέξουμε το εντάξει τότε το πρόγραμμα στο νήμα μιας χρήσης θα στείλει εντολή για κλείσιμο.
Βάλτε στο Ν το 5 για να φτιάξει πέντε ίδια παράθυρα! Δεν έχω ορίσει μέγεθος φόρμας παίρνει το εξ ορισμού μέγεθος. Μπορείτε να δείτε πόσο είναι με το παρακάτω (αλλάξτε το Thread)
With Form1(0), "width" as width0, "height" as Height0
Thread {
Print str$(now,"hh:mm:ss"), width0, height0
} as Inform interval 1000
Οι συναρτήσεις που καλούνται απευθείας από τις φόρμες (όταν έχουν τιμές με αναφορά όπως εδώ η NooK που με -1 ή αληθές όπου δηλώνουμε να μην γίνει ο τερματισμός) χρειάζονται το Read New, για να φτιάξουν τιμές με αναφορά, ενώ μπορεί να υπάρχουν ίδιες μεταβλητές αλλού (αυτές οι συναρτήσεις σκοπίμως καλούνται χωρίς να βάζουν το όνομα της συνάρτησης ως όνομα χώρου αλλά βάζουν το όνομα του τμήματος που φτιάχτηκε η φόρμα. Εκεί περιμένει η φόρμα να βρει τις ρουτίνες. Αν δεν φτιάξουμε μια συνάρτηση για να καλύψουμε συγκεκριμένο γεγονός, τότε αυτό όταν συμβεί θα ψάξει να βρει συνάρτηση με το όνομά του. Αν δεν βρει "πάει στο καιρό". Ευτυχώς η "αποτυχία" είναι γρήγορη διαδικασία με τον πίνακα κατακερματισμού, όπου βάζει η Μ2000 τα αναγνωριστικά.
N=3
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()
}
Method Form1(i), "Show"
}
For Controls(1) {
With .Butt(1), "Caption","ok"
}
With form1(0), "Visible" As visible
CloseThisForm=0
Function CloseAfter {
If Ask("Close Form?")=1 Then Method Form1(CloseThisForm),"CloseNow"
}
Function Form1.Unload {
Read New index, &Nook
Nook=True \\ no unload now
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$
}
}
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 {
If Not visible Then Exit
}
\\ Cleaning;
For i=0 to N-1 {
For Controls(i) {
Dim .Butt()
}
}
Declare Form1() Nothing
Το ερώτημα είναι τι γίνεται αν έχουμε ας πούμε τρεις φόρμες και σε κάθε φόρμα έχουμε στοιχεία ελέγχου σε πίνακα!
Αυτό το δείχνει το παράδειγμα. Επιπλέον στο παράδειγμα έχω βάλει και τη χρήση του Unload() γεγονότος όταν κάνουμε κλικ στο τετραγωνάκι πάνω δεξιά. Αν θέλουμε ακυρώνουμε το κλείσιμο της φόρμας. Στο παράδειγμα κάνουμε την ακύρωση και αμέσως δημιουργούμε ένα νήμα με την After το οποίο ασύγχρονα ενεργοποιεί ένα message box και μας ρωτάει αν θα κλείσουμε την φόρμα. Αν επιλέξουμε το εντάξει τότε το πρόγραμμα στο νήμα μιας χρήσης θα στείλει εντολή για κλείσιμο.
Βάλτε στο Ν το 5 για να φτιάξει πέντε ίδια παράθυρα! Δεν έχω ορίσει μέγεθος φόρμας παίρνει το εξ ορισμού μέγεθος. Μπορείτε να δείτε πόσο είναι με το παρακάτω (αλλάξτε το Thread)
With Form1(0), "width" as width0, "height" as Height0
Thread {
Print str$(now,"hh:mm:ss"), width0, height0
} as Inform interval 1000
Οι συναρτήσεις που καλούνται απευθείας από τις φόρμες (όταν έχουν τιμές με αναφορά όπως εδώ η NooK που με -1 ή αληθές όπου δηλώνουμε να μην γίνει ο τερματισμός) χρειάζονται το Read New, για να φτιάξουν τιμές με αναφορά, ενώ μπορεί να υπάρχουν ίδιες μεταβλητές αλλού (αυτές οι συναρτήσεις σκοπίμως καλούνται χωρίς να βάζουν το όνομα της συνάρτησης ως όνομα χώρου αλλά βάζουν το όνομα του τμήματος που φτιάχτηκε η φόρμα. Εκεί περιμένει η φόρμα να βρει τις ρουτίνες. Αν δεν φτιάξουμε μια συνάρτηση για να καλύψουμε συγκεκριμένο γεγονός, τότε αυτό όταν συμβεί θα ψάξει να βρει συνάρτηση με το όνομά του. Αν δεν βρει "πάει στο καιρό". Ευτυχώς η "αποτυχία" είναι γρήγορη διαδικασία με τον πίνακα κατακερματισμού, όπου βάζει η Μ2000 τα αναγνωριστικά.
N=3
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()
}
Method Form1(i), "Show"
}
For Controls(1) {
With .Butt(1), "Caption","ok"
}
With form1(0), "Visible" As visible
CloseThisForm=0
Function CloseAfter {
If Ask("Close Form?")=1 Then Method Form1(CloseThisForm),"CloseNow"
}
Function Form1.Unload {
Read New index, &Nook
Nook=True \\ no unload now
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$
}
}
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 {
If Not visible Then Exit
}
\\ Cleaning;
For i=0 to N-1 {
For Controls(i) {
Dim .Butt()
}
}
Declare Form1() Nothing
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.