Κώδικας που δουλεύει! Φτιάχνει δυο φόρμες, η μια με ένα button και η άλλη με δυο. Καλύτερα να το δει κανείς! Όταν επιλέξουμε το αριστερό κουμπί τότε ανοίγει ένα message box το οποίο όμως δεν σταματάει τα νήματα. αν επιλέξουμε το διπλανό κουμπί, τότε η συνάρτηση CallBack() που παίρνει την επιστροφή θα στείλει το μήνυμα-εντολή σε όποιο νήμα είναι ελεύθερο. Αν επιλέξουμε πάλι το messagebox απλά δεν θα βγει γιατί είναι ήδη ανοικτό (δεν υπάρχει δεύτερο)
Όμως φόρμες μπορούμε να ορίσουμε όσες θέλουμε! Κάθε φόρμα συνδέεται με ένα γεγονός, αλλά μπορούν όπως εδώ να συνδεθούν στο ίδιο δυο φόρμες ή και περισσότερες.
Στο κύριο έργο (Main.Task) αλλάζουμε τον τίτλο σε ένα παράθυρο (βλέπουμε την ώρα να αλλάζει ανά δευτερόλεπτο).. Τα παράθυρα μπορούμε να τα μετακινήσουμε χωρίς να σταματήσει η ώρα!
Αν πατήσουμε Esc τότε διακόπτεται το πρόγραμμα και κλείνουν τα παράθυρα. Υπάρχουν αρκετά στοιχεία ελέγχου για να μπουν ακόμη. Οπότε θα τα δούμε στις επόμενες αναθεωρήσεις!
Δείτε τις μεταβλητές Busy1 και Busy2. Κάθε φορά που κάποιο νήμα είναι απασχολημένο, το Busy1 η Busy2 γίνεται αληθές. Το αντίστοιχο Part { } στην CallBack δεν θα τρέξει.
Υπάρχει τρόπος να μην χρησιμοποιηθούν γενικές μεταβλητές και η CallBack() να είναι απλά μέρος του τμήματος και όχι όπως τώρα μια συνάρτηση, με γονιό το τμήμα. Αυτό μπορεί να γίνει με την Lazy$(&CallBack()) όπου δημιουργείται μια ανώνυμη με όνομα το όνομα του τμήματος, άρα βλέπει τις μεταβλητές του (όμως δεν βλέπει τον σωρό τιμών, και αυτό είναι καλό γιατί δεν αφήνει..σκουπίδια)...
Στις φόρμες δεν χρησιμοποιείται η Caption αλλά η Title. Με την εντολή With ενώνουμε μεταβλητές της Μ2000 με ιδιότητα αντικειμένου.
\\ M2000 - Form and Button only for this demo
Declare Form1 Form Event Hello
Declare Form1Button1 Button Form Form1
Declare Form1Button2 Button Form Form1
Method Form1,"move", 2000,7000,10500,3000
Method Form1Button1,"move", 500,2000,4500,500
Method Form1Button2,"move", 5500,2000,4500,500
Declare Form2 Form Event Hello
Declare Form2Button2 Button Form Form2
Method Form2,"move", 0,0,8000,3000
Method Form2Button2,"move", 1000,2000,6000,500
Function Form1Button1.Click {
\\ this is a message box
Print ask("ok","This is an example for M2000 Gui")
}
Function Form1Button2.Click {
Cls
}
Global ExecuteThis1, busy1, ExecuteThis2, busy2
Thread {
if not empty then {
Part {
read a1$
try { call void a1$}
} as busy1
}
} as ExecuteThis1 interval 50
Thread {
if not empty then {
Part {
read a2$
try { call void a2$}
} as busy2
}
} as ExecuteThis2 interval 50
Function Callback {
Read msg$ , &frm
for this {
with frm, "Title" as Caption$
\\ using async call - 2 stages
part {
print msg$, Caption$
Thread ExecuteThis1 Execute Push msg$
msg$=""
} as busy1
part {
print msg$, Caption$
Thread ExecuteThis2 Execute Push msg$
msg$=""
} as busy2
Refresh
}
}
Event Hello new CallBack()
With Form1, "Title" as Form1.Caption$, "Visible" as Form1.Visible
With Form2, "Title" as Form2.Caption$, "Visible" as Form2.Visible, "top", 3000, "left", 3000
With Form2Button2, "Caption","Press This Please"
Form1.Caption$="Hello There"
Form2.Caption$="Hello There 2"
Method Form1,"Show"
Method Form2,"Show"
Refresh
Main.Task 50 {
If form2.visible Then form2.caption$="Hello There 2 ["+str$(now,"hh:mm:ss")+"]"
If form1.visible Or form2.visible Else exit
Print "WAIT........"
Refresh
}
Declare Form1 Nothing
Declare Form2 Nothing
Show \\ get focus back
Threads Erase
Στο βίντεο έχω βάλει δυο εντολές μια στην αρχή και μια στο τέλος, την Title "ένας τίτλος",0 που κάνει ελαχιστοποίηση της κονσόλας και το Title "ένας τίτλος" που την επαναφέρει. Στο βίντεο φαίνονται δοκιμές με το Esc. Όταν βγει στην γραμμή εντολών ο Διερμηνευτής τότε κάνει αυτόματα επαναφορά αν δεν έχει γίνει. Επιπλέον τα παράθυρα κλείνουν με το Esc άμεσα.
Όμως φόρμες μπορούμε να ορίσουμε όσες θέλουμε! Κάθε φόρμα συνδέεται με ένα γεγονός, αλλά μπορούν όπως εδώ να συνδεθούν στο ίδιο δυο φόρμες ή και περισσότερες.
Στο κύριο έργο (Main.Task) αλλάζουμε τον τίτλο σε ένα παράθυρο (βλέπουμε την ώρα να αλλάζει ανά δευτερόλεπτο).. Τα παράθυρα μπορούμε να τα μετακινήσουμε χωρίς να σταματήσει η ώρα!
Αν πατήσουμε Esc τότε διακόπτεται το πρόγραμμα και κλείνουν τα παράθυρα. Υπάρχουν αρκετά στοιχεία ελέγχου για να μπουν ακόμη. Οπότε θα τα δούμε στις επόμενες αναθεωρήσεις!
Δείτε τις μεταβλητές Busy1 και Busy2. Κάθε φορά που κάποιο νήμα είναι απασχολημένο, το Busy1 η Busy2 γίνεται αληθές. Το αντίστοιχο Part { } στην CallBack δεν θα τρέξει.
Υπάρχει τρόπος να μην χρησιμοποιηθούν γενικές μεταβλητές και η CallBack() να είναι απλά μέρος του τμήματος και όχι όπως τώρα μια συνάρτηση, με γονιό το τμήμα. Αυτό μπορεί να γίνει με την Lazy$(&CallBack()) όπου δημιουργείται μια ανώνυμη με όνομα το όνομα του τμήματος, άρα βλέπει τις μεταβλητές του (όμως δεν βλέπει τον σωρό τιμών, και αυτό είναι καλό γιατί δεν αφήνει..σκουπίδια)...
Στις φόρμες δεν χρησιμοποιείται η Caption αλλά η Title. Με την εντολή With ενώνουμε μεταβλητές της Μ2000 με ιδιότητα αντικειμένου.
\\ M2000 - Form and Button only for this demo
Declare Form1 Form Event Hello
Declare Form1Button1 Button Form Form1
Declare Form1Button2 Button Form Form1
Method Form1,"move", 2000,7000,10500,3000
Method Form1Button1,"move", 500,2000,4500,500
Method Form1Button2,"move", 5500,2000,4500,500
Declare Form2 Form Event Hello
Declare Form2Button2 Button Form Form2
Method Form2,"move", 0,0,8000,3000
Method Form2Button2,"move", 1000,2000,6000,500
Function Form1Button1.Click {
\\ this is a message box
Print ask("ok","This is an example for M2000 Gui")
}
Function Form1Button2.Click {
Cls
}
Global ExecuteThis1, busy1, ExecuteThis2, busy2
Thread {
if not empty then {
Part {
read a1$
try { call void a1$}
} as busy1
}
} as ExecuteThis1 interval 50
Thread {
if not empty then {
Part {
read a2$
try { call void a2$}
} as busy2
}
} as ExecuteThis2 interval 50
Function Callback {
Read msg$ , &frm
for this {
with frm, "Title" as Caption$
\\ using async call - 2 stages
part {
print msg$, Caption$
Thread ExecuteThis1 Execute Push msg$
msg$=""
} as busy1
part {
print msg$, Caption$
Thread ExecuteThis2 Execute Push msg$
msg$=""
} as busy2
Refresh
}
}
Event Hello new CallBack()
With Form1, "Title" as Form1.Caption$, "Visible" as Form1.Visible
With Form2, "Title" as Form2.Caption$, "Visible" as Form2.Visible, "top", 3000, "left", 3000
With Form2Button2, "Caption","Press This Please"
Form1.Caption$="Hello There"
Form2.Caption$="Hello There 2"
Method Form1,"Show"
Method Form2,"Show"
Refresh
Main.Task 50 {
If form2.visible Then form2.caption$="Hello There 2 ["+str$(now,"hh:mm:ss")+"]"
If form1.visible Or form2.visible Else exit
Print "WAIT........"
Refresh
}
Declare Form1 Nothing
Declare Form2 Nothing
Show \\ get focus back
Threads Erase
Στο βίντεο έχω βάλει δυο εντολές μια στην αρχή και μια στο τέλος, την Title "ένας τίτλος",0 που κάνει ελαχιστοποίηση της κονσόλας και το Title "ένας τίτλος" που την επαναφέρει. Στο βίντεο φαίνονται δοκιμές με το Esc. Όταν βγει στην γραμμή εντολών ο Διερμηνευτής τότε κάνει αυτόματα επαναφορά αν δεν έχει γίνει. Επιπλέον τα παράθυρα κλείνουν με το Esc άμεσα.
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.