Δευτέρα, 15 Μαΐου 2017

Αναθεώρηση 24 (Έκδοση 8.7)

Σε αυτήν την αναθεώρηση έκανα διάφορα!
1. Αφαίρεση λαθών. Είναι πολύπλοκο για να το γράψω αλλά υπήρχε ένα θέμα με τους πίνακες σε στατικές, και όχι απλά το έφτιαξα αλλά αύξησα και την λειτουργικότητα.  Δες το 3

Ένα "σοβαρό" λάθος (που δεν το είχα προσέξει, εδώ και μερικές αναθεωρήσεις), ήταν το πέρασμα με αναφορά από την γραμμή εντολών. Δηλαδή αν σε ένα τμήμα έστω Α γράψουμε αυτό:

Διάβασε
Χ++
Τύπωσε Χ


Φτιάχνουμε στη γραμμή εντολών την Ν ως Ν=10
και μετά έστω το καλέσουμε με μια  Α &Ν  στην 23η αναθεώρηση έβγαζε λάθος. Αν το καλούσαμε από τμήμα δεν υπήρχε πρόβλημα. Η Μ2000 έχει διαφορετικό διερμηνευτή για τη γραμμή εντολών, από αυτόν για κώδικα με πολλές γραμμές.
Τώρα είναι εντάξει! Κάθε φορά που καλούμε το Α &Ν η Ν αλλάζει κατά 1


2. Αναδιοργάνωση του τρόπου εκτύπωσης
Βρήκα ότι σε μερικά Pc με XP και με εκτυπωτές με μεγάλα Dpi γύρναγε λάθος η Μ2000 γιατί δεν μπορούσε να δημιουργήσει τόσο μεγάλη εικόνα (μπορούσε να δημιουργήσει DIB, αλλά για εδώ για να δουλεύουν οι ίδιες εντολές όπως και στην οθόνη έχω προτιμήσει να έχω ένα απλό PictureBox ως σελίδα εκτυπωτή.
Παλαιότερα το Οθόνη ή CLS δεν "έσβηνε" την σελίδα του εκτυπωτή, ενώ τώρα μπορούμε να δώσουμε χρώμα (μπορούσε η Φόντο (Gradient) να το κάνει, πχ η Φόντο 1,5 βάζει μια διαβάθμιση χρώματος από μπλε ως ματζέντα, ενώ το Φόντο 1,1 θα δώσει μπλε, όπως το Οθόνη 1. (οι αριθμοί από 0 έως 15 είναι τα στάνταρ χρώματα, μπορούμε να δώσουμε με html τρόπο, πχ. Οθόνη #FFAA33 ή με συνάρτηση χρώμα Οθόνη Χρώμα(255, 200, 20) σε τιμές RGB.


Τύπωσε "Επιλογή Εκτυπωτή:";
Εκτυπωτής ?
Τύπωσε Επιλογή$(Επιλογή)
Τύπωσε "Θες να αλλάξεις τις παραμέτρους του εκτυπωτή";
Επιλογή "Ναι", "Όχι"
Τύπωσε Επιλογή$(Επιλογή)
Αν Επιλογή=1 Τότε {
      Εκτυπωτής !
}
Θέση 0,0
α$=""
Αντέγραψε χ.σημεία, υ.σημεία στο α$

Εκτυπωτής 20 {
      Πένα 0 \\ μαύρα γράμματα
      Θέση 0,0
      Εικόνα Πλαίσιο α$, χ.σημεία-2000, υ.σημεία-2000,0 , "Τίτλος από κάτω"
      Σελίδα
      \\ μπορούμε να αλλάξουμε το μέγεθος γραμμάτων
      Τύπος 8
      \\ έτσι φτιάχνουμε κάρτα εικόνων, ή index card
      Θέση 1000,1000
      Εικόνα Πλαίσιο α$, 8000, 8000, 1, "Τίτλος 1"
      Θέση 9000,1000
      Εικόνα Πλαίσιο α$, 8000, 8000, 1, "Τίτλος 2"
}

\\ υπάρχει και άλλος τρόπος εκύπωσης
Οθόνη 5, 0
Πίνακας Βάση 1, Β$(10)
Σελίδα 0 \\ Landscape
Εκτύπωση Ναι
Διάστιχο 0
Φόρμα 60,66
Αναφορά {Μπλα Μπλα
      Άλλη παράγραφος
      }
\\ βγάζουμε αντίγραφο της σελίδας
Θέση 0,0
Αντέγραψε χ.σημεία, υ.σημεία στο Β$(1)
\\ διακόπτουμε την εκτύπωση
\\ Με Εκτύπωση Όχι η τελευταία σελίδα πάει στον εκτυπωτή
Εκτύπωση Διέκοψε
Οθόνη
Θέση 0,0
Εικόνα Πλαίσιο Β$(1), χ.σημεία, υ.σημεία
Ανανέωση 0
\\ πατάμε ένα πλήκτρο του ποντικιού για να συνεχίσει
Ενώ Δείκτης=0 {}
Οθόνη


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

Printer ?
Cls,0
dim base 1, Preview$(10)=""
Page 0 \\ Landscape - before printing frame only set page
Printing on
Pen 0
Mode 20
Cls 7
\\ Mode is size of font
Print "First Line", Mode, 1
Report 2,{First Line
      second line
}
Move scale.x/2, scale.y/2
circle 6000
circle
Move 0,0
copy scale.x, scale.y to Preview$(1)

Printing break \\off
Move 0,0
Image frame Preview$(1), scale.x,scale.y
a$=key$
Cls
page 1
Printing on
Pen 0 \\ Portait
linespace 0
Mode 10
Print "First Line", mode, 1
Report 2,{First Line
      second line
}
Move 0,0
Copy scale.x, scale.y to Preview$(2)
Printing break
Move 0,0
Image Frame Preview$(2), scale.x,scale.y
a$=key$
Cls
For i=1 to 2 {
Move scale.x/4,scale.y/4
Image frame Preview$(i), scale.x/2,scale.y/2
a$=key$
Cls
}
For i=1 to 2 {
      Page Abs(image.X(Preview$(i))<image.Y(Preview$(i)))
      Printing on
      Move 0,0
      Image Preview$(i)
      Printing off
}




3.Προσθήκη το Α="1212" όπου το Α διαβάζει αριθμό (ή και αντικείμενο, όπως ένας πίνακας αλφαριθμητικός). Αυτό γίνεται και για τις στατικές και για τις νορμάλ μεταβλητές. Έτσι μπορούμε να βάλουμε έναν πίνακα στην Α (δείκτης στο πίνακα) και αυτή να είναι στατική (μόνο δείκτες σε πίνακες προς το παρόν παίρνουν οι στατικές)

Static a=()
dim a$(3)="ok"
if len(a)>0 then Let a$()=a
Print a$(2)
a$(2)="ok111"
def n(a())=a()
a=n(a$())
list

 Το παράδειγμα που αρχικά σκεφτόμουν να φτιάξω και έκανα όλη αυτή την αναθεώρηση. Ένα τμήμα έχει στατική την pr ως πίνακα αλφαριθμητικών, τα οποία όμως δεν είναι γράμματα...αλλά οι ιδιότητες των εκτυπωτών (δηλαδή δυαδικά στοιχεία) τα οποία μπορούμε να τα πάρουμε και να τα εφαρμόσουμε ξανά. Έτσι μπορούμε κάθε φορά που καλούμε το τμήμα να επιλέγουμε έναν εκτυπωτή, να ορίζουμε τις ιδιότητές του (ανοίγει η φόρμα του εκτυπωτή) και αυτές σώνονται, όλα τοπικά στην στατική μεταβλητή! Κάθε φορά που επιλέγουμε εκτυπωτή ισχύει μέχρι την επόμενη επιλογή, άρα και εκτός τμήματος. Αφού όμως κάθε διαφορετικό αντικείμενο εκτέλεσης καλεί με δικό του σετ στατικών αυτό το τμήμα (δεν φαίνεται κάποιο όνομα εδώ, φαίνεται μόνο το περιεχόμενο του τμήματος), θα έχει δικές του ρυθμίσεις για όλους τους εκτυπωτές, όπως όμως τις φτιάξαμε για αυτό!
Η εντολή Επιλογή φτιάχνει την αναπτυσσόμενη λίστα (dropdown list) στην κονσόλα. Με το + λέμε να πάρει και άλλο στοιχείο, ενώ το ! λέμε να την εμφανίσει (ενώ απευθείας με αλφαριθμητικά τα εμφανίζει άμεσα). Αυτή η εντολή υπάρχει από τις πρώτες εκδόσεις της γλώσσας.



\\ feed menu - but not show
Printer +
Print "Printers:";Menuitems
Dim Base 1, Printers$(MenuItems)
Dim Properties$(MenuItems+1)
static pr=()
Print Len(pr)
\\ using Let evaluate right expression and then left
\\ Let A=B is Push B : Read A
\\ we can't use = here because pr is an arithmetic expression not a string.
If len(pr)>0 then Let Properties$()=pr : Print "Feed..ok"

For i=1 to Menuitems {
      If Menu$(i)=printername$ then Bold : k=i Properties$(i)=Properties$
      Print Menu$(i)
      Printers$(i)=Menu$(i)

      If Menu$(i)=printername$ then Bold
}
Print "Change Printer";
Menu "Yes", "No"
If menu=1 then {
      Menu
      For i=1 to len(Printers$()) { Menu + Printers$(i) }
      Menu !
      If Menu>0 then {
            Printer 10, Menu$(Menu), Properties$(Menu) \\ load saved values
            Print
            Print "You choose:";printername$
            Printer !
            Properties$(Menu)=Properties$
      }

} else {
      Print "using printer default values"
      Printer !
}
Print len(Properties$())
\\ aritmetic variables (not arrays) can evaluate string expressions
pr=Properties$()
Print len(pr)



4. Η εντολή Λίστα δείχνει τώρα και τις στατικές του τρέχοντος τμήματος (παλιά δεν τις έδειχνε γιατί ήταν - και είναι- εκτός λίστας, ανήκουν στο αντικείμενο εκτέλεσης). Η εντολή αυτή με Λίστα Κ  στέλνει την εξαγωγή στο αρχείο με χειριστή το Κ (το έκανε και πριν αλλά τώρα στέλνει και τις στατικές μεταβλητές.


\\ use Clear to clear static
Static A=15, B=20
K=1
M$="ok"
Dim A(10)=10
open dir$+"thisname.txt" for wide output as f
      list f
close #f
List

Σε άλλο τμήμα γράφουμε:

Open dir$+"thisname.txt" for wide input as f
      While not eof(f) {
      line input #f, M$
      Print M$
      }
Close #f
Ενώ τα τμήματα/συναρτήσεις υλοποιούνται σε αντικείμενο, κατά τη κλήση, οι στατικές στο πέρας της κλήσης επιστρέφουν στο αντικείμενο που κάλεσε, και την επόμενη φορά αυτό θα τις παρέχει στο τμήμα. Έτσι αν έχουμε νήματα (που τρέχουν σε διαφορετικό αντικείμενο εκτέλεσης) και καλούν κάποιο τμήμα με στατικές, τότε κάθε νήμα θα έχει τις δικές του στατικές για το τμήμα αυτό.
Ιδέα για το μέλλον (σε υλοποίηση σε άλλη γλώσσα, από την Visual Basic 6, που την έχω υλοποιήσει), είναι να έχουμε πολλούς επεξεργαστές που καθένας θα είναι ένα αντικείμενο εκτέλεσης, και κατ' απαίτηση θα "τραβάει" κώδικα και θα τον εκτελεί, και ότι "Στατικό" ορίζει αυτός ο κώδικας θα το κρατάει αυτός που τον "τράβηξε".
Στη Visual Basic οι στατικές ανήκουν στο κώδικα που καλούμε και όχι στον κώδικα που καλεί!