Πέμπτη 10 Μαρτίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 27ο

16.7 Ιστόγραμμα

Θέλουμε να δείξουμε μια ομάδα τιμών για κάποιες περιόδους δειγματοληψίας. Η ομάδα περιέχει τρεις τιμές από τρια σημεία και μας ενδιαφέρει να δούμε την σχέση αυτών μεταξύ τους, και πως αυτή αλλάζει σε κάθε περίοδο. Προφανώς αν δείξουμε νούμερα δεν θα έχουμε κάτι άμεσα κατονοητό. Τα νούμερα θέλουν προσοχή και επιπλέον οι αναλογίες τους δεν γίνονται άμεσα αντιληπτές.

Θα φτιάξουμε αυτό:




Φόντο 2,5
Πένα 14
Δρομέας 0,0
Άδειασε \\ αδείαζω το σωρό τιμών ή χρησιμοποιώ το Σωρός Νέος { εντολές }
\\ μεταβλητές...δοκιμάστε να αλλάξετε νούμερα
Τίτλος.Γραφήματος$="Γράφημα Ρύπου Χ σε ppm Ανά Ισοβαθή"
Αριστερό.όριο=1000
Άνω.όριο=2000 \\ όχι ο τίτλος μέσα
Σειρές=4 \\ 4 σειρές με νούμερα - 4 χρώμαματα
Μέρη=5 \\ 5 μέρη (τόποι-σημεία) ή χρονικοί περίοδοι
Πλάτος.Σειράς=1800
Πλάτος.Ιστογράμματος=450
Μετάθεση.Ιστογράμματος=300
Τύπος.Γραμμάτων=12
Γωνία.Γραμμάτων=πι/8
Ύψος.Χαρακτήρων =Μέγεθος.Χ("Α", "Arial",Τύπος.Γραμμάτων,Γωνία.Γραμμάτων)
Στοίχιση.Κέντρο=2
Βασικό.Ύψος=4000
Πλάτος.Γραφήματος=Πλάτος.Σειράς*Μέρη-(Πλάτος.Σειράς-Πλάτος.Ιστογράμματος-Μετάθεση.Ιστογράμματος*(Σειρές-1))
\\ χρωματίζω το φόντο
Θέση Αριστερό.όριο, Άνω.όριο
Βάψε Πλάτος.Γραφήματος*1.03, Βασικό.Ύψος,1,5
\\ εδώ είναι η κλίμακα. Έχω τιμές μεταξύ 0 και 900
Ελάχιστο=0
Μέγιστο=900
Κλίμακα=(Μέγιστο-Ελάχιστο )/Βασικό.Ύψος
\\ Για το υπόμνημα
Σειρά 3,"Επιφάνεια",6,"5 μέτρα",7,"10 μέτρα",9,"15 μέτρα"
\\ Για την παραγωγή ιστογραμμάτων
Σειρά 3,100,350,700,830,500
Σειρά 6,150,400,600,530,600
Σειρά 7,190,450,680,650,600
Σειρά 9,290,550,780,750,700
\\ Για τα μέρη
Σειρά "Κανάλι","Λυγιά","Αλωνάκι","Αμμουδιά","Πάργα"
\\ Βάζω τίτλο
Θέση Αριστερό.όριο+Πλάτος.Γραφήματος/2,Άνω.Όριο-Ύψος.Χαρακτήρων*2.5
Επιγραφή Τίτλος.Γραφήματος$,"Arial Black", Τύπος.Γραμμάτων*1.3,0,Στοίχιση.Κέντρο
\\ ετοιμάζω τον υπολογισμό θέσης για το υπόμνημα
Ζ=Βασικό.Ύψος/(Σειρές*(Σειρές*.6))
Θέση Αριστερό.όριο+Πλάτος.Γραφήματος*1.2+Πλάτος.Σειράς/2,Άνω.Όριο+Ζ
Επιγραφή "Υπόμνημα","Courier New", Τύπος.Γραμμάτων*1.2,0, Στοίχιση.Κέντρο
Βήμα -Πλάτος.Σειράς/2, Ύψος.Χαρακτήρων
Πένα 0 {
      Για Ι=1 Έως Σειρές
            Βάψε Πλάτος.Σειράς, Ζ , Αριθμός
            Βήμα -Πλάτος.Σειράς/2, -Ζ/2
            Επιγραφή Γράμμα$,"Courier New", Τύπος.Γραμμάτων,0, Στοίχιση.Κέντρο
            Βήμα -Πλάτος.Σειράς/2, Ζ
      Επόμενο Ι
}
\\ ετοιμάζω τις οριζόντιες γραμμές και την κλίμακα
\\ επιλέγω γραμμές με τελείες
Θέση Αριστερό.όριο, Άνω.όριο
Πάχος 1,2 {
Ι=Μέγιστο
Ζ=(Μέγιστο-Ελάχιστο)/3
Για κ=1 Έως 2 {
      Χάραξε Πλάτος.Γραφήματος*1.03,0
      Βήμα 0, -Ύψος.Χαρακτήρων/2
      Επιγραφή Γραφή$(ι," 0.00", -9),"Arial", Τύπος.Γραμμάτων
      Βήμα 0, Βασικό.Ύψος/3
      Επιγραφή Γραφή$(ι-Ζ," 0.00",-9),"Arial", Τύπος.Γραμμάτων
      Βήμα 0, Ύψος.Χαρακτήρων/2
      Χάραξε -Πλάτος.Γραφήματος*1.03,0
      Βήμα 0,Βασικό.Ύψος/3
      Ι-=Ζ*2
}
}
\\ Παράγω τα ιστογράμματα
Για Κ=1 Έως Μετάθεση.Ιστογράμματος*Σειρές Ανά Μετάθεση.Ιστογράμματος \\ ή 0 Έως 800 Ανά 400
      Διάβασε Χρ
      Για Ι =1 Έως Πλάτος.Σειράς*Μέρη Ανά Πλάτος.Σειράς
            Θέση Αριστερό.όριο+Ι+Κ,Άνω.όριο
            Τ=(Αριθμός-ελάχιστο)/Κλίμακα
            Βήμα 0, Βασικό.Ύψος-Τ
            Βάψε Πλάτος.Ιστογράμματος, Τ, Χρ
      Επόμενο Ι
Επόμενο Κ
\\ Βάζω και τις επιγραφές για κάθε μέρος
\\ η Γράμμα$ τραβάει από το σωρό αλφαριθμητικά
\\ ενώ η Αριθμός, αριθμούς. Αν δεν έχει ο σωρός να δώσει ότι ζητάμε θα βγει λάθος!
Για Ι =1 Έως Πλάτος.Σειράς*Μέρη Ανά Πλάτος.Σειράς
      Θέση Αριστερό.όριο+Ι+(Πλάτος.Ιστογράμματος+Μετάθεση.Ιστογράμματος*(Σειρές-1))/2, Άνω.όριο+Βασικό.Ύψος+Ύψος.Χαρακτήρων*1.2
      Επιγραφή Γράμμα$, "Arial", Τύπος.Γραμμάτων, Γωνία.Γραμμάτων, Στοίχιση.Κέντρο
Επόμενο Ι
\\ Τώρα περιμένουμε ένα πλήκτρο να πατηθεί!
Α$=Κομ$


16.8 Γράφημα Πίτας


Θα φτιάξουμε ένα γράφημα πίτας (180 μοίρες μόνο, ή σε ακτίνια ένα Πι, η σταθερά 3.14). Έχουμε τα στοιχεία πωλήσεων για έξι είδη, και φτιάχνουμε με απλό τρόπο το υπόμνημα, Για να έχει ενδιαφέρον υπάρχει τρόπος να κόψουμε το περιθώριο. θα μπορούσε κάποιος να καλέσει το πρόγραμμα αυτό από άλλο πρόγραμμα.
Γράφουμε στην γραμμή εντολών:
Σ "γραφ1.gsb"
Και αντιγράφουμε το παρακάτω πρόγραμμα μέχρι και την εντολή τέλος.
Το πρόγραμμα έχει γραφτεί απευθείας στο δίσκο
Χρήση γραφ1
Ανοίγει στο μέσον η παρακάτω εικόνα. Με κλικ φεύγει.Στην ουσία έτρεξε ξανά το m2000.exe χωρίς να σταματήσει το πρόγραμμα που το κάλεσε. Δείτε πως δουλεύουν τα συστήματα πελάτη-εξυπηρετητή στο τεύχος 14. Θα μπορούσαμε να κάνουμε το πρόγραμμα που καλεί να περιμένει μήνυμα από το "καλεσμένο". Όπως θα μπορούσαμε να περάσουμε κάποια αρχικά δεδομένα κατά την εκτέλεση του καλεσμένου, στο σωρό του. Εδώ αδειάζουμε το σωρό, αλλά θα μπορούσαμε να κάνουμε το πρόγραμμα να περιμένει στοιχεία. Ουσιαστικά καλούμε ένα άλλο τμήμα που θα τρέξει ίσως σε άλλο επεξεργαστή, σίγουρα όμως ως εντελώς απομονωμένο πρόγραμμα.

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




ΤΜΗΜΑ Α {\\ Γράφημα Πίτας 1
\\ δίνουμε μέγεθος χαρακτήρων σε Points
\\ Δίνουμε μέγεθος οθόνης σε Pixels 1280X1024
Περιθώριο {Οθόνη 0}
Διάστιχο 30
Γραμματοσειρά "Tahoma"
Σημ 1 : Τύπος 14, 1440*πλάτος.σημείου,900*ύψος.σημείου
Σημ 2 : Τύπος 14, 1280*πλάτος.σημείου,1024*ύψος.σημείου
Σημ 3 : Τύπος 12, 1024*πλάτος.σημείου,768*ύψος.σημείου
Σημ 4 :
Τύπος 9, 800*πλάτος.σημείου,600*ύψος.σημείου
Σημ 5 : Τύπος 7, 640*πλάτος.σημείου,480*ύψος.σημείου
\\ Αυτόματος υπολογισμός για όλη την οθόνη
Σημ 6,1 : Φόρμα ;   \\ τακτοποιεί το περιθώριο
Σημ 6,2 :Φόρμα 60,60*ανάλυση.Υ/ανάλυση.χ/1.25
Φόρμα  \\ Κόβει το περιθώριο, και φαίνεται η επιφάνεια εργασίας
Άδειασε \\ καθαρίζει το σωρό τιμών
Πίνακας Τιμές(6), Ονόματα$(6), ΧρώμαΕπιλογής(6)
ΤίτλοςΓραφήματος$="Πωλήσεις Ημέρας σε €€Ευρώ {0:2}€"
ΥπότιτλοςΓραφήματος$="Πάγκος {0} - Πωλητής {1}"
Πάγκος$="Α"
Πωλητής$="Β. Βάσιος"
Σειρά 100.2,"Ντομάτα Α",#FF2222, 40.5, "Μαρούλι",#44AA77, 123.5, "Πατάτα Α", #B79268
Σειρά 57.85, "Καρότα", #FF5522, 34.5,"Λάχανο", #AAFF77, 14.5, "Κρεμμύδια", #FFAA99
Στη Μ=0, Σύνολο=0
Ενώ Όχι Κενό {
      Διάβασε Τιμές(Μ), Ονόματα$(Μ), ΧρώμαΕπιλογής(Μ)
      Σύνολο+=Τιμές(Μ)
      Μ++
}
Οθόνη 5,0
Τύπωσε
ΣτοΚέντρο=2
Διπλά
      Αναφορά ΣτοΚέντρο, "Γράφημα Πίτας 1"
Κανονικά
Πλάγια 1
      Αναφορά ΣτοΚέντρο, Μορφή$(ΤίτλοςΓραφήματος$, Σύνολο)
      Αναφορά ΣτοΚέντρο, Μορφή$(ΥπότιτλοςΓραφήματος$, Πάγκος$, Πωλητής$)
Πλάγια 0


Θέση Χ.Σημεία/2, Υ.Σημεία/2+Υ.Σημεία/6
Ακτίνα=Υ.Σημεία/3.5
ΑπόΓωνία=Πι/2
ΜέχριΓωνία=0

Για Μ=5 Έως 0 {
      ΑπόΓωνία=ΜέχριΓωνία
      ΜέχριΓωνία+=Πι*Τιμές(Μ)/Σύνολο
      Κύκλος Γέμισμα ΧρώμαΕπιλογής(Μ), 1.8*Ακτίνα, 1/1.5,ΧρώμαΕπιλογής(Μ), ΑπόΓωνία, ΜέχριΓωνία
}
Για Μ=0 Έως 5 {
      Δρομέας Πλάτος-12, Μ+8
      Πένα ΧρώμαΕπιλογής(Μ) { Σημάδι}
      Πένα 15 {
            Τύπωσε μέρος $(7,5),@(Πλάτος-12),Γραφή$(Τιμές(Μ)/Σύνολο,"##.00%"), ~(14);" ";Ονόματα$(Μ)
      }
}
Βήμα -1.8*Ακτίνα, 0
Βάψε 1.8*Ακτίνα, Υ.Σημεία/12, ΧρώμαΕπιλογής(0), 5
Βήμα 0, -Υ.Σημεία/12
Βάψε 1.8*Ακτίνα, Υ.Σημεία/12, ΧρώμαΕπιλογής(5), 5
Άναψε
Καθε 100 {
Αν Ενκομ$<>"" ή Δείκτης Τότε Έξοδος
}
}
Α : Τέλος
(Συνεχίζεται)


Περιεκτικό, παίζει παρουσίαση, με διάστημα αλλάζουμε γράφημα, με ότι άλλο τερματίζει. Τα γραφήματα έχουν φτιαχτεί στα επίπεδα 1 και 2 (τα επίπεδα χρησιμοποιούνται όπως η Οθόνη και το Περιθώριο, αλλά έχουν εντολές για χρήση σαν Παίκτες ειδικές διαφάνειες (sprites). Υπάρχουν 32 επιφάνειες πάνω από την οθόνη. Δείτε την Παίκτης 1 Αλλαξε 2. Αλλάζει σειρά εμφάνισης και ταυτόχρονα αλλάζει αρίθμηση στα 1 και 2 επίπεδα. Έτσι η εντολή Παίκτης 1 Κρύψε κρύβει το επίπεδο 1 όποιο και αν είναι τη στιγμή εκείνη. Η εντολή Επίπεδο 1 {Κίνηση 1000, 1000} μετακινεί το επίπεδο.Το ίδιο κάνει και η Παίκτης 1, 1000, 1000 με τη διαφορά ότι έχει άλλο Hot Spot, δηλαδή αν φτιάξουμε το επίπεδο με εντολή Παίκτης θα έχει στο κέντρο ή όπου αλλού το πάμε! Τα sprites που φτιάχνουν οι παίκτες θεωρούνται Hardware sprites, γιατί αφενός είναι σε διαφορετικό επίπεδο, αφετέρου η κάρτα γραφικών τα χειρίζεται ως παράθυρα. Υπάρχει εντολή Διαφάνεια ή Sprite που φτιάχνει software sprites, δηλαδή εικόνες με διάφανα στοιχεία που γράφονται όμως στο επίπεδο που θέλουμε, και επιστρέφουν στο Διαφάνεια$ την εικόνα που "πάτησαν". Στις φόρμες χρήστη (Gui) μπορούμε μόνο software sprites να χρησιμοποιήσουμε. Στις φόρμες αυτές αναφερόμαστε στο επίπεδό τους (layer) αντί για αριθμό με το δείκτη στο αντικείμενο πχ αν έχουμε ορίσει Φόρμα1 τη φόρμα μας το Επίπεδι Φόρμα1 { } στέλνει όλες τις εντολές γραφικών στη Φόρμα 1.
Η εντολή Νήμα κρατάει το τρέχον επίπεδο εξόδου, οπότε κάθε φορά που εκτελείται ένα νήμα δουλεύει στο επίπεδο που φτιάχτηκε. Αναφερόμαστε στο επίπεδο της βασικής οθόνης από νήμα με το Επίπεδο {} δηλαδή χωρίς αριθμό ή αντικείμενο. Συνολικά τα επίπεδα είναι το Περιθώριο, η βασική οθόνη, τα 32 επίπεδα των παικτών και έως 1000 φόρμες (αδύνατον να ανοίξουμε τόσες, πιθανόν στα νεότερα Windows να γίνονται). Επιπλέον σε κάθε επίπεδο μπορούμε να ορίζουμε Στόχους, πλαίσια που δέχονται κλικ από το ποντίκι. Στις φόρμες βάζουμε στοιχεία ελέγχου αλλά και Στόχους αν θέλουμε. Οι στόχοι δεν παίρνουν εστίαση όπως τα στοιχεία ελέγχου, βρίσκονται πάντα στο επίπεδο, ενώ τα στοιχεία ελέγχου έχουν δικό τους επίπεδο, είναι παράθυρα μέσα σε παράθυρα όπως οι παίκτες για το περιθώριο, όπως και η οθόνη η βασική για το περιθώριο. Η διαφορά της βασικής οθόνης με τα 32 επίπεδα πάνω από αυτήν είναι ότι δεν αλλάζει z-order, δηλαδή προτεραιότητα εμφάνισης (ή βάθος εμφάνισης). Ομοίως και τα στοιχεία ελέγχου στις φόρμες δεν αλλάζουν προτεραιότητα εμφάνισης, έχουν όμως λειτουργία διαφάνειας που εμφανίζουν το επίπεδο της φόρμας στο χώρο τους (γίνεται με αντιγραφή πολύ γρήγορα)
Βάλτε το παρακάτω σε ένα τμήμα έστω α. Με α 1 ανοίγει το πρόγραμμα στη συσκευή 1 (δουλεύει δηλαδή με συστήματα με πολλαπλά μόνιτορ).
// 0 Μόνιτορ 0, 1 Μονιτορ 1
// Μεταβλητή Οθόνες δίνει το πόσες οθόνες (συσκευές) έχουμε
// Συσκευή δίνει τον τρέχον αριθμό οθόνης
Διάβασε Μόνιτορ = 0
Αδειασε
Διαφυγή Όχι
Παράθυρο 12, Μόνιτορ
Σβήσε
Περιθώριο {
Γραμματοσειρά "Times":Τύπος 24:Διάστιχο 0:Οθόνη #002277
Φόντο #88BBFF, #002277:Πένα 15:Δρομέας 0,0:Διπλά:Φαρδιά 1: Πλάγια 1
Αναφορά 6, "Παρουσίαση Άλφα Βήτα":Κανονικά
Νήμα {
Δρομέας 0, Ύψος-1
Τύπωσε Πάνω $(7), Γραφη$(Τώρα, "Long Time")
} ως Α κάθε 1000/120
}
Αναμονή 50
Παίκτης 0
Επίπεδο 1 {
Ανανέωση 5000
Διάστιχο 30: Γραμματοσειρά "Tahoma"
Παράθυρο 12, 1000*πλάτος.σημείου,512*ύψος.σημείου;
Φόντο 2,5:Πένα 14:Δρομέας 0,0
Τίτλος.Γραφήματος$="Γράφημα Ρύπου Χ σε ppm Ανά Ισοβαθή"
Αριστερό.όριο=1000:Άνω.όριο=2000:Σειρές=4:Μέρη=5:Πλάτος.Σειράς=1800
Πλάτος.Ιστογράμματος=450:Μετάθεση.Ιστογράμματος=300:Τύπος.Γραμμάτων=12:Γωνία.Γραμμάτων=πι/8
Ύψος.Χαρακτήρων =Μέγεθος.Χ("Α", "Arial",Τύπος.Γραμμάτων,Γωνία.Γραμμάτων)
Στοίχιση.Κέντρο=2:Βασικό.Ύψος=4000
Πλάτος.Γραφήματος=Πλάτος.Σειράς*Μέρη-(Πλάτος.Σειράς-Πλάτος.Ιστογράμματος-Μετάθεση.Ιστογράμματος*(Σειρές-1))
Θέση Αριστερό.όριο, Άνω.όριο
Βάψε Πλάτος.Γραφήματος*1.03, Βασικό.Ύψος,1,5
Ελάχιστο=0:Μέγιστο=900:Κλίμακα=(Μέγιστο-Ελάχιστο )/Βασικό.Ύψος
Σειρά 3,"Επιφάνεια",6,"5 μέτρα",7,"10 μέτρα",9,"15 μέτρα"
Σειρά 3,100,350,700,830,500
Σειρά 6,150,400,600,530,600
Σειρά 7,190,450,680,650,600
Σειρά 9,290,550,780,750,700
Σειρά "Κανάλι","Λυγιά","Αλωνάκι","Αμμουδιά","Πάργα"
Θέση Αριστερό.όριο+Πλάτος.Γραφήματος/2,Άνω.Όριο-Ύψος.Χαρακτήρων*2.5
Επιγραφή Τίτλος.Γραφήματος$,"Arial Black", Τύπος.Γραμμάτων*1.3,0,Στοίχιση.Κέντρο
Ζ=Βασικό.Ύψος/(Σειρές*(Σειρές*.6))
Θέση Αριστερό.όριο+Πλάτος.Γραφήματος*1.2+Πλάτος.Σειράς/2,Άνω.Όριο+Ζ
Επιγραφή "Υπόμνημα","Courier New", Τύπος.Γραμμάτων*1.2,0, Στοίχιση.Κέντρο
Βήμα -Πλάτος.Σειράς/2, Ύψος.Χαρακτήρων
Πένα 0 {
Για Ι=1 Έως Σειρές
Βάψε Πλάτος.Σειράς, Ζ , Αριθμός
Βήμα -Πλάτος.Σειράς/2, -Ζ/2
Επιγραφή Γράμμα$,"Courier New", Τύπος.Γραμμάτων,0, Στοίχιση.Κέντρο
Βήμα -Πλάτος.Σειράς/2, Ζ
Επόμενο Ι
}
Θέση Αριστερό.όριο, Άνω.όριο
Πάχος 1,2 {
Ι=Μέγιστο
Ζ=(Μέγιστο-Ελάχιστο)/3
Για κ=1 Έως 2
Χάραξε Πλάτος.Γραφήματος*1.03,0
Βήμα 0, -Ύψος.Χαρακτήρων/2
Επιγραφή Γραφή$(ι," 0.00", -9),"Arial", Τύπος.Γραμμάτων
Βήμα 0, Βασικό.Ύψος/3
Επιγραφή Γραφή$(ι-Ζ," 0.00",-9),"Arial", Τύπος.Γραμμάτων
Βήμα 0, Ύψος.Χαρακτήρων/2
Χάραξε -Πλάτος.Γραφήματος*1.03,0
Βήμα 0,Βασικό.Ύψος/3
Ι-=Ζ*2
Επόμενο
}
Για Κ=1 Έως Μετάθεση.Ιστογράμματος*Σειρές Ανά Μετάθεση.Ιστογράμματος
Διάβασε Χρ
Για Ι =1 Έως Πλάτος.Σειράς*Μέρη Ανά Πλάτος.Σειράς
Θέση Αριστερό.όριο+Ι+Κ,Άνω.όριο
Τ=(Αριθμός-ελάχιστο)/Κλίμακα
Βήμα 0, Βασικό.Ύψος-Τ
Βάψε Πλάτος.Ιστογράμματος, Τ, Χρ
Επόμενο
Επόμενο
Για Ι =1 Έως Πλάτος.Σειράς*Μέρη Ανά Πλάτος.Σειράς
ΘΧ=Αριστερό.όριο+Ι+(Πλάτος.Ιστογράμματος+Μετάθεση.Ιστογράμματος*(Σειρές-1))/2
ΘΥ=Άνω.όριο+Βασικό.Ύψος+Ύψος.Χαρακτήρων*1.2
Θέση ΘΧ, ΘΥ
Επιγραφή Γράμμα$, "Arial", Τύπος.Γραμμάτων, Γωνία.Γραμμάτων, Στοίχιση.Κέντρο
Επόμενο Ι
}
Επίπεδο 2 {
Διάστιχο 30
Γραμματοσειρά "Tahoma"
Παράθυρο 9, 800*πλάτος.σημείου,600*ύψος.σημείου;
Άδειασε \\ καθαρίζει το σωρό τιμών
Πίνακας Τιμές(6), Ονόματα$(6), ΧρώμαΕπιλογής(6)
ΤίτλοςΓραφήματος$="Πωλήσεις Ημέρας σε €€Ευρώ {0:2}€"
ΥπότιτλοςΓραφήματος$="Πάγκος {0} - Πωλητής {1}"
Πάγκος$="Α":Πωλητής$="Β. Βάσιος"
Σειρά 100.2,"Ντομάτα Α",#FF2222, 40.5, "Μαρούλι",#44AA77, 123.5, "Πατάτα Α", #B79268
Σειρά 57.85, "Καρότα", #FF5522, 34.5,"Λάχανο", #AAFF77, 14.5, "Κρεμμύδια", #FFAA99
Στη Μ=0, Σύνολο=0
Ενώ Όχι Κενό
Διάβασε Τιμές(Μ), Ονόματα$(Μ), ΧρώμαΕπιλογής(Μ)
Σύνολο+=Τιμές(Μ) : Μ++
Τέλος Ενώ
Οθόνη 5,0
Τύπωσε
ΣτοΚέντρο=2
Διπλά:Αναφορά ΣτοΚέντρο, "Γράφημα Πίτας 1":Κανονικά
Πλάγια 1: Αναφορά ΣτοΚέντρο, Μορφή$(ΤίτλοςΓραφήματος$, Σύνολο)
Αναφορά ΣτοΚέντρο, Μορφή$(ΥπότιτλοςΓραφήματος$, Πάγκος$, Πωλητής$)
Πλάγια 0
Θέση Χ.Σημεία/2, Υ.Σημεία/2+Υ.Σημεία/6
Ακτίνα=Υ.Σημεία/3.5:ΑπόΓωνία=Πι/2:ΜέχριΓωνία=0
Για Μ=5 Έως 0
ΑπόΓωνία=ΜέχριΓωνία:ΜέχριΓωνία+=Πι*Τιμές(Μ)/Σύνολο
Κύκλος Γέμισμα ΧρώμαΕπιλογής(Μ), 1.8*Ακτίνα, 1/1.5,ΧρώμαΕπιλογής(Μ), ΑπόΓωνία, ΜέχριΓωνία
Επόμενο
Για Μ=0 Έως 5
Δρομέας Πλάτος-12, Μ+8:Πένα ΧρώμαΕπιλογής(Μ) { Σημάδι}
Πένα 15 {
Τύπωσε μέρος $(7,5), @(Πλάτος-12), Γραφή$(Τιμές(Μ)/Σύνολο,"##.00%"), ~(14);" ";Ονόματα$(Μ)
}
Επόμενο
Βήμα -1.8*Ακτίνα, 0
Βάψε 1.8*Ακτίνα, Υ.Σημεία/12, ΧρώμαΕπιλογής(0), 5
Βήμα 0, -Υ.Σημεία/12
Βάψε 1.8*Ακτίνα, Υ.Σημεία/12, ΧρώμαΕπιλογής(5), 5
}
Παίκτης 2 Δείξε
Επανέλαβε:Α$=Κομ$:Μετάβαση():Όσο Α$=" "
Παίκτης 0
Νήματα Σβήσε
Περιθώριο {Οθόνη 5,0}
Πενα 14
Αναψε
Ρουτίνα Μετάβαση()
Παικτης 1 άλλαξε 2
Παίκτης 1 Κρύψε
Παίκτης 2 Δείξε
Τέλος Ρουτίνας



Μετατροπή με φόρμες πάνω στην οθόνη αντί για επίπεδα πάνω στην οθόνη. Μπορούμε να μετακινήσουμε τις φόρμες. Οταν πατήσουμε διάστημα αλλάζει η φόρμα, κρύβεται η μια και εμφανίζεται η άλλη. Το ίδιο συμβαίνει αν πάμε να κλείσουμε τη φόρμα, και όταν κάνουμε κλικ με το ποντίκι. Δείτε ότι χρησιμοποιώ πίνακα με φόρμες. Έτσι δεν χρειάζεται να γράψω από τρεις συναρτήσεις εξυπηρέτησης γεγονότων για κάθε φόρμα. Επίσης πετάω από το σωρό τιμών τον αριθμό φόρμας στα γεγονότα Unload και Click.


Όρισε Φόρμα1(2) Φόρμα
Επίπεδο Φόρμα1(0) {


}
Επίπεδο Φόρμα1(1) {


}
Πίνακας Δείξε1(2)
Μέ φόρμα1(0), "visible" ως Δείξε1(0), "PreviewKey", Αληθές, "title", "Γράφημα 1"
Μέ φόρμα1(1), "visible" ως Δείξε1(1) "PreviewKey", Αληθές, "title", "Γράφημα 2"
Συνάρτηση Φόρμα1.Unload {
Πέτα : Διάβασε Νέο &ΝαΜηΚλείσω
ΝαΜηΚλείσω=Αληθές
Πληκτρολόγιο " "
}
Συνάρτηση Φόρμα1.KeyPreview {
Πέτα: Διάβασε Νέο &Πλ$
Πληκτρολόγιο ΠΛ$:Πλ$=""
}
Συνάρτηση Φόρμα1.Click {
Πληκτρολόγιο " "
}
Μετάβαση()
Επανέλαβε:Α$=Κομ$:Μετάβαση():Όσο Α$=" "
Νήματα Σβήσε
Περιθώριο {Οθόνη 5,0}
Πενα 14
Αναψε
Όρισε Φόρμα1() Τίποτα
Ρουτίνα Μετάβαση()
Αν Δείξε1 Τότε
Δείξε1=Ψευδές
Μέθοδος Φόρμα1(1), "Show", 0
Αλλιώς
Δείξε2=Ψευδές
Μέθοδος Φόρμα1(0), "Show", 0
Τέλος Αν
Τέλος Ρουτίνας


Αν θέλαμε τις ιδιότητες visible να τις έχουμε σε πίνακα κάνουμε τις μετατροπές. Η Για Αυτό {} φτιάχνει προσωρινές μεταβλητές, εδώ είναι η Δείξε1. Αν δεν βάζαμε το πρώτο Για Αυτο η δεύτερη σύνδεση στην Δείξε1 θα αποτύγχανε σιωπηλά! Το δεύτερο Για Αυτό { } το βάζουμε απλά για να μην έχουμε την Δείξε1. Οι συνδέσεις με ιδιότητες δεν κρατούν το αντικείμενο με δείκτη (εδώ το φορμα1(χ)) αλλά με αναφορά στο δείκτη, που σημαίνει ότι αν μεταβιβάσουμε το πίνακα Δείξε1() εκτός τμήματος κατά την επιστροφή (πχ τον βάλουμε στο σωρό τιμών) τότε η αναφορά θα έχει σπάσει (είναι ισχνή αναφορά). Αυτό γίνεται για να μπορούν οι φόρμες να αποφορτωθούν. Επίσης για ασφάλεια ο διερμηνευτής φτιάχνει μια αθέατη μεταβλητή τύπου SafeForm (είναι κρυφό αντικείμενο της Μ2000), το οποίο έχει κρατήσει λίστα με όλα τα hwnd (windows handles) που αποδόθηκαν στις φόρμες (από ένα σε κάθε φόρμα) και έτσι αν ξεχάσουμε να κάνουμε Unload τις φόρμες (αν δεν βάλουμε το Όρισε Φόρμα1() Τίποτα, γιατί από τη φορμα με το γεγονός Unload το έχουμε αποκλείσει), ψάχνει να δει στις υπάρχουσες φόρμες στο περιβάλλον της Μ2000 ποιες φόρμες με τους χειριστές παραθύρων της λίστας υπάρχουν και τις δίνει εντολή unload. Αυτό το αντικείμενο λειτουργεί όταν "σβήσει", δηλαδή όταν καθαρίζει τις μεταβλητές που ορίσαμε ο διερμηνευτής, το βρίσκει και με τη διαγραφή του δείκτη της προκαλείται ένα γεγονός διαγραφής που ενεργοποιεί την διαδικασία που περιέγραψα! Όλα τα αντικείμενα έχουν μια διαδικασία αποσύνθεσης ή διαγραφής, κύρια για να επιστρέψουν την μνήμη που κατέχουν στο σύστημα. Τα αντικείμενα έχουν ένα σύστημα με μετρητή. Κάθε φορά που ζητάμε ένα δείκτη αυξάνουν τον μετρητή (αυτό φαίνεται λογικό). Κάθε φορά που σβήνουμε ένα δείκτη μειώνουν τον δείκτη (αυτό φαντάζει εξωπραγματικό, αλλά θα το αναλύσω παρακάτω). Όταν ο δείκτης μηδενίσει τότε ξεκινάει η φάση αποσύνθεσης, deconstruction ή διαγραφής από τη μνήμη. Πώς βρίσκει το σύστημα ότι αυτό που διαγράψαμε ήταν δείκτης σε αντικείμενο;  Όλες οι μεταβλητές στη Μ2000 είναι εσωτερικά τύπου Variant (Σύστημα των Windows, όχι ειδικά της Μ2000). Αυτός ο τύπος θέλει 16bytes ότι και να γράψουμε. Στα δυο πρώτα λέει τι τύπος είναι το περιεχόμενο. Ένας από αυτά είναι το αντικείμενο. Έτσι όταν διαγράφουμε ή αλλάζουμε τιμή ενός Variant, δεν πάμε ξερά και βάζουμε ό,τι να είναι στο περιεχόμενό του αλλά υπάρχει εντολή που λέει "βάλε νέα τιμή στον Variant". Αυτή κοιτάει ότι υπάρχει αντικείμενο και καλεί την μέθοδο του αντικειμένου "αφαίρεσε ένα από το μετρητή δεικτών". Το ίδιο γίνεται και με τους πίνακες, όταν αλλάζουμε μέγεθος ή όταν σβήνονται, πάει το σύστημα και κοιτάει αν υπάρχει αντικείμενο στο στοιχείο του πίνακα που θα διαγραφεί και κάνει την ίδια διαδικασία αλλαγής μετρητή. Αυτή την εκπληκτική πατέντα έφτιαξαν για το OLE Automation, δηλαδή το Object Linking and Embedding, την δυνατότητα ξένες εφαρμογές να χειρίζονται αντικείμενα που δεν ανανγωρίζουν ειδικώς αλλά μπορούν να τα χειριστούν γενικώς (ακολουθόντας τις επιταγές του OLE Automation). Με αυτό το τρόπο η Μ2000 μπορεί να ανοίξει το Word (είναι αντικείμενο OLE, ενώ 99,9999% όσοι βλέπουν το Word δεν ξέρουν τι ακριβώς είναι παρά ότι είναι μια εφαρμογή!). Είναι σπουδαία έμπνευση το σύστημα αυτό, που φθάνει  στο χειρισμό ανικειμένων που βρίσκονται σε άλλο υπολογιστή! Κάτι ανάλογο υπάρχει σε Linux (Corba),


Πίνακας Δείξε1(2)
Για Αυτό {
Μέ φόρμα1(0), "visible" ως Δείξε1, "PreviewKey", Αληθές, "title", "Γράφημα 1"
Δείξε1(0)=Ιδιότητα(Δείξε1)
}
Για Αυτό {
Μέ φόρμα1(1), "visible" ως Δείξε1, "PreviewKey", Αληθές, "title", "Γράφημα 2"
Δείξε1(1)=Ιδιότητα(Δείξε1)
}


Ρουτίνα Μετάβαση()
Αν Δείξε1(0) Τότε
Δείξε1(0)=Ψευδές
Μέθοδος Φόρμα1(1), "Show", 0
Αλλιώς
Δείξε1(1)=Ψευδές
Μέθοδος Φόρμα1(0), "Show", 0
Τέλος Αν
Τέλος Ρουτίνας

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

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

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