Σάββατο 31 Οκτωβρίου 2015

Χρήση της εντολή Δοκιμή (βίντεο)


Από το παράδειγμα εδώ όπου έχουμε ένα πρόγραμμα για επίδειξη προφοράς μιας ιταλικής λέξης (με γράμματα).
Η εντολή Δοκιμή μπορεί να πάρει και το όνομα του τμήματος, ή να τρέξει χωρίς κάποιο τμήμα ιδιαίτερα. Ανοίγει ένα παράθυρο διαλόγου και από εκεί κάνουμε εκτέλεση μια προς μια εντολή, με πάτημα ενός πλήκτρου, ή βάζουμε όπως εδώ την αργή εκτέλεση και πατάμε στο σκιασμένο αριστερά πλαίσιο (το υπόλοιπο της εντολής) για να δούμε τον κώδικα, ή ξαναπατάμε για να δούμε το σωρό που μπαίνουν τιμές που μεταφέρουν τα τμήματα (δουλεύει και ως χώρος απόθεσης τιμών με σειρά εμφάνισης παρά με όνομα), επίσης μπορούμε να βάλουμε στο κάτω πλαίσιο που λέει τύπωσε εκφράσεις με διαχωρισμό με κόμμα η κάθε μία για να μας δίνει τις τιμές αυτών, π.χ. μιας μεταβλητής ή μιας συνθήκης π.χ. α=10. Προς το παρόν δεν έχει φτιαχτεί να σταματάει σε συγκεκριμένη συνθήκη αλλά αυτό μπορεί να μπει μέσα στο κώδικα και αντί να σταματάει το πρόγραμμα να καλεί την δοκιμή και να σταματάει το πρόγραμμα σε συγκεκριμένο σημείο (σαν Breakpoint). Κάνοντας κλικ στο όνομα του τμήματος βλέπουμε όλο τον κώδικα αυτού (την ώρα που τρέχει) στη βοήθεια (το κίτρινο πλαίσιο διαλόγου), ενώ ο χρωματιστός κώδικας που βλέπουμε είναι επακριβώς εκεί που τρέχει το πρόγραμμα (δεν το πετυχαίνει αν έχουμε κάνει Ένθεση/Inline εντολών, γιατί χάνει το μέτρημα αφενός και αφετέρου αυτές οι εντολές δεν υπάρχουν στο αρχικό, μέρος του οποίου μας εμφανίζει!)
Στο βίντεο φαίνεται ο διάλογος της Δοκιμής που έχει γραφτεί με αντικείμενα της Μ2000, δηλαδή το κείμενο, τα πορτοκαλί πλαίσια, όλα ότι βλέπουμε πάνω στη φόρμα προέρχονται από ένα και μόνο αντικείμενο ελέγχου χρήστη (User Control) γραμμένο στη VB6, ειδικά για την Μ2000. Με αυτό πετυχαίνει η Μ2000 σε οποιαδήποτε Windows να εμφανίζεται με ίδιες φόρμες (Από Windows Xp και πάνω). Όλες οι φόρμες ακόμα και τα MsgBox είναι φτιαγμένες με τέτοια στοιχεία. Τη μόνη που δεν μπορώ να φτιάξω είναι τη φόρμα διαλόγου των ιδιοτήτων ενός εκτυπωτή. Υπάρχουν φόρμες για επιλογή χρωμάτων, γραμματοσειράς, επιλογή φακέλου, αρχείων, αρχείων εικόνας με προεπισκόπηση, ρυθμίσεων (εντολή ΡΥΘΜΙΣΕΙΣ ή ctrl+U), προβολής μηνύματος, εισαγωγής αλφαριθμητικού, η βοήθεια επίσης (το κίτρινο πλαίσιο με τις καμπύλες άκρες) και φυσικά η φόρμα Δοκιμή! Χωρίς φόρμα αλλά με λίστα επιλογής εμφανίζονται οι εκτυπωτές και τα μουσικά όργανα του MIDI (του ενσωματωμένου συνθεσάιζερ που υπάρχει σε όλους τους σύγχρονους υπολογιστές).



Αναθεώρηση 77 (προσθήκη του ==)

Νέα αναθεώρηση 77 (έκδοση 8).
1. Σε αυτήν την αναθεώρηση έφτιαξα τα Ρουτίνα και Επόμενο να δουλεύουν με τόνο. Απλά πρέπει να μην έχουμε δυο ορισμούς ρουτινών ένα με Ρουτίνα Όνομα() και ένα άλλο με Ρουτινα Όνομα(). Ο μεταφραστής πρώτα ψάχνει την λέξη χωρίς τόνο και μετά με τόνο.
Στην Για Επόμενο μπορεί αν έχουμε κάνει τουλάχιστον μια επανάληψη δεν πειράζει αν έχουμε δυο Επόμενο Ι το ένα με τόνο και το άλλο χωρίς όταν κάνουμε ΄Έξοδος Για, το πρόβλημα μπορεί να υπάρξει μόνο στη περίπτωση που έχουμε έξοδο πριν γίνει η πρώτη επανάληψη και ακολουθεί μετά τη Για μια άλλη Για με την ίδια μεταβλητή. Τότε ο μεταφραστής επειδή ψάχνει πρώτα για την λέξη χωρίς τόνο, αν την βρει στην δεύτερη Για, θα περάσει αυτήν και θα εκτελέσει την αμέσως επόμενη εντολή! Άρα είναι θέμα σχεδιασμού να αποφύγουμε το λάθος. Εννοείται πως αν δεν χρησιμοποιήσουμε την Έξοδος Για (Exit For) δεν έχουμε πρόβλημα με την Επόμενο αν έχει ή όχι τόνο.

Α=10 : Χ=40 : Β=0
Διαμέσου Αλφα(10, &Β) \\ πέρασμα με αναφορά της Β
Τύπωσε Χ, Β
Διαμέσου Αλφα(40, &Β)
Τύπωσε Χ, Β
Διαμέσου Αλφα(70, &Β)
Τύπωσε Χ, Β


Ρουτίνα Αλφα(Χ, &Γ)
            Αν Χ>50 τοτε έξοδος ρουτίνας
            Γ+=Χ*Α
            τύπωσε "ΟΚ", Γ
Τέλος Ρουτίνας

(το Χ πρέπει να μένει στο 40, η 76 αναθεώρηση είχε λάθος και το διόρθωσα στην 77)
Άλλο ένα ενδεικτικό πρόγραμμα με χρήση ρουτινών, και πέρασμα πίνακα με αναφορά και με αντιγραφή.
Πίνακας β(100)=13, α(10)=10
Διαμέσου τυπ(α())
Τύπωσε α(1)
Διαμέσου γεμισε(&α(), 12)
Τύπωσε α(1), β(10)
λιστα   \\ μας δίνει λίστα μεταβλητών-πινάκων.


Ρουτίνα γεμισε(&β(),χ)
      α=διάσταση(β(),1)
      Πινακας β(α)=χ \\ αλλάζουμε μέγεθος και βάζουμε σε όλα τα στοιχεία το Χ
Τελος Ρουτίνας
ρουτίνα τυπ(β())
      β(1)++
      τύπωσε β(1)
τέλος ρουτίνας
2. Η Για Έως Ανά {} όπως και η Για Έως Ανά Επόμενο έγιναν πιο σωστές γιατί:
Γη για με πραγματικό αριθμό είχε θέμα με την στρογγυλοποίση, το οποίο μεν το έφτιαξα στην αναθεώρηση 74, αλλά βγήκε άλλο και φάνηκε στο παράδειγμα με τα λουλούδια όπου αντί για δεκάξι πέταλα έβγαζε 15. Το πρόβλημα το έλυσα φυσικά. Έβαλα μισό βήμα στο τελικό όριο, προσθέτοντας ή αφαιρώντας ανάλογα. Επιπλέον έβγαλα την στρογγυλοποίηση από την εσωετική μεταβλητή ελέγχου και την έβαλα στην εξωτερική μεταβλητή  ελέγχου Π.χ. στην Για Ι=.1 εως 1.5 ανά .1 {} η Ι είναι η εξωτερική μεταβλητή, ενώ από μέσα υπάρχει άλλη που κρατάει τον λογαριασμό, και για το λόγο αυτό αν κάτι αλλάξει την μεταβλητή μέσα στο μπλοκ, η επανάληψη δεν θα αλλάξει, θα συνεχίσει κανονικά, εκτός και αν κάνουμε έξοδο, εδώ δεν βάζουμε "έξοδο για" αλλά απλά την λέξη έξοδος, γιατί έχουμε μπλοκ, και το μπλοκ βγαίνει εκτάκτως.. με έξοδο!

3. Επιπλέον έκανα βελτιστοποιήσεις και για τις περιπτώσεις στη Για που έχουμε Ακέραιο (Ι%) ή Μακρύ (Μακρύς είναι ο 32Bit Long). Μάλιστα ειδικά για τον Long άλλαξα τις εσωτερικές μεταβλητές σε τύπου Long και βελτιώθηκε η ταχύτητά του. Ο Ακέραιος είναι αρκετά μεγαλύτερος από τον Μακρύ αλλά τον Μακρύ μπορούμε να τον χρησιμοποιήσουμε σε κλήσεις του λειτουργικού (και για τον λόγο αυτό υπάρχει στη Μ2000). Εδώ να σημειώσω ότι μέσα στους στόχους της έκδοσης 8 είναι και η κάλυψη της μνήμης -δομής, τα Structure των Windows, όπου βάζουμε και διαβάζουμε τιμές που δίνουμε και παίρνουμε σε κλήσεις στο λειτουργικό.

4.Ένας νέος χειριστής (operator) προστέθηκε στον εκτελεστή εκφράσεων, και αυτό είναι το διπλό ίσον. Το διπλό ίσον κοιτάει αν δυο αριθμοί είναι ίσοι με την έννοια ότι στα δέκα πιο σημαντικά νούμερα είναι ίδιοι. Τι σημαίνει πιο σημαντικά; Υπάρχει μια μαθηματική φόρμουλα που δείχνει αν δυο αριθμοί είναι σε ίδια τάξη μεγέθους.

α=0.9 : β=0.9 : κ=1
ενώ α>-1.1 {
            α-=.1
            λ=β-κ*.1
            κ++
            τύπωσε α, λ, α=α, α=λ, α==λ
}


όπως βλέπουμε η τέταρτη στήλη δεν βγάζει πάντα ισότητα, αντίθετα η έκτη βγάζει!

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

? 1.2344e+10==1.234399999999e+35 \\ δεν είναι ίσα  έχουν διαφορά στη τάξη μεγέθους
? 1.2344e+35==1.234399999999e+35 \\ είναι ίσα
? 123456789000 == 123456789001 \\ είναι ίσα   επειδή το 1 δεν είναι σημαντικό
? 12345678900 == 12345678901 \\ δεν είναι ίσα επειδή το 1 είναι σημαντικό


Σε κάθε περίπτωση από τις τέσσερις με χρήση του μονού ίσον έχουμε ψευδές, μη ίσο.
Αυτό είναι τμήμα από το κώδικα για το διπλό ίσον εντός της Μ2000 (Visual Basic 6)
η τιμή r συγκρίνεται με την τιμή ac+po
    If r = 0 Then
            po = (ac + po)
            If po = 0 Then
                po = True                     ' αν είναι και τα δυο μηδέν έχουμε μηδέν.
            Else
                po = Round(po, 10) = 0  ' αν είναι το ένα τότε στρογγυλοποιούμε τον άλλο
            End If
    Else
  po = Round((((ac + po) - r) / r), 10) = 0  'αλλιώς βάζουμε τη διαφορά τους στην τάξη μεγέθους του r
  End If
  ac = 0

? 10000==10000.0000004 \\ -1
? 10000==10000.000004 \\ 0
? 10==10.00000000004 \\ -1
? 123==123.000000004 \\ -1
? 123==123.00000004 \\ 0
? 123==123.0000004 \\ 0
? 10000.0000004==10000 \\ όπως τα  πάνω...
? 10000.000004==10000
? 10==10.00000000004
? 123.000000004==123
? 123.00000004==123
? 123.0000004==123




Παρασκευή 30 Οκτωβρίου 2015

Γραμμικό σχέδιο (Μ2000)

Στη Μ2000 μπορούμε να χαράξουμε γραμμές, καμπύλες, κύκλους, πολύγωνα, με χρήση συντεταγμένων σε twips (1440 twips 1 ίντσα, στην οθόνη μια λογική ίντσα, στον εκτυπωτή μια πραγματική ίντσα). Εδώ θα δούμε μόνο τη Χάραξε και την Θέση  (μετακίνηση σε απόλυτη θέση), με την πρώτη κύρια σε διαμόρφωση πολικών συντεταγμένων, δηλαδή με απόλυτη γωνία (0 ακτίνια είναι κατεύθυνση προς τα δεξιά, χρησιμοποιούμε το πι για τα ακτίνια)., και απόσταση (σχετική θέση). Αρνητική απόσταση σημαίνει προς την αντίθετη πλευρά, Αρνητική γωνία σημαίνει  δεξιόστροφη.

Για να κάνουμε πιο ενδιαφέρον το πρόγραμμα χρησιμοποιούμε και την χάραξε με σχετικές θέσεις (κανονικές συντεταγμένες), και με χρήση της Πάχος { } φέρνουμε δυο αξονικές γραμμές. Κατόπιν σχεδιάζουμε εικοσιένα κανονικά πολύγωνα από το τρίγωνο μέχρι και το εικοσιτριάγωνο! Μάλιστα εναλλάσσουμε το πάχος κάθε πλευράς από 1 έως 2 εικονοστοιχεία (εδώ το πάχος δεν είναι σε twips, πχ για οθόνη 96 dpi το εικονοστοιχείο έχει μέγεθος 15 twips, εδώ με 2 βάζουμε δυο pixels μέγεθος γραμμής). Επιπλέον παίζουμε λίγο με το χρώμα φτιάχνοντας με την συνάρτηση Χρώμα( ) την τιμή RGB που θέλουμε για κάθε πλευρά, σε όλα τα πολύγωνα!

Η οθόνη μας έχει Χ.ΣΗΜΕΙΑ πλάτος σε twips και Υ.ΣΗΜΕΙΑ ύψος σε twips. Η αρχή των αξόνων είναι πάνω αριστερά, και το ύψος αυξάνεται προς τα κάτω. (οι ΚΛΙΜΑΞ.Χ και ΚΛΙΜΑΞ.Υ είναι ακριβώς οι ίδιες τιμές με τις Χ.ΣΗΜΕΙΑ και Υ.ΣΗΜΕΙΑ. Αυτό ειναι το μέγεθος ενός επιπέδου. Η  Μ2000 έχει το περιθώριο, το βασικό επίπεδο και 32 ακόμα επίπεδα. Εδώ χρησιμοποιούμε το βασικό επίπεδο. Τα 32 επίπεδα είναι τύπου raster και όχι διανυσματικά. Αυτό σημαίνει ότι μπορούν να χρησιμοποιηθούν ως σελίδες, ή ως επικαλύψεις. Μπορούμε να εμφανίσουμε διανυσματικά γραφικά από αρχείο τύπων emf, wmf, με πραγματικά διάφανο φόντο, αλλά γίνεται με συγχώνευση στο υπάρχον σχέδιο. Θα τα δούμε αυτά σε άλλη ανάρτηση!
Θα μπορούσε κανείς βασικά σχήματα να τα έχει σε τμήματα που θα καλεί για να τα εμφανίζει στη θέση του δρομέα γραφικών, δείτε το παράδειγμα με τις σκακιέρες!

οθόνη 1,0 \\ μπλε χρώμα, χωρίς χωριστή οθόνη
κ=0
ανανέωση 5000
\\ κάνουμε την αυτόματη ανανέωση πιο αργή, ανά 5 δευτερόλεπτα
πάχος 1, 3 { \\ αξονική γραμμή - μόνο για πάχος 1
      θέση χ.σημεία, υ.σημεία/2
      χάραξε -χ.σημεία
      θέση χ.σημεία/2, υ.σημεία
      χάραξε , -υ.σημεία
      }
για ν=3 έως 23 {
      α=ν/2/πι
      β=χ.σημεία/3/ν+ν*10
      \\ απόλυτη θέση
      θέση χ.σημεία/2, υ.σημεία/2
      κ+=πι/10
      λ=1
      για ι=1 έως ν {
           πάχος λ {
                 \\ πολικές συντεταγμένες: απόλυτη γωνία σε ακτίνια, σχετική απόσταση
                 \\ η χάραξε  έχει τρεις μορφές
                 \\ χάραξε γωνία  απόλυτη_γωνία,  απόσταση  [, χρώμα]
                 \\ χάραξε απόσταση_κατά_χ [, απόσταση_κατά_ψ [, χρώμα]]
                 \\ χάραξε έως απόλυτη_θέση_χ, απόλυτη_θέση_ψ [, χρώμα]
                  χάραξε γωνία ι/α+Κ, β, χρώμα(255*ν/24, 255*ι/ν, 255-255*ι/ν)
            }
            λ=3-λ
      }
}
\\ τώρα επαναφέρουμε την αυτόματη ανανέωση ανά 0.025 δευτερόλεπτα
ανανέωση 25




Γ Κ

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


οθόνη 1,0 \\ μπλε χρώμα, χωρίς χωριστή οθόνη
κ=0
\\ ανανέωση 5000
\\ ΔΕΝ κάνουμε την αυτόματη ανανέωση πιο αργή, ανά 5 δευτερόλεπτα

για ν=3 έως 23 {
      α=ν/2/πι
      β=χ.σημεία/3/ν+ν*10
      \\ απόλυτη θέση
      θέση χ.σημεία/2, υ.σημεία/2
      κ+=πι/10
      λ=1
      για ι=1 έως ν {
           πάχος λ {
                 \\ πολικές συντεταγμένες: απόλυτη γωνία σε ακτίνια, σχετική απόσταση
                 \\ η χάραξε  έχει τρεις μορφές
                 \\ χάραξε γωνία  απόλυτη_γωνία,  απόσταση  [, χρώμα]
                 \\ χάραξε απόσταση_κατά_χ [, απόσταση_κατά_ψ [, χρώμα]]
                 \\ χάραξε έως απόλυτη_θέση_χ, απόλυτη_θέση_ψ [, χρώμα]
                  χάραξε γωνία ι/α+Κ, β, χρώμα(255*ν/24, 255*ι/ν, 255-255*ι/ν)
            }
            λ=3-λ
      }
      πάχος 1, 3 { \\ αξονική γραμμή - μόνο για πάχος 1
      θέση χ.σημεία, υ.σημεία/2
      χάραξε -χ.σημεία
      θέση χ.σημεία/2, υ.σημεία
      χάραξε , -υ.σημεία
      }
      αναμονη 10
      οθονη
}
\\ τώρα επαναφέρουμε την αυτόματη ανανέωση ανά 0.025 δευτερόλεπτα
ανανέωση 25

Πέμπτη 29 Οκτωβρίου 2015

Μάθημα μετρήματος! Twips Pt και Pixes

Ένα μικρό πρόγραμμα που δείχνει την σχέση του μεγέθους γραμματοσειράς σε pt, με τα dpi του μέσου που θα εμφανιστούν τα γράμματα και τα twips, της υποδιαίρεσης της ίντσας (πάντα 1440 twips είναι μια ίντσα). Υπάρχει νέα αναθεώρηση 74 (μικρές εσωτερικές βελτιώσεις, και ένα σπάνιο bug)


τυπωσε $(4) \\ αναλογική γραφή
δες οκ {
Διάβασε α \\ τιμή σε Pixels  , αν δεν δώσουμε τιμή τότε βάζει το πρόγραμμα το 24
}
αν οχι οκ τότε α=24
β=1440/96 \\ 1440 twips έχει μια ίντσα. 96 dpi σημαίνει 96 pixels σε μια ίντσα
Τύπωσε μορφή$("τα {0}pt μέγεθος χαρακτήρα έχουν μέγεθος σε 96dpi: {1}twips",α, α*β)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε pixels {1}", α, α*96/72)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε twips {1}", α, α*96/72*β)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε ίντσες {1:2}", α, α*96/72*β/1440)
τυπωσε
β1=1440/120 \\ 1440 twips έχει μια ίντσα. 120 dpi σημαίνει 120 pixels σε μια ίντσα
Τύπωσε μορφή$("τα {0}pt μέγεθος χαρακτήρα έχουν μέγεθος σε 120dpi: {1}",α, α*β1)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε pixels {1}", α, α*120/72)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε twips {1}", α, α*120/72*β1)
Τύπωσε μορφή$("μέγεθος χαρακτήρα  {0}pt σε ίντσες {1:2}", α, α*120/72*β1/1440)


Από το παραπάνω πρόγραμμα βλέπουμε ότι μια γραμματοσειρά μεγέθους 24pt (24άρια γράμματα) θα έχουν ύψος 0.33 ίντσες ανεξάρτητα από το πόσα dpi έχει το μέσο εκτύπωσης (το ύψος δηλώνει το μέγεθος το γραμμάτων, όμως ακόμα και αυτή η έννοια στις γραμματοσειρές είναι πιο σύνθετη απ΄ότι φαίνεται, διότι υπάρχουν περιθώρια και το λεγόμενο ύψος βάσης γραμμής ή baseline).

Επίσης φαίνεται ότι όταν τα dpi είναι περισσότερα μια 24άρα γραμματοσειρά θέλει περισσότερα pixels για κάθε χαρακτήρα, άρα μικρότερα "δοντάκια" άρα καλύτερη εμφάνιση. Π.χ. στα 120 dpi έχουμε 40 pixels ύψος ανά χαρακτήρα, ενώ στα 96 έχουμε 32 pixels.

Δείτε έναν πίνακα εδώ με τις σχέσεις pixels και pt.

Δείτε όμως πως το λειτουργικό σύστημα τα αλλάζει όλα: Όταν για παράδειγμα δεν έχουμε συγχρονίσει τα 1440 twips με την μια ίντσα τότε δεν βλέπουμε μια γραμματοσειρά 24άρα ως μια 24άρα...αλλά όμως έχουμε επακριβώς τα 32pixels... επειδή ψευδώς το λειτουργικό πιστεύει ότι η οθόνη έχει 96 dpi. Έτσι έχουμε δυο ψεύτικες αναλογίες οι οποίες όμως μας δίνουν για τα 24άρια γράμματα τα ίδια Pixels. Το πρόβλημα υπάρχει αν υπολογίζουμε σε Pixels και βγάζουμε το κείμενο σε εκτυπωτή. Διότι οι εκτυπωτές εξ ορισμού έχουν πάντα αληθινά dpi, έτσι τα 1440 λογικά twips είναι πράγματι 1440 πραγματικά twips, δηλαδή μας κάνουν μια ίντσα!
Που υπάρχει πρόβλημα; Όταν για παράδειγμα θέλει κάποιος να προσαρμόσει γράμματα σε εικόνα, και η εικόνα είναι σε pixels τότε λογαριάζει τα pixels από την γραμματοσειρά, αλλά το μέγεθος της εικόνας πάνω στο χαρτί αν το λογαριάσουμε σε pixels τότε ανάλογα με τα  dpi του χαρτιού θα αλλάζει, ώστε λίγα dpi στο χαρτί σημαίνει μεγάλο μέγεθος εικόνας (θέλει περισσότερες ίντσες για να καλύψει κάθε pixel στον εκτυπωτή με κάθε pixel εικόνας).
Αν τοποθετούμε εικόνες με μέγεθος σε twips σημαίνει ότι μειώνουμε ή αυξάνουμε τα pixels για να ταιριάξουμε την εικόνα στα pixels της εξαγωγής (στην οθόνη ή στον εκτυπωτή). Αν κρατάμε εικόνες με μεγάλα Dpi σημαίνει ότι θα έχουμε καλύτερη ποιότητα σε εκτυπωτή απ΄ότι σε οθόνη, αφού ο εκτυπωτής ζητάει περισσότερα pixels για ίδια twips (ή για μια ίντσα αν δώσουμε ένα κοινό μέγεθος, είναι το ίδιο).  Όμως αν ένα πρόγραμμα ήταν γραμμένο να εμφανίζει εικόνες μόνο στην οθόνη τότε οι προγραμματιστές θεωρούσαν ότι τα dpi οθόνης θα είναι 96 και έτσι έβαζαν εικόνα με 96 dpi. Επειδή σε Mac τα dpi είναι 72, σημαίνει ότι εκεί θα έχουμε και περίσσευμα. Έτσι με εικόνα 96dpi έχουμε καλή σύμπτωση με τις οθόνες (και σε μια οθόνη 96dpi θα έχουμε αναλογία 1 προς 1, κάθε pixel της εικόνας θα πέσει σε ένα pixel της οθόνης). Με αυτό το σκεπτικό οι προγραμματιστές έφτιαχναν τα πάντα με την σκέψη των 96dpi, και τοποθετούσαν τα γράμματα με αυτό το σκεπτικό πάνω στις εικόνες. Τι συμβαίνει όμως όταν ανεβαίνουν οι αναλύσεις αλλά μικραίνει το μέγεθος της εικόνας (όπως στα tablets). Συμβαίνει ότι τα dpi θα αλλάξουν, πάρα πολύ. Για να ταιριάξει κανείς 24άρια γράμματα με εικόνα θα το κάνει αλλά ο χρήστης θα βλέπει μια μινιατούρα. Οπότε θα πρέπει να "ζουμάρει". Και τότε θα δει τα ωραία δοντάκια! Αν το πρόγραμμα δεν λογαριάζει χωριστά χαρακτήρες με εικόνες (bitmap), τότε το ζουμ θα φέρει ή μετακίνηση της εικόνας αφήνοντας μεγάλο περιθώριο κάτω από τα γράμματα, ή αν ακολουθήσει η εικόνα (που είναι το σωστό), τότε θα έχουμε εμφάνιση της χαμηλής ποιότητας, αφού δυο ή περισσότερα pixels της "πλούσιας" σε pixel οθόνης θα καλύπτονται από ένα και μόνo pixel της φτωχής σε pixel εικόνας.
Μια άλλη πρακτική είναι να κάνουμε το ράστερ των γραμμάτων  (τα pixels τους) πριν την μεγέθυνση. Αυτό σημαίνει ότι κατά τη μεγέθυνση δεν θα υπολογίζονται ενδιάμεσα μεγέθη γραμμάτων, και όταν αφήσουμε το ζουμ, τότε να υπολογιστεί το τελικό ράστερ. Αυτό το βλέπουμε σε προγράμματα που κατά το ζουμ η ποιότητα είναι μικρή ενώ η ταχύτητα αλλαγής μεγέθους μεγάλη και μόλις το αφήσουμε σε ηρεμία έρχεται μια ποιοτική εικόνα. Το κάνει αυτό ο Acrobat Reader. Σε κάθε περίπτωση ο υπολογισμός γίνεται με βάση το λόγο Pixels Τελικής Προβολής προς Pixels αρχικής Προβολής. Η αρχική προβολή είναι η υποθετική στα 96 dpi. Να γιατί έχουν εγκαταλειφθεί τα twips, αφού είδαμε ότι και αυτά είναι ψεύτικα, αφού δεν κάνει κανείς χρήστης την λειτουργία που έχουν τα windows για να ορίσουμε μια ίντσα στην οθόνη να είναι μια πραγματική ίντσα, και έτσι έχει το μέτρο για να βγάζει 1440twips γραμμή ως μια ίντσα γραμμή.
Στη Μ2000 όλα είναι σε twips (ο τύπος χαρακτήρων (το μέγεθος δηλαδή) είναι σε pt). Αυτό ήταν επιλογή γιατί μια από τις κύριες χρήσεις της γλώσσας είναι το σχέδιο, και οφείλει να βγαίνει στο χαρτί με το μέγεθος που θέλουμε, και εκεί τα twips είναι πραγματικά (1440 twips μια ίντσα). Για την οθόνη μας δεν μας πειράζει επειδή ότι φτιάχνουμε έχει να κάνει με τις θέσεις χαρακτήρων (σαν κάναβος ένα πράγμα), ή με την σχετική θέση π.χ. το χ.σημεία δίνει το πλάτος σε twips. Μπορώ να φορτώσω μια εικόνα στο σημείο του δρομέα γραφικών (π.ψ Θέση 6000,6000 πάει τον δρομέα στο 6000,6000) και να δώσω στην εντολή απεικόνισης το πλάτος σε twips και το ύψος όσο βγαίνει χωρίς να χαλάει την αναλογία, ή να δώσω ένα ύψος, άρα να χαλάσω την αναλογία ύψους πλάτους.

Αν έχω μια φωτογραφία π.χ. C:\alfa\beta.jpg  η εντολή Εικόνα "C:\alfa\beta.jpg", 1000 βάζει την εικόνα στο δρομέα γραφικών ( ως πάνω αριστερή γωνία) και πλάτος 1000 twips (1000/1440 υποτίθεται της ίντσας στην οθόνη, αλλά πραγματικό μέγεθος στον εκτυπωτή, ανεξάρτητα από πόσα dpi είναι ο εκτυπωτής). Αν θέλω να χωρίσω την οθόνη μου σε 8 στήλες για παράδειγμα όπου θα βάζω φωτογραφίες, θα πρέπει να πάρω το χ.σημεία/8 ως πλάτος στήλης, Η εντολή βήμα χ.σημεία/8, 0 πάει τον δρομέα δεξιά κατά χ.σημεία/8 (σχετική θέση). Ενώ η εντολή θέση χ.σημεία/8*3, 2000 πάει στην 4η στήλη στο ύψος 2000 (0 η πρώτη, 1 η δεύτερη, 2 η τρίτη, άρα 4 η τέταρτη).
'Ετσι δεν ασχολούμαστε με Pixels (η Μ2000 έχει εντολές για περιστροφή εικόνας, ακόμα και για διαφάνεια, και δεν ειδικεύεται ως γλώσσα στην επεξεργασία pixels, στην 9η έκδοση θα βάλω κάτι τέτοιο, δηλαδή επεξεργασία pixels, βίντεο και ήχου, αλλά αργεί ακόμα, θέλω να βάλω και ενσωματωμένο assembler αλλά είναι κομμάτι δύσκολο, όποιος θέλει να συνεισφέρει στο έργο..ας επικοινωνήσει μαζί μου).




Εκτύπωση και Προεπισκόπηση (Μ2000)

Στην αναθεώρηση 73 βελτίωσα πολύ την εκτύπωση. Εδώ ένα παράδειγμα με προεπικόπηση εκτύπωσης!

Αν θέλουμε να αλλάξουμε εκτυπωτή κάνουμε αυτό:
Εκτυπωτής ?
Εκτυπωτής 12, Επιλογή$(Επιλογή)
ή καλύτερα για να αποκλείσουμε την μη επιλογή (είναι το Επιλογή=0), μέσα από πρόγραμμα
Αν Επιλογή>0 τότε Εκτυπωτής 12, Επιλογή$(Επιλογή)
Η εντολή Εκτυπωτής ? γεμίζει τον πίνακα Επιλογή$() με όλους τους εκτυπωτές - και εκείνους στο δίκτυο.

Αν θέλουμε να αντιγράψουμε το όνομα για να το βάλουμε ως μόνιμη επιλογή στο πρόγραμμα τότε κάνουμε αυτό
Πρόχειρο Εκτυπωτής$
και στον διορθωτή κάνουμε επικόλληση  (ctrl+v) αφού γράψουμε το Εκτυπωτής 12,""
Το 12 λέει απλά να είναι 12άρια τα γράμματα. Αλλά αυτά θα αλλάξουν με την εντολή Φόρμα.
Οπότε την εντολή αυτή θα την βάλουμε πρώτη!

          \\ Ένα παράδειγμα προεπισκόπησης εκτύπωσης
          \\ Επιπλέον φαίνεται και η χρήση των προς και διαμέσου 
          \\ Το πρόγραμμα θα ετοιμάσει δυο σελίδες, θα μας τις δείξει
          \\ πατάμε ένα πλήκτρο για την επόμενη
          \\ και θα μας ρωτήσει με ένα πλαίσιο διαλόγου αν θέλουμε να τυπώσουμε
          \\ Εδώ μπορούμε να έχουμε επιλέξει εκτυπωτή, με τις παρακάτω εντολές:
           \\ Εκτυπωτής \\ δείχνει τον εκτυπωτή που θα χρησιμοποιήσει
          \\ Εκτυπωτής ? \\ βγάζει λίστα για επιλογή εκτυπωτή
          \\ Εκτυπωτής ! \\ βγάζει τις ιδιότητες για να τις αλλάξουμε, αν θέλουμε
          \\ Μπορεί κανείς να χρησιμοποιήσει το OneNote για να δει την εξαγωγή χωρίς να τυπώσει!
    
                       Με_Εκτύπωση = Ψευδές
                      Σελίδα 1 \\ κάθετη 1, οριζόντια 2. Εδώ θέλουμε κάθετη.
           εδώ_ξανά: \\ αυτό λέγεται ετικέτα με όνομα. Μόνο σημειώσεις μετά στην ίδια γραμμή!
                       Φόρμα 64, 66;
                       Τύπωσε "Αυτή είναι η πρώτη Σελίδα"
                       Τύπωσε Γραμματοσειρά$, Τύπος
                      Δρομέας 0, Ύψος / 2
                       \\ η Τύπωσε μέρος πετάει τις αλλαγές* και δεν αλλάζει γραμμή
                      \\ *Εδώ η αλλαγή είναι στο $(6, πλάτος), όπου ορίζω με το 6 αναλογική γραφή,
                       \\ κεντράρισμα, και πλάτος στήλης όλη τη γραμμή.
                       Τύπωσε Μέρος $( 6, Πλάτος ), "Κέντρο"
                       Θέση Χ.Σημεία / 2, Υ.Σημεία / 2
                       Κύκλος Χ.Σημεία / 2
                       \\ Θα διαβάσουμε τα ύψος, πλάτος σε σημεία (twips)
                       \\ Και θα φτιάξουμε μια όμοια σελίδα στην οθόνη
                      \\ αντιστρέφοντας πλάτος με ύψος
                      \\ θα βάλουμε το ίδιο μέγεθος χαρακτήρων
                      Πλ = Χ.Σημεία
                      Υψ = Υ.Σημεία
                      μέγεθος_χαρακτήρων = Τύπος
                      Διαμέσου Περιμένω_Πάτημα_Πλήκτρου( Με_Εκτύπωση )
                       Διαμέσου Οριζόντια_Σελίδα( Με_Εκτύπωση )
                       Αναφορά 2, "Αυτή είναι μια οριζόντια Σελίδα, η 2η."
                       Θέση Χ.Σημεία / 3, Υ.Σημεία / 2
                       Κύκλος Υ.Σημεία / 3
                       Βήμα Χ.Σημεία / 3, 0
                       Κύκλος Υ.Σημεία / 3
                       Αν Οχι Με_Εκτύπωση Τότε {
                                   Αν Ρώτα( "Να τυπώσω τώρα;" ) = 1 Τότε {
                                         Εκτύπωση Ναι
                                        Πένα 0
                                         Με_Εκτύπωση~ \\το κάνει Όχι Με_Εκτύπωση
                                        Προς εδώ_ξανά
                                  }
                       }Αλλιώς {
                              Εκτύπωση Οχι
                      }
                       Φόρμα 60, 30


                       \\ Ο διερμηνευτής βρίσκει το Ρουτινα και τερματίζει το τμήμα!
                       \\ Ενώ γενικά όπου θέλουμε βάζουμε τόνους
                       \\ Στο Ρουτινα στον ορισμό δεν βάζουμε τόνο,
                       \\ γιατί ο διερμηνευτής αναζητεί τη λέξη χωρίς τόνο,
                       \\ για να βρει τον ορισμό της ρουτίνας
                       \\ οι ρουτίνες δεν καταχωρούνται όπως τα τμήματα, είναι μέρη του τμήματος, με όνομα.

           Ρουτινα Οριζόντια_Σελίδα( Τοπική_Να_Τυπωσω )
                       Αν Τοπική_Να_Τυπωσω Τότε {
                             Σελίδα 2
                       }Αλλιώς Τύπος μέγεθος_χαρακτήρων, Υψ, Πλ
          Τελος Ρουτινας
          Ρουτινα Περιμένω_Πάτημα_Πλήκτρου( Τοπική_Να_Τυπωσω )
                       Αν Οχι Τοπική_Να_Τυπωσω Τότε {
                              ? "Περιμένω..."
                              ένα_πλήκτρο$ = Κομ$
                        }
           Τελος Ρουτινας






 


Με ΦΟΡΜΑ 70,70 μπορούμε να δούμε όλο το πρόγραμμα (το αντέγραψα από εδώ...). Το πρόγραμμα που το χρωματίζει σε html είναι παλιό, και βάζει διαστήματα...στα σύμβολα. Θα το φτιάξω και θα το ενσωματώσω στο περιβάλλον.





Τετάρτη 28 Οκτωβρίου 2015

Προγραμματισμός μουσικής με νότες (Μ2000)

Παρακάτω είναι ένα πρόγραμμα που παίζει δυο φωνές με νότες που έχουμε γράψει. Επίσης η μουσική παίζει στο περιθώριο, ενώ τρέχουμε δυο βρόχους και κάνουμε εισαγωγή αριθμού και αναμονή για πάτημα πλήκτρου!
Το περιβάλλον προγραμματισμού πέρα από τις βασικές εντολές έχει αρκετές άλλες για να γίνει πιο αποδοτικό και ευχάριστο στον χρήστη, που κύρια είναι ο Μαθητής...Το όνομα της γλώσσας είναι Μαθητής 2000 όχι της χρονολογίας αλλά της χιλιετίας 2000 και μετά. Το περιβάλλον της γλώσσας (η εφαρμογή που την τρέχει) γράφτηκε αρχικά σε Visual Basic 5 το 1999 ενώ σήμερα είναι σε Visual Basic 6, και μπορεί κανείς να διαβάσει τον κώδικα αν και είναι μεγάλος,- π.χ. ένα από τα βασικά κομμάτια έχει 30000 γραμμές κώδικα ενώ άλλα έχουν από 4000 ή 7000 γραμμές εντολών).


Ένταση 100 \\ στο μέγιστο, γενική ένταση
Τύπωσε "Επίλεξε όργανο:";
Επίλεξε.όργανο
'/ αρχική τιμή, χρειάζεται γιατί μπορεί να πατήσουμε esc και να μην κάνουμε επιλογή
'/ επιλογή=0 σημαίνει όχι επιλογή!
κ=49
Αν επιλογή<>0 τότε κ=επιλογή : τύπωσε επιλογη$(κ)
'/ C C# D D# E F F# G G# A A# B
'/ ένα νούμερο δίπλα είναι η οκτάβα 1 έως 5
'/ κενός χαρακτήρας είναι η παύση
'/ 800 είναι ο χρόνος του μέτρου σε χιλιοστά του δευτερολέπτου
'/ @2 χρόνος 800/2^(2-1) παίζει μέχρι @6 ή  800/32   800/2^(6-1)
'/ το V αλλάζει την ένταση τοπικά, από 1 έως 127
'/ Πάντα ξεκινάει κάθε φωνή με την κανονική ένταση
'/ Υπάρχουν 16 φωνές και 127 όργανα να επιλέξουμε ένα ανά φωνή
'/ μπορούμε να βάλουμε το ίδιο όργανο σε όσες φωνές θέλουμε


Φωνή 1, 800, "F#4@3A @3C@3DF#3@3A @2CDV80F#4@3A @3C@3DF#3@3A @2CD"
Φωνή 2, 800, "D#4@3E@2F#3 @2D#@3CD#D#4@3E@2F#3 @2D#@3CD#"
Αναφορα 3, {Ξεκινώ δυο φωνές με διαφορετικά όργανα. Παίζουν στο περιθώριο, και θα συνεχίζουν να παίζουν μόλις τερματίσει το πρόγραμμα, και γυρίσουμε στην γραμμή εντολών.
Πάτα ένα πλήκτρο
}
Α$=Κομ$ \\ περιμένει ένα πλήκτρο
Παίξε 1, κ, 2, 51
Καθαρό ι \\ πλεονασμός αλλά δείχνει ότι μπορούμε να ορίσουμε μια μεταβλητή, επιπλέον παίρνει λίστα ονομάτων!
για ι=1 εως 500 {
      τύπωσε ι
}
Επανέλαβε {
      Τύπωσε ι
      ι++
} μέχρι ι>1000

\\ η μουσική παίζει και κατά την διάρκεια της εισαγωγής!
\\ αυτό συμβαίνει γιατί τρέχει σε δικό της νήμα!
\\ Αν πατήσει κανείς enter χωρίς να δώσει αριθμό βγαίνει λάθος
\\ οπότε το κλείνουμε σε μια Δες

δες οκ { Εισαγωγή "Δώσε έναν αριθμό (με 1 κλείνω τη μουσική):", κ }
αν οχι οκ τοτε τύπωσε ' να αλλάξουμε γραμμή!
Αν κ=1 τότε Παίξε 0 ' κλείνει άμεσα την μουσική

Αναφορά {Πάτα ένα πλήκτρο. Περιμένω πλήκτρο ενώ παίζει η μουσική}
Α$=Κομ$




Αναθεώρηση 72

Αναθεώρηση 72.
(μια μικρή διόρθωση στην 71, για να βγαίνουν σε Ελληνικά το Περιβάλλον Μ2000...είχε χαλάσει με την αλλαγή των ρουτινών εκτύπωσης. Τώρα είναι ΟΚ)

Έφτιαξα την ROUND() για στρογγυλοποίηση, (ή ΣΤΡΟΓΓ() στα ελληνικά). Επιπλέον έφτιαξα και την ΓΙΑ ΕΠΟΜΕΝΟ να λειτουργεί με χρήση στρογγυλοποίησης. Π.χ. για το διάστημα από 1. έως 1.3 ανά 0.1 πρέπει να δώσει τρεις επαναλήψεις και όχι δύο. Παρακάτω επεξηγώ και πώς δουλεύει η ΓΙΑ σε σχέση με τα όρια και το τι αφήνει στο τέλος. Επιπλέον έφτιξα στην εντολή CLEAR ή Καθαρό, όπου χωρίς παραμέτρους σβήνει όλες τις μεταβλητές και πίνακες, να μην μπορεί να σβήσει αν δεν βρίσκεται σε τμήμα που έχει ευθεία σχέση με την αρχή (τον επεξεργαστή γραμμής, από εκεί που καλούμε τα τμήματα). Υπάρχει περίπτωση ο κώδικας να τρέχει σε νήμα, οπότε δεν επιτρέπεται αυτή η εντολή και υπάρχει περίπτωση να είναι σε συνάρτηση όπου εδώ απλώς την περνάει χωρίς να την χρησιμοποιήσει (Δεν βγάζει λάθος). Παρακάτω μπορείτε να αντιγράψετε τον κώδικα σε ένα τμήμα και να το τρέξετε.

      \\ το πρόσημο στο βήμα ανα παίζει ρόλο μόνο αν αρχή και τέλος είναι ίδια
      \\ ώστε να ξέρει τι τιμή θα αφήσει στην μεταβλητή στο πέρας της για
      \\ όταν η για χρησιμοποιεί πραγματικό τότε κάνει στρογγυλοποίηση
      \\ στα όρια και σε κάθε επανάληψη στην νεα τιμή της μεταβλητής.
    
      \\ Αν αλλάξουμε την τιμή της μεταβλητής εντός της για δεν θα υπάρξει
      \\ πρόβλημα και η τιμή που δίνουμε δεν θα χρησιμοποιηθεί για τον υπολογισμό
      \\ της επόμενης τιμής. Αυτό γίνεται γιατί η πραγματική μεταβλητή ελέγχου είναι κρυφή.
    
      \\ Μπορούμε να έχουμε δυο ή περισσότερα φωλιασμένα για με την ίδια μεταβλητή
      \\ χωρίς πρόβλημα
    
      \\ Η Για {} είναι πιο γρήγορη από την Για Επόμενο
    
      \\ Μπορούμε να χρησιμοποιήσουμε ακέραια μεταβλητή με το %
      Καθαρο Α \\ είναι εδώ το ίδιο με Α=0 αλλά μπορούμε να βάλουμε λίστα ονομάτων και μάλιστα νέων
      Για Ι% = 1 Εως 20 {Α+=Ι%**2}\\ ** ή ^ για εκθέτη
      Τύπωσε Α, Ι% \\ το Ι% είναι 21


      \\ Μπορούμε να αναβαθμίσουμε έναν πραγματικό σε τύπου LONG
      Β=100
      Τύπωσε Τύπος$(Β)
      Μακρυς Β, Γ
      Τύπωσε Τύπος$(Β), Τύπος$(Γ)
      Για Β=1 Εως 20 Ανα 1.9 {}
      Τύπωσε Β \\τυπώνει 21, γιατί το βήμα ΑΝΑ έγινε 1 (αποκόπτονται τα δεκαδικά)
      \\ Και εδώ έχουμε την Γ που είναι 32bit ακέραιος
      \\ Επειδή εσωτερικά όλες οι μεταβλητές είναι τύπου Variant δεν κερδίζουμε σε ταχύτητα με τη χρήση "μικρής" χωρητικότητας
      \\ όπως ο Μακρύς. Ο κανονικός ακέραιος (με το %) παίρνει πολύ περισσότερα ψηφία.
      Β=0
      Για Γ = 1 Εως 10 Ανά 0.5 {Β++ }
      Τύπωσε Γ, Β \\ τυπώνει 1,1 γιατί θα εκτελέσει τουλάχιστον μια φορά το μπλοκ και θα δει μετά το μηδέν
    
      \\ Δεν μπορούμε να χρησιμοποιήσουμε στοιχείο πίνακα για μεταβλητή ελέγχου.
      \\ Υπάρχει μια ειδική ΓΙΑ όπου διαβάζει από τα στοιχεία πίνακα αντικείμενα και ελέγχει ιδιότητες και μεθόδους.
      \\ έτσι η ΓΙΑ Α(10) {.Χ=10 : .ΚανεΚατι 12, "Αλφα" } κάνει αυτό Α(10).Χ=10 : Α(10).ΚανεΚατι 12, "Αλφα"
    
      \\ η επόμενη εντολή σβήνει όλες τις μεταβλητές (ακόμη και αυτές που προϋπήρχαν)
      Καθαρο

     Α = 0
     Για Ι = .1 Εως .1 Ανα - .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 1 ΚΑΙ 0

     Α=0
     Για Ι = .1 Εως .1 Ανα .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 1 ΚΑΙ 0.2

     Α=0
     Για Ι = .3 Εως .1 Ανα .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 3 ΚΑΙ 0

     Α=0
     Για Ι = .3 Εως .1 Ανα - .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 3 ΚΑΙ 0
     Α=0
     Για Ι = .1 Εως .3 Ανα .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 3 ΚΑΙ 0.4
     Α=0
     Για Ι = .1 Εως .3 Ανα - .1
     Α++
     Επομενο Ι
     Τυπωσε Α, Ι \\ ΔΙΝΕΙ 3 ΚΑΙ 0.4
     \\ φωλιασμένα για με ίδια μεταβλητή
     Α=0
     Για ι = 1 Εως 5 {
           Για ι = 1 Εως 30 {
                 Α++
           }
     }
     ? Α \\ τυπώνει 150

     Α=0
     Για ι = 1 Εως 5
           Για ι = 1 Εως 30
                Αν ι = 11 Τοτε Εξοδος Για
                Α++
           Επομενο ι
     Επομενο ι
     Τυπωσε Α
\\ τυπώνει 50 γιατί κάναμε έξοδο στο 11
ο χρωματισμός έγινε με την αναθεώρηση 95 και τα διαστήματα είναι ΟΚ.