Σε αυτήν την αναθεώρηση έκανα διάφορα!
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.
Εκτυπωτής 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 {}
Οθόνη
Και με αγγλικές εντολές. Εδώ φτιάχνουμε δυο σελίδες, τις δείχνουμε και μετά τις τυπώνουμε (αφού τις έχουμε κρατήσει σε πίνακα), όμως ελέγχουμε τον προσανατολισμό της σελίδας και ανάλογα το φτιάχνουμε πριν στείλουμε τη σελίδα.
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" όπου το Α διαβάζει αριθμό (ή και αντικείμενο, όπως ένας πίνακας αλφαριθμητικός). Αυτό γίνεται και για τις στατικές και για τις νορμάλ μεταβλητές. Έτσι μπορούμε να βάλουμε έναν πίνακα στην Α (δείκτης στο πίνακα) και αυτή να είναι στατική (μόνο δείκτες σε πίνακες προς το παρόν παίρνουν οι στατικές)
Το παράδειγμα που αρχικά σκεφτόμουν να φτιάξω και έκανα όλη αυτή την αναθεώρηση. Ένα τμήμα έχει στατική την pr ως πίνακα αλφαριθμητικών, τα οποία όμως δεν είναι γράμματα...αλλά οι ιδιότητες των εκτυπωτών (δηλαδή δυαδικά στοιχεία) τα οποία μπορούμε να τα πάρουμε και να τα εφαρμόσουμε ξανά. Έτσι μπορούμε κάθε φορά που καλούμε το τμήμα να επιλέγουμε έναν εκτυπωτή, να ορίζουμε τις ιδιότητές του (ανοίγει η φόρμα του εκτυπωτή) και αυτές σώνονται, όλα τοπικά στην στατική μεταβλητή! Κάθε φορά που επιλέγουμε εκτυπωτή ισχύει μέχρι την επόμενη επιλογή, άρα και εκτός τμήματος. Αφού όμως κάθε διαφορετικό αντικείμενο εκτέλεσης καλεί με δικό του σετ στατικών αυτό το τμήμα (δεν φαίνεται κάποιο όνομα εδώ, φαίνεται μόνο το περιεχόμενο του τμήματος), θα έχει δικές του ρυθμίσεις για όλους τους εκτυπωτές, όπως όμως τις φτιάξαμε για αυτό!
Η εντολή Επιλογή φτιάχνει την αναπτυσσόμενη λίστα (dropdown list) στην κονσόλα. Με το + λέμε να πάρει και άλλο στοιχείο, ενώ το ! λέμε να την εμφανίσει (ενώ απευθείας με αλφαριθμητικά τα εμφανίζει άμεσα). Αυτή η εντολή υπάρχει από τις πρώτες εκδόσεις της γλώσσας.
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. Η εντολή Λίστα δείχνει τώρα και τις στατικές του τρέχοντος τμήματος (παλιά δεν τις έδειχνε γιατί ήταν - και είναι- εκτός λίστας, ανήκουν στο αντικείμενο εκτέλεσης). Η εντολή αυτή με Λίστα Κ στέλνει την εξαγωγή στο αρχείο με χειριστή το Κ (το έκανε και πριν αλλά τώρα στέλνει και τις στατικές μεταβλητές.
Σε άλλο τμήμα γράφουμε:
Ιδέα για το μέλλον (σε υλοποίηση σε άλλη γλώσσα, από την Visual Basic 6, που την έχω υλοποιήσει), είναι να έχουμε πολλούς επεξεργαστές που καθένας θα είναι ένα αντικείμενο εκτέλεσης, και κατ' απαίτηση θα "τραβάει" κώδικα και θα τον εκτελεί, και ότι "Στατικό" ορίζει αυτός ο κώδικας θα το κρατάει αυτός που τον "τράβηξε".
Στη Visual Basic οι στατικές ανήκουν στο κώδικα που καλούμε και όχι στον κώδικα που καλεί!
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
α$=""
Αντέγραψε χ.σημεία, υ.σημεία στο α$
Εκτυπωτής ?
Τύπωσε Επιλογή$(Επιλογή)
Τύπωσε "Θες να αλλάξεις τις παραμέτρους του εκτυπωτή";
Επιλογή "Ναι", "Όχι"
Τύπωσε Επιλογή$(Επιλογή)
Αν Επιλογή=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)
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
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"
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 "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
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
Ενώ τα τμήματα/συναρτήσεις υλοποιούνται σε αντικείμενο, κατά τη κλήση, οι στατικές στο πέρας της κλήσης επιστρέφουν στο αντικείμενο που κάλεσε, και την επόμενη φορά αυτό θα τις παρέχει στο τμήμα. Έτσι αν έχουμε νήματα (που τρέχουν σε διαφορετικό αντικείμενο εκτέλεσης) και καλούν κάποιο τμήμα με στατικές, τότε κάθε νήμα θα έχει τις δικές του στατικές για το τμήμα αυτό.While not eof(f) {
line input #f, M$
Print M$
}
Close #f
Ιδέα για το μέλλον (σε υλοποίηση σε άλλη γλώσσα, από την Visual Basic 6, που την έχω υλοποιήσει), είναι να έχουμε πολλούς επεξεργαστές που καθένας θα είναι ένα αντικείμενο εκτέλεσης, και κατ' απαίτηση θα "τραβάει" κώδικα και θα τον εκτελεί, και ότι "Στατικό" ορίζει αυτός ο κώδικας θα το κρατάει αυτός που τον "τράβηξε".
Στη Visual Basic οι στατικές ανήκουν στο κώδικα που καλούμε και όχι στον κώδικα που καλεί!
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.