Παρασκευή 11 Μαρτίου 2016

Αναθεώρηση 186 - μικρή προσθήκη.

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


Ας δούμε τρια παραδείγματα. Στο πρώτο έχουμε μια φόρμα και ένα button και βλέπουμε την συνάρτηση Form1 που παίρνει τα μηνύματα και τα προωθεί (μηνύματα με επιστροφές στο στοιχείο ελέγχου καλούνται άμεσα, και όχι μέσα από αυτό το κανάλι).

Μπήκαν νέες εντολές όπως η Layer {] που μπορεί να σχηματίσει άμεσα τη φόρμα του παράθυρου, καθώς και στη μέθοδο Show μπορούμε με το 1 να ανοίξουμε Modal το παράθυρο (πάνω από τα άλλα παράθυρα, και να είναι ανενεργά για κλικ με το ποντίκι αλλά ενεργά αν αλλάζουν τιμές, ή κάνουμε αλλαγές από το κώδικα.

\\ declare objects
Declare Form1 Form
Declare Button1 Button Form Form1

\\ setup positions, form relative to screen
\\ button position relative to form
Method Form1,"move",2000,3000
Method Button1,"move",1000,2000,6000,1000
\\ setup Title and Caption (caption in form not used)
\\ we use two variables for late input
With Form1, "Title","My First Form", "Visible" as Visible
With Button1, "Caption" as Button1.Caption$
Button1.Caption$="My First Button"
\\ Lets show the Form
Layer Form1 {
      linespace 0
      Window 6, 12000,8050 \\ define a frame
      Rem : Form 40 \\ calculate new font size
      Form 60, 24
      Cls 1, 0
      Cls 1,2 ' set splitscreen from third line
}
Function Button1.click {
      Print "this is a click in Button1"
      Refresh
      Button1.Caption$="Thanks"
}
Function Form1.click {
      Layer Form1 {
            Print "this is a click in Form1 "+time$(Now), row
            refresh
      }
      Button1.Caption$="Try Again"
}
Function Form1 {
      Try { Call Local Letter$}
}
Method Form1,"Show",1




Στο επόμενο παράδειγμα αλλάζουμε τις συναρτήσεις των γεγονότων click με ρουτίνες: Καλούμε τις ρουτίνες που είναι ίδιες με τις συναρτήσεις με την Inline.
 Για να δουλέψει η συνάρτηση Form1 αλλάζουμε την ιδιότητα ByPass σε false.
Δηλαδή έχουμε τρεις δυνατόητες. Να έχουμε συναρτήσεις που "ακούν" τα γεγονότα. ή μια συνάρτηση με το όνομα της φόρμας, ή ένα γεγονός όπου σε αυτό βάζουμε από μια ή περισσότερες συναρτήσεις όπου όλες θα πάρουν τις ίδιες παραμέτρους. Σε γεγονότα όπου η φόρμα ζητάει "απάντηση" όπως στο Unload, δεν μεσολαβεί το γεγονός αλλά απευθείας γίνεται με τον πρώτο τρόπο η κλήση (γιατί πρέπει να ικανοποιηθεί άμεσα, ενώ με τους άλλους τρόπους μπορούμε να "μαζεύουμε" τα γεγονότα και να ικανοποιήσουμε αργότερα).



\\ declare objects
Declare Form1 Form
With Form1, "ByPass", false
Declare Button1 Button Form Form1
\\ setup positions, form relative to screen
\\ button position relative to form
Method Form1,"move",2000,3000,8000,4000
Method Button1,"move",1000,2000,6000,1000
\\ setup Title and Caption (caption in form not used)
\\ we use two variables for late input
With Form1, "Title","My First Form", "Visible" As Visible
With Button1, "Caption" As Button1.Caption$
Button1.Caption$="My First Button"
\\ Lets show the Form
Method Form1,"Show"
\\ This is the Event Service
ok=100
Function Form1 {
      Try {
            Inline Letter$
            Refresh
       }
        Sub Form1.click()
            Print "this is a click in Form1"
            Button1.Caption$="Try Again"
      End Sub
      Sub Button1.click()
            Print "this is a click in Button1"
            Button1.Caption$="Thanks"
      End Sub
}
\\ main loop (we can't use Main.Task. We have no threads)
Every 100 {
      wait
      If Not Visible Then Exit
}




Έχει γίνει αλλαγή με χρήση του Event FormEvent.

\\ declare objects
Declare Form1 Form Event FormEvent
Declare Button1 Button Form Form1
\\ setup positions, form relative to screen
\\ button position relative to form
Method Form1,"move",2000,3000,8000,4000
Method Button1,"move",1000,2000,6000,1000
\\ setup Title and Caption (caption in form not used)
\\ we use two variables for late input
With Form1, "Title","My First Form", "Visible" As Visible
With Button1, "Caption" As Button1.Caption$
Button1.Caption$="My First Button"
\\ Lets show the Form
Method Form1,"Show"
\\ This is the Event Service
ok=100
Function Form1 {
      Try {
            Inline Letter$
            refresh
       }
        Sub Form1.click()
            Print "this is a click in Form1"
            Button1.Caption$="Try Again"
      End Sub
      Sub Button1.click()
            Print "this is a click in Button1"
            Button1.Caption$="Thanks"
      End Sub
}
Event FormEvent new Lazy$(&Form1())
\\ main loop (we can't use Main.Task. We have no threads)
Every 100 {
      wait
      If Not Visible Then Exit
}


 Στο τρίτο παράδειγμα θα χρησιμοποιήσουμε εξωτερικό γεγονός, για να πάρουμε τα μηνύματα σε δυο αποδέκτες. Τον δεύτερο θα τον βγάζουμε και θα τον βάζουμε όποτε θέλουμε. Αυτό είναι το Form1.Hook και στέλνει τα μηνύματα στην οθόνη της κονσόλας. Θα μπορούσαμε το MyEvent να το δώσουμε σε άλλες φόρμες. Κάθε φορά που παράγεται ένα γεγονός το οποίο δεν έχει παραμέτρους να δώσει και να πάρει (με αναφορά δηλαδή) περνάει από το κεντρικό. Μαζί με αυτό έρχεται και μια αναφορά στο αντικείμενο. Οι ρουτίνες SUB στην Μ2000 μπορεί να περιέχουν σε παρεθέσεις τις μεταβλητές που θα διαβαστούν ή να μην περιέχει και να διαβαστούν αργότερα. Η κλήση της Form1 γίνεται σε νέο σωρό και στην επιστροφή καθαρίζει.

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

\\ declare objects
Declare Form1 Form Event MyEvent
Declare Button1 Button Form Form1
\\ setup positions, form relative to screen
\\ button position relative to form
Method Form1,"move",2000,3000,8000,4000
Method Button1,"move",1000,2000,6000,1000
\\ setup Title and Caption (caption in form not used)
\\ we use two variables for late input
With Form1, "Title" ,"My First Form", "Visible" As Visible
With Button1, "Caption" As Button1.Caption$
Button1.Caption$="My First Button"
\\ Lets show the Form
Method Form1,"Show"
\\ this is for test
unhook=False
\\ This is the Event Service
Function Form1 {
      Try {
            Inline letter$
            Refresh
      }
      \\ there is also a reference for object
      \\ in stack
      Sub Form1.click(&ThisForm)
            Button1.Caption$="Try Again"
             unhook~
            If unhook Then {
                  Try {
                        Event MyEvent Drop Form1.Hook()
                        With ThisForm, "Title", "Unhook Done"
                  }
            } Else {
                  Try {
                        Event MyEvent New Form1.Hook()
                        With ThisForm, "Title", "Hook Done"
                  }
            }
      End Sub
      Sub Button1.click()
            Button1.Caption$="Thanks"
      End Sub
}
Function Form1.Hook {
      Try {
            Inline Letter$
            Refresh
      }
      Sub Form1.click()
            Print "this is a click in Form1"
      End Sub
      Sub Button1.click()
            Print "this is a click in Button1"
      End Sub
}
\\ we use lazy$() to make Form1() As this module
\\ so we can expand scope to module
\\ Form1.Hook() no need expansion of scope
Event MyEvent New lazy$(&Form1()), Form1.Hook()
\\ main loop (we can't use Main.Task. We have no threads)
Every 100 {
      If Not Visible Then Exit
}

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

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

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