Την "ιδέα" την πήρα από ένα ερώτημα από το Insomnia.gr, όπου κάποιος ρώταγε αν μπορούσε να πάρει κείμενο που μπαίνει σε άλλη φόρμα, σε java. Εδώ στη Μ2000 είναι εύκολο. Για να γίνεται κάτι τέτοιο πρέπει να ξέρουμε αν η άλλη φόρμα είναι ανοικτή. (Αλλιώς δεν μπορούμε να γράψουμε). Πώς θα ξέρουμε αν η φόρμα 2 έκλεισε; Μας το λέει η ίδια! Υπάρχει ένα μήνυμα Unload. Αυτό το μήνυμα δίνει και μια μεταβλητή αλλά εδώ δεν ασχολούμαστε με αυτήν. Αυτή η μεταβλητή αν πάρει μη μηδενική τιμή τότε ακυρώνει το κλείσιμο της φόρμας. Εδώ δεν θέλουμε κάτι τέτοιο.
Επίσης δείτε κάτι το διαφορετικό (αν δεν το έχετε δει σε άλλα παραδείγματα με φόρμες). Όταν καλείται μια συνάρτηση για να εξυπηρετήσει ένα γεγονός τότε καλείται με μια "κάλεσε τοπικά" η οποία κάνει το εξής, βάζει για όνομα το όνομα του τμήματος που έφτιαξε τη φόρμα, και έτσι την βάζει στο χώρο του τμήματος, σαν να ήταν κώδικας του τμήματος. Με αυτό τον τρόπο όλες οι μεταβλητές (άρα βλέπουμε και τα αντικείμενα που έχουμε ορίσει με τις Declare ή ελληνικά Όρισε) Αν ορίσουμε νέες μεταβλητές τότε αυτές θα "ζήσουν" για όσο χρόνο τρέχει η συνάρτηση εξυπηρέτησης. Αυτές οι συναρτήσεις οφείλουν να τρέχουν γρήγορα. Αν θέλουμε να εκτελέσουμε κάτι ασύγχρονα, το βάζουμε σε ένα αυτόματο νήμα με την Μετά 30 { } όπου σε 30 χιλιοστά θα τρέξει (θα βρει κάποιο χώρο στο χρόνο εκτέλεσης ο διερμηνευτής και θα την καλέσει)
Αν θέλουμε κάτι να λειτουργεί περιοδικά τότε μπορούμε να χρησιμοποιήσουμε νήμα που θα τρέχει κάθε συγκεκριμένα χιλιοστά του δευτερολέπτου, ή μπορούμε να φτιάξουμε ένα Button ως χρονιστή, όπως στο παράδειγμα 12-Απρ-2014
Μπορούμε να αφαιρέσουμε την edit1.Enter (επειδή κάνει αλλαγή όταν πατάμε το enter)
Function edit1.Enter {
if NoForm2 Else edit2.text$=edit1.text$
}
με αυτήν, η οποία μας δίνει δυο τιμές (εδώ σηκώνουμε μόνο την μία, ο σωρός έχει τις ισχνές αναφορές και ότι αφήσουμε θα διαγραφεί στο πέρας της συνάρτησης):
Αντί να βάλουμε If Not NoForm2 Then βάζουμε απευθείας το Else χωρίς το Not..
Function edit1.ValidString {
Read &BeforeDisplay$
If NoForm2 Else edit2.text$=BeforeDisplay$
}
Το πρόγραμμα ορίζει δυο φόρμες, χωρίς να δώσει διαστάσεις και τίτλο (ορίζονται αυτόματα). Επίσης οι φόρμες μπορούν να μετακινηθούν αλλά δεν αλλάζουν μέγεθος (θα μπορούσαμε να ορίσουμε την ιδιότητα "Sizable" αληθής και τότε θα άλλαζε το μέγεθος, και θα μας έστελνε και μήνυμα για να αλλάξουμε μέγεθος αν θέλουμε στα στοιχεία της φόρμας (με την "move")
Αν θέλει να δει κανείς τις ιδιότητες και τα μηνύματα της φόρμας και της εισαγωγής (έτσι αναφέρεται το TextBox στα ελληνικά στη Μ2000), στο κώδικα της γλώσσας, στο GuiM2000.frm και στο GuiEditBox.cls. Τα ονόματα των ιδιοτήτων, των μεθόδων και αυτά των μηνυμάτων είναι σε μια γλώσσα στην αγγλική. Σε επόμενες αναρτήσεις θα έχω όλη τη λίστα και το πού χρησιμεύουν.
Declare form1 Form
\\ use standard size and title
Declare edit1 TextBox Form form1
Method edit1, "move", 1000,2000,6000,600
With edit1,"Vartext" as edit1.text$
Declare form2 Form
\\ use standard size and title
Declare edit2 TextBox Form form2
Method edit2, "move", 1000,2000,6000,600
With edit2,"Vartext" as edit2.text$
Method form1,"show"
Method form2,"show"
NoForm1=False
NoForm2=False
\\ these functions are call local
\\ which means they run with module's name
\\ so they are in same scope, and so NoForm1 is Known
Function form1.Unload {
NoForm1=True
}
Function form2.Unload {
NoForm2=True
}
Function edit1.Enter {
if NoForm2 Else edit2.text$=edit1.text$
}
Every 100 {
if NoForm1 Then Exit
}
Show
Declare form2 Nothing
Declare form1 Nothing
Επίσης δείτε κάτι το διαφορετικό (αν δεν το έχετε δει σε άλλα παραδείγματα με φόρμες). Όταν καλείται μια συνάρτηση για να εξυπηρετήσει ένα γεγονός τότε καλείται με μια "κάλεσε τοπικά" η οποία κάνει το εξής, βάζει για όνομα το όνομα του τμήματος που έφτιαξε τη φόρμα, και έτσι την βάζει στο χώρο του τμήματος, σαν να ήταν κώδικας του τμήματος. Με αυτό τον τρόπο όλες οι μεταβλητές (άρα βλέπουμε και τα αντικείμενα που έχουμε ορίσει με τις Declare ή ελληνικά Όρισε) Αν ορίσουμε νέες μεταβλητές τότε αυτές θα "ζήσουν" για όσο χρόνο τρέχει η συνάρτηση εξυπηρέτησης. Αυτές οι συναρτήσεις οφείλουν να τρέχουν γρήγορα. Αν θέλουμε να εκτελέσουμε κάτι ασύγχρονα, το βάζουμε σε ένα αυτόματο νήμα με την Μετά 30 { } όπου σε 30 χιλιοστά θα τρέξει (θα βρει κάποιο χώρο στο χρόνο εκτέλεσης ο διερμηνευτής και θα την καλέσει)
Αν θέλουμε κάτι να λειτουργεί περιοδικά τότε μπορούμε να χρησιμοποιήσουμε νήμα που θα τρέχει κάθε συγκεκριμένα χιλιοστά του δευτερολέπτου, ή μπορούμε να φτιάξουμε ένα Button ως χρονιστή, όπως στο παράδειγμα 12-Απρ-2014
Μπορούμε να αφαιρέσουμε την edit1.Enter (επειδή κάνει αλλαγή όταν πατάμε το enter)
Function edit1.Enter {
if NoForm2 Else edit2.text$=edit1.text$
}
με αυτήν, η οποία μας δίνει δυο τιμές (εδώ σηκώνουμε μόνο την μία, ο σωρός έχει τις ισχνές αναφορές και ότι αφήσουμε θα διαγραφεί στο πέρας της συνάρτησης):
Αντί να βάλουμε If Not NoForm2 Then βάζουμε απευθείας το Else χωρίς το Not..
Function edit1.ValidString {
Read &BeforeDisplay$
If NoForm2 Else edit2.text$=BeforeDisplay$
}
Το πρόγραμμα ορίζει δυο φόρμες, χωρίς να δώσει διαστάσεις και τίτλο (ορίζονται αυτόματα). Επίσης οι φόρμες μπορούν να μετακινηθούν αλλά δεν αλλάζουν μέγεθος (θα μπορούσαμε να ορίσουμε την ιδιότητα "Sizable" αληθής και τότε θα άλλαζε το μέγεθος, και θα μας έστελνε και μήνυμα για να αλλάξουμε μέγεθος αν θέλουμε στα στοιχεία της φόρμας (με την "move")
Αν θέλει να δει κανείς τις ιδιότητες και τα μηνύματα της φόρμας και της εισαγωγής (έτσι αναφέρεται το TextBox στα ελληνικά στη Μ2000), στο κώδικα της γλώσσας, στο GuiM2000.frm και στο GuiEditBox.cls. Τα ονόματα των ιδιοτήτων, των μεθόδων και αυτά των μηνυμάτων είναι σε μια γλώσσα στην αγγλική. Σε επόμενες αναρτήσεις θα έχω όλη τη λίστα και το πού χρησιμεύουν.
Declare form1 Form
\\ use standard size and title
Declare edit1 TextBox Form form1
Method edit1, "move", 1000,2000,6000,600
With edit1,"Vartext" as edit1.text$
Declare form2 Form
\\ use standard size and title
Declare edit2 TextBox Form form2
Method edit2, "move", 1000,2000,6000,600
With edit2,"Vartext" as edit2.text$
Method form1,"show"
Method form2,"show"
NoForm1=False
NoForm2=False
\\ these functions are call local
\\ which means they run with module's name
\\ so they are in same scope, and so NoForm1 is Known
Function form1.Unload {
NoForm1=True
}
Function form2.Unload {
NoForm2=True
}
Function edit1.Enter {
if NoForm2 Else edit2.text$=edit1.text$
}
Every 100 {
if NoForm1 Then Exit
}
Show
Declare form2 Nothing
Declare form1 Nothing
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.