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

Ένα μικρό παράδειγμα με διάφανο παράθυρο!

Εδώ έχουμε χρωματίσει το παράθυρο με το  ##AA2255 (η Μ2000 παίρνει  τα χρώματα όπως η Html με #, αλλά μπορούμε να τα δώσουμε και με την Color(r,g,b)).

Όπως φαίνεται και εδώ δεν χρησιμοποιώ μια Function Simple{ } για να παίρνει τα γεγονότα και αν τα μοιράζει, αλλά γίνεται με απευθείας κλήση. Υπάρχει η μέθοδος "Bypass"


Declare Simple Form
With Simple, "Height", 5000,"Width",8000
Layer Simple { Cls #AA2255,0}

Declare OneButton Button Form Simple
Method OneButton, "FontAttr", "Arial", 24
Method OneButton, "Move", 1000,2000,6000,1200
With OneButton, "Caption", "Click Here"
Function OneButton.Click {
      Print "ok"
}
\\ final
Method Simple, "Show"
Method Simple, "Opacity", 200, #AA2255 , true
a$=key$
Declare OneButton Nothing
Declare Simple Nothing



Παρακάτω είναι το ίδιο πρόγραμμα αλλά με κανονική ρουτίνα που μοιράζει τα γεγονότα:


Declare Simple Form
With Simple, "ByPass", False \\ now need function Simple {}
With Simple, "Height", 5000,"Width",8000
Layer Simple { Cls #AA2255,0}

Declare OneButton Button Form Simple
Method OneButton, "FontAttr", "Arial", 24
Method OneButton, "Move", 1000,2000,6000,1200
With OneButton, "Caption", "Click Here"
Function OneButton.Click {
      Print "ok"
}
\\ final
Method Simple, "Show"
Method Simple, "Opacity", 200, #AA2255 , true
\\ εδώ είναι η κανονική ρουτίνα που εξ ορισμού είναι Bypass
Function Simple {
      Read msg$
      Rem 1 : Print msg$
      Try {Call Local msg$}
}
a$=key$
Declare OneButton Nothing
Declare Simple Nothing



Και παρακάτω το προχωρημένο με εξωτερικό γεγονός (μπορούμε να το δώσουμε και σε άλλες φόρμες, και μπορούμε να βάζουμε και να βγάζουμε συναρτήσεις:

Declare Simple Form Event Hello
With Simple, "Height", 5000,"Width",8000
Layer Simple { Cls #AA2255,0}

Declare OneButton Button Form Simple
Method OneButton, "FontAttr", "Arial", 24
Method OneButton, "Move", 1000,2000,6000,1200
With OneButton, "Caption", "Click Here"
Function OneButton.Click {
      Print "ok"
}
\\ final
Method Simple, "Show"
Method Simple, "Opacity", 200, #AA2255 , true
\\
Function Simple123 {
      Read msg$
        Try {Call Local msg$}
}
Function Second {
      Read msg$
      Print msg$
}
Event Hello New lazy$(&Simple123()), Second()
a$=key$
Declare OneButton Nothing
Declare Simple Nothing




Το Γεγονός Hello δεν καλεί με Call Local, αφού αυτή η εντολή προϋποθέτει να τρέχουμε στο τμήμα που δημιουργήσαμε τη φόρμα ώστε αυτό που καλούμε να μην ανοίγει νέο όνομα χώρου, όπως κάνουν οι συναρτήσεις και τα τμήματα, αλλά να παίρνει το τωρινό. Τι κερδίζουμε με το να παραμένουμε στον ίδιο χώρο; Σημαίνει ότι βλέπουμε τις μεταβλητές του χώρου. Όμως ο σκοπός διαφέρει, δηλαδή όταν τερματίσει η call local, ότι νέα μεταβλητή φτιάξαμε θα διαγραφεί, θα βγει εκτός σκοπού.
Για να το πετύχουμε αυτό δίνουμε την Simple123() με αναφορά και καλά οκνηρές αποτίμηση... η οποία περνάει το τρέχον περιβάλλον την ώρα που εκτελείται η lazy$(), και αυτό θα αποτιμάται κάθε φορά που θα καλείται από το γεγονός. Δίνουμε επίσης και μια ακόμα συνάρτηση, στην οποία δεν μας ενδιαφέρει να κρατήσουμε το περιβάλλον, απλά παίρνει το μήνυμα και θα το εμφανίζει.
Εδώ στα παραδείγματα δεν φαίνεται, αλλά στη προηγούμενη ανάρτηση υπάρχει σε μια συνάρτηση το διάβασμα μεταβλητών με την Read New η οποία για την Call Local είναι χρήσιμη. Κανονικά δεν μπορούμε να δώσουμε νέα αναφορά σε μια μεταβλητή που έχει ήδη μια αναφορά σε άλλη, αλλά με την Read New, δημιουργούμε μια δεύτερη μεταβλητή πάνω από εκείνη με το ίδιο όνομα, περνάμε την αναφορά, και όταν βγει εκτός σκοπού, τότε διαγράφεται, και ξανα έρχεται στο προσκήνιο η προηγούμενη αναφορά. Για να βγει κάτι εκτός σκοπού, πρέπει ή να τερματίσει η συνάρτηση ή το τμήμα που τρέχει, ή να τερματίσει τοπικά ένα μπλοκ: Για αντικείμενο { }.
Οι συναρτήσεις στη Μ2000 όταν τις περνάμε με αναφορά, λογικά είναι με αναφορά, στην πράξη όμως είναι αντιγραφή του κώδικα σε ανώνυμη συνάρτηση. Η Μ2000 δεν χειρίζεται διευθύνσεις στη μνήμη. Τα παράθυρα καλούν συναρτήσεις, με τον αυτόματο τρόπο, όπως στο πρώτο παράδειγμα, γιατί έχουν την αναφορά στο τμήμα που τα δημιούργησε. Αυτή όμως είναι ισχνή αναφορά, δεν κρατάει δηλαδή η φόρμα αντίγραφο του κώδικα του τμήματος. Αν τερματίσει το τμήμα και δεν δώσουμε το declare simple nothing που κάνει unload την φόρμα, τότε στα δύο πρώτα παραδείγματα δεν θα αποκρίνεται η φόρμα, θα δουλεύει όμως το κλείσιμο από το τετράγωνο πάνω αριστερά και το ctrl F4. Το τρίτο όμως παράδειγμα, διαφέρει, γιατί κάνει χρήση γεγονότος το οποίο..ζει, επειδή το παράθυρο κρατάει αναφορά σε αυτό, και τρέχει στη σειρά τις ανώνυμες συναρτήσεις, αφού κρατάει το κώδικα. Η δεύτερη συνάρτηση μας εμφανίζει τα μηνύματα. Μπορούμε να ξέρουμε αν το τμήμα τερμάτισε, αν στην πρώτη συνάρτηση Simple123() διαβάζουμε την Valid(Simple). Αν δεν υπάρχει η Simple τότε το τμήμα έχει τερματίσει και η Valid() γυρνάει false.
Να προσθέσω ακόμα, ότι ορισμένα γεγονότα που παίρνουν με αναφορά τιμές, ώστε να τις αλλάξουμε αν θέλουμε, δεν χρησιμοποιούν το γεγονός, και καλούνται απ ευθείας απός το παράθυρο. Άρα αν το παράθυρο μείνει ανοικτό ενώ τερμάτισε το τμήμα που το δημιούργησε, δεν θα στέλνει τέτοια μηνύματα, με αναφορές.
ΓΚ

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

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

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