Τρίτη, 28 Μαρτίου 2017

Αναλογικό Ρολόι με Ξυπνητήρι (ενημρώθηκε)

Μια ωραία εφαρμογή ρολογιού!
Με ctrl+F1 δίνει οδηγίες. Μπορεί να εμφανίζει ώρες/λεπτά πάντα ολόκληρα, ή αναλογικά. Υπάρχει μια κεντρική επανάληψη που γίνεται κάθε ένα δέκατο του δευτερολέπτου. Θα μπορούσα να το βάλω ανά μισό δευτερόλεπτο αλλά επειδή χειρίζομαστε το δείκτη του ξυπνητηριού θέλουμε να γίνεται πιο γρήγορα ανανέωση της οθόνης. Η βασική οθόνη σώνεται με την Κράτησε και εμφανίζεται με την Άφησε και πάνω σε αυτήν βάζουμε ότι αλλάζει. Η εντολή Ανανέωση 1000 λέει στο σύστημα να εμφανίσει την εικόνα, και να θέσει το μετρητή για την επόμενη αυτόματη εμφάνιση σε 1 δευτερόπλεπτο. Πιο γρήγορα θα δώσουμε πάλι το Ανανέωση 10000. Με αυτόν τον τρόπο δεν βλέπουμε ποτέ να χτίζεται η εικόνα, αλλά μόνο τις αλλαγές της.

Έχω χρησιμοποιήσει αρκετά στοιχεία του Περιβάλλοντος της Μ2000. Όπως την Επιφάνεια. Η πρώτη παράμετρος λέει για την διαπερατώτητα της βασικής φόρμας (της κονσόλας με το περιθώριο μαζί). Το 255 αφαιρεί τη διαφάνεια, το 0 την κάνει 100%. Εδώ βάζω το 220, δηλαδή λίγο διαπερατό. Όμως η δεύτερη προεραιτική παράμετρος έχει το χρώμα που θα είναι 100 διαπερατό και μάλιστα ότι είναι πίσω μπορεί να επιλεχθεί, δηλαδή δεν ανήκει στη φόρμα. Το μανζέντα (βασικό χρώμα 5) το χρησιμοποιώ για αυτό το σκοπό, και το ρολόι μένει στην επιφάνεια εργασίας χωρίς να την καλύπτει όλη.

Επίσης χρησιμοποιώ την δυνατότητα να ορίζουμε περιοχές εκτύπωσης, σχεδιάζοντάς της, ώστε εκτός περιοχής να μην γράφουν οι εντολές γραφικών. Με αυτό το τρόπο στο κύκλο του ρολογιού χρησιμοποιώ την Βάψε με δυο χρώματα που τα βάζει με μίξη και διεύθυνση κάθετη.
Εφόσον γράφεται συνέχεια η οθόνη μπορώ να έχω στοιχεία που αναβοσβήνουν, όπως το δείκτη του ξυπνητηριού όταν το ξυπνητήρι είναι ενεργό, με χρήση μιας μεταβλητής λογικής. Δεν έχει ιδιαίτερες μεταβλητές για λογικές η Μ2000, αλλά μπορούμε να χρησιμοποιούμε τις υπάρχουσες με τιμές 0 για ψευδής και -1 για αληθής, υπάρχουν τα Αληθής, Αληθές, Ψευδής και Ψευδές ως σταθερές για το σκοπό αυτό. Επιπλέον η Not υπάρχει ως Όχι και ως Δεν και χρησιμοποιούμε όποια μας βολεύει. Στην αναστροφή λογικής σε μεταβλητή μπορούμε να χρησιμοποιήσουμε τον τελεστή ~ (αυτός ο τελεστής στα αλφαριθμητικά είναι ισοδύναμο με το Like της Visual Basic 6) που τον χρησιμοποιώ στο πρόγραμμα (όχι σε εκφράσεις, απλά δίπλα σε μια μεταβλητή για να αντιστρέψει τη τιμή, αν την βρει μη μηδενική τη θεωρεί Αληθές, οπότε την κάνει Ψευδές).

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

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


Για τα γραφικά χρησιμοποιώ πολικές συντεταγμένες.Στη Μ2000 οι πολικές συντεταγμένες είναι απόλυτη γωνία (σε μοίρες θα λέγαμε το 0 είναι δεξιά, το 90 πάνω, 180 αριστερά και 270 κάτω, αλλά εδώ είναι σε Ακτίνια άρα 0 δεξιά, πι/2 πάνω, πι αριστερά και πι*3/2 κάτω), και η απόσταση στις βασικές μονάδες της Μ2000, τα twips (1440 twips η ίνστα στον εκτυπωτή, αλλά λογική ίντσα στην οθόνη). Η χάραξε στη βασική διαμόρφωση χρησιμοποιεί σχετικές συντεταγμένες. Στη διαμόρφωση για πολικές συνεταγμένες η γωνία είναι απόλυτη, ενώ η απόσταση από τη φύση της είναι σχετική. Υπάρχει το Χάραξε Εως που χαράζει έως το σημείο που θέλουμε (απόλυτες συντεταγμένες). Πάντα η χάραξε χαράζει από την προηγούμενη θέση του δρομέα γραφικών. Η θέση του δρομέα γραφικών αλλάζει ή με την Θέση σε απόλυτα νούμερα ή με την Βήμα σε σχετικά. Η Βήμα έχει και αυτή πολικές συντεταγμένες αν θέλουμε. Υπάρχει μια παραξενιά εδώ όταν χρησιμοποιούμε τις βήμα και χάραξε επειδή λειτουργούν με πράξεις κινητής υποδιαστολής. Για να είμαστε βέβαιοι ότι θα γυρίσουμε στο σημείο απ΄όπου ξεκινήσαμε με χρήση της Βήμα πρέπει να δώσουμε όλες τις βήμα όπως δώσαμε τις Χάραξε. Διαφορετικά θα βγει άλλο υπόλοιπο από τις εσωτερικές πράξεις και για ένα σημείο (pixel) θα βγει διαφορά!

Για να είναι ωραία η εφαρμογή έχω προσθέσει και προγραμματισμό του Ctrl+F1 (όλα τα προγράμματα πρέπει να υποστηρίζουν το Ctrl+F1 για βοήθεια). Επίσης με την Τίτλος εμφανίζεται και τίτλος στο πλαίσιο πάνω στη γραμμή εργασιών - απ΄όπου μπορούμε να φέρουμε στο προσκήνιο το ρολόι-ξυπνητήρι.

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

Στη φωτογραφία έχω ανοίξει και το Μ2000 Pad, και έχω φέρει το ρολόι στο προσκήνιο για να φανεί η διαφάνεια! Κάθε πρόγραμμα σε Μ2000 τρέχει ξεχωριστά από το άλλο, δεν είναι δηλαδή στο ίδιο περιβάλλον.
Διορθώθηκε η εμφάνιση της ένδειξης με νούμερα, τώρα φαίνονται και τα δευτερόλεπτα.




\\ Αναλογικό ρολόι-ξυπνητήρι
Οθόνη 5,0
Πενα 14
Περιθώριο {Πένα 14}
Άναψε
Επιφάνεια 220, 5
\\ ανοίγει με ctrl+f1
Περί ! "Μ2000 Ρολόι", 10000, 6000,{Ρολόι 12 ωρών, και ξυπνητήρι 12 ωρών
      Πλήκτρα:
            Μεσαίο πλήκτρο του ποντικιού βάζει/βγάζει το ξυπνητήρι/ σταματάει το κουδούνισμα
            Αριστερό/Δεξί πλήκτρο αλλάζει το ξυπνητήρι ανά λεπτό
            Μαζί με το μεσαίο αλλαζει το ξυπνητήρι ανά 10 λεπτά
            Τα βελάκια αριστερά - δεξιά αλλάζει επίσης το ξυπνητήρι
            Μαζί με το άνω βελάκι αλλάζει το ξυπνητήρι ανά 10 λεπτά
            Το κάτω βελάκι βάζει/βγάζει το ξυπνητήρι/ σταματάει το κουδούνισμα
            Το Enter αλλάζει τους δείκτες σε εμφάνιση (ανά ολόκληρες ώρες ή αναλογικά)
            Το διάστημα κλείνει το πρόγραμμα
      }
κχ=χ.σημεία-4000
κυ=4000
απ1=3000
απ2=600
απ3=απ1-απ2
κυκλ=πι*2
κυκλ60=κυκλ/60
Ξυπνητήρι=0
ΞυπνητήριΟκ=Ψευδής
ΠαίξεΉχο=Ψευδής
ΟλόκληρεςΏρες=Ψευδές
Αναβοσβήνει=Ψευδής
ΑρχικόςΧρόνος=20*10 \\ 20 δευτερόπλεπτα
ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
Ωρα=0
Ωρα12=0
λεπτό=υπωρα(0,0,1,0)
Θέση κχ, κυ
\\ η χρώμα { } ; φτιάχνει περιοχή μόνο για εμφάνιση
Χρώμα { Κύκλος Γέμισμα 2, απ2+απ1 } ;
Θέση κχ-απ2-απ1, κυ-απ2-απ1
Βάψε 2*(απ2+απ1),2*(απ2+απ1), 7,1,1
Θέση κχ, κυ-απ1*3/4
Τίτλος "Μ2000 Ρολόι"
Επιγραφή "Μ2000 Ρολόι","Arial Black",18,0,2
Θέση κχ, κυ
\\ με χρώμα 5 αντί για #2277ff γίνεται διάφανο
\\ έχουμε δηλώσει το 5 (ματζέντα) στην εντολή Επιφάνεια
Πένα #2277ff {Κύκλος Γέμισμα #2277ff, απ3/2}
π=2
ι=0
Για ν=0 εως 59
      Αν ν υπολ 5 = 0 τότε {π=4} αλλιώς π=1
      Πάχος π {
            Βήμα γωνια ι, απ1
            Χάραξε γωνία ι, απ2
            Βήμα γωνια ι, -απ2-απ1
      }
            ι+=κυκλ60
Επόμενο ν
Κράτησε
Ανανέωση 1000
Κάθε 100 {
Αναβοσβήνει~   \\ αντιστροφή λογικής  (Αναβοσβήνει = Δεν Αναβοσβήνει)
Άφησε
Ωρα=Τώρα
Ωρα12=(τιμη(γραφη$(Ωρα,"h")) υπολ 12) *60+τιμη(γραφη$(Ωρα,"n"))
Θέση κχ, κυ+απ1/2
      Αν Ωρα12<60 τότε {
            Επιγραφή Γραφη$(υπωρα(0,12,Ωρα12,τιμη(γραφη$(Ωρα,"s"))), "hh:nn:ss"), "Verdana", 18,0,2
      } Αλλιώς {
            Επιγραφή Γραφη$(υπωρα(0,0,Ωρα12,τιμη(γραφη$(Ωρα,"s"))), "hh:nn:ss"), "Verdana", 18,0,2
      }
Πένα -ΞυπνητήριΟκ*8+4 {
      Βήμα , +απ1/8
      Επιγραφή "+"+Γραφη$(υπωρα(0,0,(ξυπνητήρι-Ωρα12+720) υπολ 720,0), "hh:nn "), "Verdana", 18,0,2
      Βήμα , +απ1/8

      Αν ξυπνητήρι<60 τότε {
            Επιγραφή Γραφη$(υπωρα(0,12,ξυπνητήρι,0), "hh:nn"), "Verdana", 18,0,2
      } Αλλιώς {
            Επιγραφή Γραφη$(υπωρα(0,0,ξυπνητήρι,0), "hh:nn"), "Verdana", 18,0,2
      }
}
Θέση κχ, κυ
γωνία_ξυπν=-ξυπνητήρι*πι/360+πι/2
Αν Αναβοσβήνει ή όχι ΞυπνητήριΟκ τότε {
      Πάχος 2 {
            Βήμα Γωνία γωνία_ξυπν, απ3
            Χάραξε Γωνία γωνία_ξυπν, απ2, 13
                  Βήμα Γωνία γωνία_ξυπν, -απ2
            Βήμα Γωνία γωνία_ξυπν, -απ3
      }
}
Αν ΟλόκληρεςΏρες Τότε {
       γωνια_ώρα=-(τιμη(γραφη$(Ωρα,"h")) υπολ 12)*πι/6+πι/2
} Αλλιώς γωνια_ώρα=-(τιμη(γραφη$(Ωρα,"h")) υπολ 12+τιμη(γραφη$(Ωρα,"n"))/60)*πι/6+πι/2
Πάχος 2 {
      Χάραξε Γωνία γωνία_ώρα+πι/20, απ3/2
      Χάραξε Γωνία γωνία_ώρα-πι/20, απ3/2
      Χάραξε Γωνία γωνία_ώρα+πι/20, -απ3/2
      Χάραξε Γωνία γωνία_ώρα-πι/20, -απ3/2
}
Αν ΟλόκληρεςΏρες Τότε {
      γωνία_λεπτά=-τιμη(γραφη$(Ωρα,"n"))*πι/30+πι/2
} Αλλιώς {
      γωνία_λεπτά=-(τιμη(γραφη$(Ωρα,"n"))+τιμη(γραφη$(Ωρα,"s"))/60)*πι/30+πι/2
}
Πάχος 2 {
      Χάραξε Γωνία γωνία_λεπτά+πι/20, απ1/2
      Χάραξε Γωνία γωνία_λεπτά-πι/20, απ1/2
      Χάραξε Γωνία γωνία_λεπτά+πι/20, -απ1/2
      Χάραξε Γωνία γωνία_λεπτά-πι/20, -απ1/2
}
γωνία_δευτ=-τιμη(γραφη$(Ωρα,"s"))*πι/30+πι/2
Πάχος 2 {
      Χάραξε Γωνία γωνία_δευτ, απ3, 15
      Βήμα Γωνία γωνία_δευτ, -απ3
}
Αν Πατημένο(1) ή Πατημένο(0x25) τότε {
Αν Πατημένο(4) ή Πατημένο(0x26) τότε {ξυπνητήρι-=10: ΞυπνητήριΟκ=Αληθής} αλλιώς ξυπνητήρι--
      ξυπνητήρι=(ξυπνητήρι+720) υπολ 720
} Αλλιως.Αν Πατημένο(2) ή Πατημένο(0x27) τότε {
Αν Πατημένο(4) ή Πατημένο(0x26) τότε {ξυπνητήρι+=10: ΞυπνητήριΟκ=Αληθής} αλλιώς ξυπνητήρι++
      ξυπνητήρι=(ξυπνητήρι+720) υπολ 720
}
Αν Πατημένο(32) τότε Έξοδος
Ανανέωση 1000
Αν ΞυπνητήριΟκ και ΧρόνοςΜπιπ>0 Τότε {
      Αν (τιμη(γραφη$(Ωρα,"h")) υπολ 12 )*60+τιμη(γραφη$(Ωρα,"n"))=ξυπνητήρι τότε {
            ΠαίξεΉχο=Αληθής
      }
}
Αν ΞυπνητήριΟκ και όχι (Πατημένο(2) ή Πατημένο(1)) Τότε {
      Αν Πατημένο(4) ή Πατημένο(0x28) Τότε ΠαίξεΉχο=Ψευδής: ΞυπνητήριΟκ=Ψευδής : ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
} Αλλιώς.Αν Πατημένο(4) ή Πατημένο(0x28) Τότε {
            ΞυπνητήριΟκ=Αληθής
            ΧρόνοςΜπιπ=ΑρχικόςΧρόνος
}
Αν ΠαίξεΉχο Τότε {
      Αν ΧρόνοςΜπιπ υπολ 3 =0 τότε Μπιπ
      ΧρόνοςΜπιπ--
      Αν ΧρόνοςΜπιπ=0 Τότε ΠαίξεΉχο=Ψευδής: ΞυπνητήριΟκ=Ψευδής
}


Αν Πατημένο(13) τότε ΟλόκληρεςΏρες~ \\ αντιστροφή αληθές<>ψευδές
}
Οθόνη \\ επαναφορά από το περιορισμό περιοχής της Χρώμα
Επιφάνεια 255