Η Μ2000 μπορεί να καλεί ρουτίνες του λειτουργικού (δεν έχω δοκιμάσει-φτιάξει να περνάει struct, αργεί κάτι τέτοιο). Μπορούμε να περνάμε όμως τιμές τύπου Long για παράδειγμα. Στην Όρισε (Declare) με το ΑΠΟ (ή Lib) δίνουμε την βιβλιοθήκη και την ρουτίνα που μας ενδιαφέρει. Μετά ακολουθεί ένα μπλοκ που λέει στο διερμηνευτή τι θα περιμένει και πώς θα τα στείλει, μπορεί δε να στείλει και με αναφορά με το & στην αρχή του ονόματος, αν όμως το δέχεται η ρουτίνα).
Υπάρχει και η Declare Global για γενικές συναρτήσεις. Οι βιβλιοθήκες που συνδέονται αποσυνδέονται στο τερματισμό του προγράμματος (του m2000.exe και όχι του τμήματος που τρέξαμε). Οι βιβλιοθήκες αυτές έχουν το χαρακτηριστικό του stdCall ενώ αν θέλουμε CCall τότε μπορούμε να γράψουμε C μετά το Lib για να καταλάβει το σύστημα με τι τρόπο θα καλέσει την ρουτίνα. (στο CCall έχω σύνδεσμο στο Blog για να δει κανείς πώς γίνεται αυτό).
Στο παράδειγμα δεν έβαλα καθόλου μια Callback για το Event, δεν θέλω να κάνω κάτι με τις δυο φόρμες. Απλά θέλω να ελέγχω ποια θα είναι μπροστά! Χρειάζομαι την ιδιότητα Hwnd η οποία είναι ο χειριστής (handler) του παραθύρου. Εδώ βάζω και την αντίστοιχη του δεύτερου παραθύρου στην Hwnd2. Όταν τα χρησιμοποιούμε αυτά τα δύο τότε στην ουσία επικοινωνούμε με τις φόρμες. Δηλαδή δεν είναι μεταβλητές που κρατάνε κάπου τιμές, και ας φαίνονται έτσι. Όταν διαβάσουμε την Hwnd1 θα απευθυνθούμε στη φόρμα και θα ζητήσουμε την ιδιότητα Hwnd (κάθε ιδιότητα έχει ένα νούμερο, και έτσι αυτό το νούμερο έχει καταγραφεί στην hwnd1, και δεν χρειάζεται καθυστέρηση για να τον ξαναβρεί, όποτε γράφουμε ή διαβάζουμε). Η Hwnd δεν γράφεται! Αν το προσπαθήσουμε θα πάρουμε λάθος "Δεν μπορώ να γράψω αυτήν την ιδιότητα".
Τα παράθυρα της Μ2000 έχουν μια ιδιότητα Title για να εμφανίζουν τον τίτλο. Υπάρχει και η Caption αλλά το στυλ του παραθύρου δεν τον χρησιμοποιεί. Προς το παρόν τα παράθυρα δεν αλλάζουν μέγεθος με τράβηγμα (αυτό θα αλλάξει όταν μπουν όλα τα στοιχεία ελέγχου), αλλά αλλάζουν προγραμματιστικά με την μέθοδο "Move".
Ακόμα τα παράθυρα είναι στο στάδιο ανάπτυξης, διότι δεν θα τα αφήσω χωρίς να έχω τη σιγουριά ότι έχω κάνει το καλύτερο από άποψη χρήσης.
Όταν σταματάει απότομα ένα πρόγραμμα, όλα τα παράθυρα ..εξαφανίζονται. Οπότε τα Declare Nothing στο τέλος τα έχουμε για την κανονική έξοδο που για τις φόρμες σημαίνει να διαγραφούν. Αλλά αν δεν το κάνουμε θα μείνουν ως έχουν και αν τρέξουμε το πρόγραμμα θα δημιουργηθοπυν άλλες. Μπορούμε όμως να καθαρίσουμε με το Esc. Πατάμε το Esc και εξαφανίζει τα παράθυρα, παλιά και νέα. Προγραμματιστικά μπορούμε το Esc να το απενεργοποιήσουμε με το Διαφυγή Όχι ή Ναι. Escape On/Off. Εξ ορισμού είναι ενεργό. Το Escape σταματάει και τα νήματα.
Το Event Hello δημιουργεί το Event αλλά δεν του έχουμε δώσει κάτι για να κάνει (να υποστηρίξει τα γεγονότα της φόρμας). Μπορούμε να μην το δώσουμε δηλαδή να γράψουμε αυτό.
...
Declare Form1 Form
Declare Form2 Form
....
Και πάλι οι φόρμες θα στέλνουν τα γεγονότα στο τμήμα πχ. το Form1.Click() περιμένει να είναι ως Function Form1.Click { } και αν δεν την βρει τότε αφαιρείται από μια λίστα στην φόρμα, ως μη εξυπηρετούμενο γεγονός. Όταν μια φόρμα μπαίνει στο προσκήνιο από το παρασκήνιο, τότε διαγράφει τη λίστα μη εξυπηρετούμενων γεγονότων και στην πορεία την δημιουργεί. Αυτό γίνεται για την περίπτωση που κάποιο γεγονός προκληθεί ενώ δεν υπάρχει ακόμα από το κώδικα συνάρτηση εξυπηρέτησης. Οι συναρτήσεις "υπάρχουν" όταν περάσει ο διερμηνευτής από τον ορισμό τους. Θα μπορούσε κανείς να έχει μια Αν (if) και να έφτιαχνε διαφορετικά τον ορισμό, ή ακόμα θα μπορούσε να ξαναορίσει μια συνάρτηση, και ο νέος ορισμός αλλάζει τον παλιό. Ακόμα μπορούμε να διαγράψουμε το τελευταίο ορισμό, με την Διαγραφή ή Remove (όποιος είναι και αυτό καμιά φορά δεν βγαίνει σε καλό, ειδικά αν τρέχουν συναρτήσεις εξυπηρέτησης γεγονότων και σε αυτές υπάρχουν άλματα - τότε ο διερμηνευτής "κοιτάει" το αντικείμενο εκτέλεσης τον σωσμένο κώδικα, και δεν θα τον βρει, ενώ ο προς εκτέλεση κώδικας, αυτός δηλαδή που "καταναλώνεται" βρίσκεται στο αντικείμενο και δεν δύναται να πειραχθεί απ΄έξω.
Declare SwitchTo Lib "User32.SwitchToThisWindow" {Long Hwnd, Long Tab}
Declare Form1 Form Event Hello
Declare Form2 Form Event Hello
With Form1, "Hwnd" as Hwnd1, "Title","Hello There", "top", 4000,"left", 4000
With Form2, "Hwnd" as Hwnd2, "Title","Hello There Too", "top", 6000,"left", 6000
Method Form1,"Show"
Method Form2,"Show"
For i=1 to 5 {
Call Void SwitchTo(Hwnd1, true)
Wait 500
Call Void SwitchTo(Hwnd2, true)
Wait 500
}
Declare Form1 Nothing
Declare Form2 Nothing
Show
Υπάρχει και η Declare Global για γενικές συναρτήσεις. Οι βιβλιοθήκες που συνδέονται αποσυνδέονται στο τερματισμό του προγράμματος (του m2000.exe και όχι του τμήματος που τρέξαμε). Οι βιβλιοθήκες αυτές έχουν το χαρακτηριστικό του stdCall ενώ αν θέλουμε CCall τότε μπορούμε να γράψουμε C μετά το Lib για να καταλάβει το σύστημα με τι τρόπο θα καλέσει την ρουτίνα. (στο CCall έχω σύνδεσμο στο Blog για να δει κανείς πώς γίνεται αυτό).
Στο παράδειγμα δεν έβαλα καθόλου μια Callback για το Event, δεν θέλω να κάνω κάτι με τις δυο φόρμες. Απλά θέλω να ελέγχω ποια θα είναι μπροστά! Χρειάζομαι την ιδιότητα Hwnd η οποία είναι ο χειριστής (handler) του παραθύρου. Εδώ βάζω και την αντίστοιχη του δεύτερου παραθύρου στην Hwnd2. Όταν τα χρησιμοποιούμε αυτά τα δύο τότε στην ουσία επικοινωνούμε με τις φόρμες. Δηλαδή δεν είναι μεταβλητές που κρατάνε κάπου τιμές, και ας φαίνονται έτσι. Όταν διαβάσουμε την Hwnd1 θα απευθυνθούμε στη φόρμα και θα ζητήσουμε την ιδιότητα Hwnd (κάθε ιδιότητα έχει ένα νούμερο, και έτσι αυτό το νούμερο έχει καταγραφεί στην hwnd1, και δεν χρειάζεται καθυστέρηση για να τον ξαναβρεί, όποτε γράφουμε ή διαβάζουμε). Η Hwnd δεν γράφεται! Αν το προσπαθήσουμε θα πάρουμε λάθος "Δεν μπορώ να γράψω αυτήν την ιδιότητα".
Τα παράθυρα της Μ2000 έχουν μια ιδιότητα Title για να εμφανίζουν τον τίτλο. Υπάρχει και η Caption αλλά το στυλ του παραθύρου δεν τον χρησιμοποιεί. Προς το παρόν τα παράθυρα δεν αλλάζουν μέγεθος με τράβηγμα (αυτό θα αλλάξει όταν μπουν όλα τα στοιχεία ελέγχου), αλλά αλλάζουν προγραμματιστικά με την μέθοδο "Move".
Ακόμα τα παράθυρα είναι στο στάδιο ανάπτυξης, διότι δεν θα τα αφήσω χωρίς να έχω τη σιγουριά ότι έχω κάνει το καλύτερο από άποψη χρήσης.
Για το Escape
Όταν σταματάει απότομα ένα πρόγραμμα, όλα τα παράθυρα ..εξαφανίζονται. Οπότε τα Declare Nothing στο τέλος τα έχουμε για την κανονική έξοδο που για τις φόρμες σημαίνει να διαγραφούν. Αλλά αν δεν το κάνουμε θα μείνουν ως έχουν και αν τρέξουμε το πρόγραμμα θα δημιουργηθοπυν άλλες. Μπορούμε όμως να καθαρίσουμε με το Esc. Πατάμε το Esc και εξαφανίζει τα παράθυρα, παλιά και νέα. Προγραμματιστικά μπορούμε το Esc να το απενεργοποιήσουμε με το Διαφυγή Όχι ή Ναι. Escape On/Off. Εξ ορισμού είναι ενεργό. Το Escape σταματάει και τα νήματα.
Το Event Hello δημιουργεί το Event αλλά δεν του έχουμε δώσει κάτι για να κάνει (να υποστηρίξει τα γεγονότα της φόρμας). Μπορούμε να μην το δώσουμε δηλαδή να γράψουμε αυτό.
...
Declare Form1 Form
Declare Form2 Form
....
Και πάλι οι φόρμες θα στέλνουν τα γεγονότα στο τμήμα πχ. το Form1.Click() περιμένει να είναι ως Function Form1.Click { } και αν δεν την βρει τότε αφαιρείται από μια λίστα στην φόρμα, ως μη εξυπηρετούμενο γεγονός. Όταν μια φόρμα μπαίνει στο προσκήνιο από το παρασκήνιο, τότε διαγράφει τη λίστα μη εξυπηρετούμενων γεγονότων και στην πορεία την δημιουργεί. Αυτό γίνεται για την περίπτωση που κάποιο γεγονός προκληθεί ενώ δεν υπάρχει ακόμα από το κώδικα συνάρτηση εξυπηρέτησης. Οι συναρτήσεις "υπάρχουν" όταν περάσει ο διερμηνευτής από τον ορισμό τους. Θα μπορούσε κανείς να έχει μια Αν (if) και να έφτιαχνε διαφορετικά τον ορισμό, ή ακόμα θα μπορούσε να ξαναορίσει μια συνάρτηση, και ο νέος ορισμός αλλάζει τον παλιό. Ακόμα μπορούμε να διαγράψουμε το τελευταίο ορισμό, με την Διαγραφή ή Remove (όποιος είναι και αυτό καμιά φορά δεν βγαίνει σε καλό, ειδικά αν τρέχουν συναρτήσεις εξυπηρέτησης γεγονότων και σε αυτές υπάρχουν άλματα - τότε ο διερμηνευτής "κοιτάει" το αντικείμενο εκτέλεσης τον σωσμένο κώδικα, και δεν θα τον βρει, ενώ ο προς εκτέλεση κώδικας, αυτός δηλαδή που "καταναλώνεται" βρίσκεται στο αντικείμενο και δεν δύναται να πειραχθεί απ΄έξω.
Declare SwitchTo Lib "User32.SwitchToThisWindow" {Long Hwnd, Long Tab}
Declare Form1 Form Event Hello
Declare Form2 Form Event Hello
With Form1, "Hwnd" as Hwnd1, "Title","Hello There", "top", 4000,"left", 4000
With Form2, "Hwnd" as Hwnd2, "Title","Hello There Too", "top", 6000,"left", 6000
Method Form1,"Show"
Method Form2,"Show"
For i=1 to 5 {
Call Void SwitchTo(Hwnd1, true)
Wait 500
Call Void SwitchTo(Hwnd2, true)
Wait 500
}
Declare Form1 Nothing
Declare Form2 Nothing
Show
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.