Τετάρτη 9 Μαρτίου 2016

Πρόσθεση Form και Button (μέρη του GUI)

Κώδικας που δουλεύει! Φτιάχνει δυο φόρμες, η μια με ένα 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 άμεσα.


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

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

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