Σάββατο 21 Νοεμβρίου 2015

Αναθεώρηση 92, βελτίωση σε φόρμες διαλόγων (Μ2000)

Σήμερα βελτίωσα τις φόρμες. Άνοιγμα.Αρχείου ή Open.File και Ρώτα() ή Ask().  Μπορούμε να πατάμε το Esc και να ακυρώνουμε τη χρήση του διαλόγου. Ακόμα και αν ακυρωθεί ο πρώτος θα δώσει στο σωρό το "", δηλαδή το άδειο αλφαριθμητικό. Δίνω την εντολή Άδειασε στην αρχή για να σβήσει τυχόν τιμές από το σωρό

Αδειασε
Ανοιγμα.Αρχειου  "α.gsb",Κατ$,"Άνοιξε ένα αρχείο..Μπορείς","Αρχεία Gsb (*.Gsb)|*.gsb"
Α=Ρώτα("ok")
Σωρός
\\ διαβάζουμε από το σωρό με την Διάβασε
Διάβασε κατι$


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

Βεβαίως μπορούμε να χρησιμοποιήσουμε κάποιο αντικείμενο των windows

Άδειασε
Όρισε MsComDlg  "MSComDlg.CommonDialog"
Δες {
      Με MsComDlg, "Flags", 0x1804, "FileName" ως ιδιότητα.όνομα$,"DialogTitle", "Άνοιξε ένα αρχείο..Μπορείς"
      Με MsComDlg, "Filter",  "Αρχεία Gsb (*.Gsb)|*.gsb", "InitDir", Κατ$
      Μέθοδος MsComDlg "ShowOpen"
      Δες { Τύπωσε ιδιότητα.όνομα$}


Τύπωσε όνομα.αρχειου$(ιδιότητα.όνομα$)
Άνοιγμα.Αρχείου όνομα.αρχειου$(ιδιότητα.όνομα$),Κατ$,"Άνοιξε ένα αρχείο..Μπορείς","Αρχεία Gsb (*.Gsb)|*.gsb"
διαβασε κάτι$
Τύπωσε όνομα.αρχειου$(κατι$), ,τόπος.αρχειου$(κατι$), ,τύπος.αρχειου$(κατι$), ,αρχείου.μήκος(κατι$)
}
Όρισε MsComDlg Τίποτα


Τώρα είδαμε πώς γίνεται να ανοίξουμε το MSComDlg.CommonDialog μέσα από τη Μ2000. Εφόσον υπάρχει στο σύστημα! Και εφόσον είναι διαθέσιμο! Έτσι για να μην μπερδευόμαστε με το τι είναι ή όχι διαθέσιμο έχει το τρόπο της η Μ2000 να χρησιμοποιεί δικές τις φόρμες διαλόγων. Και μάλιστα όλες βγαίνουν το ίδιο από λειτουργικό Xp και πάνω (τρέχει και σε Linux με το Wine αλλά όχι ικανοποιητικά, υπάρχουν ακόμα θέματα με την ταχύτητα σε αυτό).

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

text a.reg {Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Licenses]
@="Licensing: Copying the keys may be a violation of established copyrights."
[HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905]
@="gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj"
}
win temporary$+"a.reg"



Εδώ είναι το δύσκολο στη σημερινή ανάρτηση!
Επίσης σήμερα έχουμε και ένα παράδειγμα με αντικείμενο ένα αντικείμενο που φορτώνει τα ονόματα αρχείων από ένα φάκελο!
Συνάμα μαθαίνει κανείς εντολές (αν και στην ουσία δεν είναι οι εντολές το πιο ενδιαφέρον αλλά το τι κάνουν αυτές, γιατί αυτό που κάνουν θα το αναζητήσει κανείς σε οποιαδήποτε άλλη γλώσσα..αν θέλει να ξεφύγει από προγράμματα αλγορίθμων).
Εδώ ξεκινάμε με το να βάζουμε το τρέχοντα κατάλογο στο κατάλογο χρήστη. Το πιθανότερο είναι να είμαστε εκεί, αλλά μετά τη γνώση...που θα πάρει κανείς από εδώ, το αμέσως πιθανότερο είναι να αλλάξει κατάλογο. Πώς λοιπόν θα ξαναγυρίσει πίσω; Δεν χρειάζεται να θυμώμαστε ποιος είναι, αρκεί μια εντολή (μάλιστα αν ξεκινήσουμε με ένα όνομα χρήστη, τότε αυτός ο κατάλογος ...Κατάλογος Χρήστη (θα είναι του χρήστη με το όνομα που δώσαμε, έτσι κάθε μαθητής στη Μ2000 να έχει το δικό του κατάλογο προγραμμάτων)
Τα προγράμματα της Μ2000 έχουν τύπο gsb και είναι σε UTF8 (δηλαδή μπορούμε στο κείμενο να γράψουμε με ότι γλώσσα θέλουμε. Εσωτερικά όταν ανοίγουμε το κείμενο γίνεται UTF16LE, έτσι δουλεύει η Visual Basic 6. O Διερμηνευτής έχει γίνει σε γλώσσα μηχανής αλλά τα "καλούδια" του όπως τα αλφαριθμητικά υποστηρίζονται από το λειτουργικό και λέγονται και εδώ είναι ένας σύνδεσμος για Nerds  BSTR)

Η κλάση δίνει δυο συναρτήσεις (θα μπορούσε να ήταν μία με το να κοιτάμε αν έχει ή όχι παράμετρο, αλλά το αφήνω σαν άσκηση αυτό).  Με την πρώτη ορίζουμε τι ψάχνουμε και μας επιστρέφει το πρώτο. Μπορούμε να δώσουμε ή όχι μονοπάτι, και το όνομα πρέπει να έχει ένα αστερίσκο ή ένα ερωτηματικό, ώστε να το πάρει σαν πρότυπο για την αναζήτηση. Αν θέλαμε απλά να δούμε αν υπάρχει ένα αρχείο τότε θα χρησιμοποιήσουμε την Υπάρχει(όνομα$) η οποία επιστρέφει αληθές, το -1 δηλαδή, αν υπάρχει το αρχείο στο τρέχον κατάλογο (εκτός και αν δώσουμε και μονοπάτι).

Στο C:\alfa\beta.txt  το C:\alfa\ είναι το μονοπάτι, το beta.txt είναι το όνομα και το .txt είναι ο τύπος.
Δείτε παρακάτω πως φτιάχνουμε το αντικείμενο Αλφα. Δεν είναι της κλάσης ο_Φάκελός_μου, στην Μ2000 δεν μπορούμε να το πούμε αυτό, αλλά είναι ένα αντικείμενο που κατασκευάστηκε με την συνάρτηση ο_Φάκελός_μου() η οποία γυρνάει ένα αντικείμενο της κλάσης ο_Φάκελός_μου. Το γιατί δεν μπορούμε να πούμε ότι η Άλφα είναι κλάση τάδε, το εξηγώ ευθέως: Η Άλφα μπορεί να τροποποιηθεί, να επεκταθεί με στοιχεία ή να αλλάξει κώδικα στις συναρτήσεις. Έτσι πρόσκαιρα η Άλφα έχει μια κατασκευή από την κλάση ο_Φάκελός_μου, αλλά είναι θέμα δικό μας αν παραμείνει έτσι! Έχει πολύ ψωμί το θέμα των αντικειμένων (μπήκαν δειλά από την 7η έκδοση ως ομάδες μεταβλητών, και έγιναν κανονικά αντικείμενα στην 8η, όταν κατάλαβα τι έπρεπε να κάνω)

Ένα άλλο που δεν είναι προφανές είναι η χρήση της λίστας επιλογών
Π.χ.
Τύπωσε "Θες θέρμανση:";
Επιλογή "Ναι","Όχι"
Αν Επιλογή>0 τότε { Τύπωσε Επιλογή$(Επιλογή) } Αλλιώς Τύπωσε Υπό "Καλά δεν ξαναρωτάω"


Μπορούμε να κάνουμε κλικ εκτός λίστας ή να πατήσουμε ESC για να μην πάρουμε επιλογή, δηλαδή Επιλογή=0. Μπορούμε να διαβάζουμε τι έχουμε στις επιλογές με το Επιλογη$() από 1 έως Επιλογές.
Η εντολή Επιλογή χωρίς παράμετρο την σβήνει. Η επιλογή βγαίνει στην τρέχουσα θέση του δρομέα και αν δεν έχει χώρο πριν βγει θα έχει πάρει κατάλληλη θέση. Υπάρχουν εντολές που μπορούμε να αλλάξουμε τα χρώματα, ακόμα και να βάλουμε επικεφαλίδα και να μην την κλείσουμε αν ανοίξει για να δουλεύει ως "toolbox". Εδώ όμως χρησιμοποιείται χωρίς καν να εμφανιστεί. Την χρησιμοποιεί η εντολή Αρχεία. Αυτή η εντολή παίρνει μια ή δυο παραμέτρους και πριν από αυτούς μπορεί να πάρει κάποιους "διακόπτες", σύμβολα δηλαδή. Π.χ. το ! κάνει ταξινόμηση κατ' όνομα, ενώ το + βάζει το αποτέλεσμα στον πίνακα επιλογών και όχι στην οθόνη. Σε αυτό το πρόγραμμα έχουμε χρησιμοποιήσει την πρώτη παράμετρο. Η δεύτερη είναι η αναζήτηση μέσα στο αρχείο. Όταν θέλω να βρω ένα αρχείο της M2000 με μια εντολή π.χ. ΔΙΑΜΕΣΟΥ δίνω αυτό:
Αρχεία "GSB","ΔΙΑΜΕΣΟΥ"
... και θα μου γυρίσει τα αρχεία που περιέχει αυτό μέσα.(ανοίγει αρχεία με μια εσωτερική μεταβλητή τύπου Έγγραφο, που σημαίνει ότι αναγνωρίζει μόνο του αν είναι ASCII, UTF8, UTF16LE και UTF16BE, και σε οποιοδήποτε ψάχνει το ίδιο πράγμα!)

Σε αυτό το παράδειγμα βλέπουμε τη χρήση της ΚΑΤΑΛΟΓΟΣ (dir) και της ΚΑΤ$ (dir$).
Επίσης πρέπει να τονίσω εδώ ότι η έννοια Encapsulation έχει μάλλον την σωστή ερμηνεία της στα αντικείμενα της Μ2000. Δεν είναι η απόκρυψη στοιχείων. Εδώ μπορούμε να διαβάσουμε το πίνακα η_Λίστα_μου$()  π.χ. Τύπωσε Αλφα.η_Λίστα_μου$(1) τυπώνει το δεύτερο στοιχείο της λίστας στην οθόνη. Αν έχω έναν πίνακα έστω Πινακας Α(100) και κάνω αυτό: Α(2)=Αλφα τότε βάζω στο Α(2) ένα αντίγραφο του Άλφα. Έτσι τώρα το Α(2).η_Λίστα_μου$(1) δίνει πάλι ότι και πριν αλλά η διαφορά είναι τεράστια! Το Α(2) είναι ένα στοιχείο σε έναν πίνακα..και περιέχει ένα αντικείμενο χωρίς όνομα! Ενώ το προηγούμενο λέγονταν Αλφα και βρίσκονταν σε ένα τμήμα έστω Α. Ο πίνακας Α() μπορεί να επιστραφεί από το τμήμα Α βάζοντάς τον στο σωρό με την Βάλε Α() και να διαβαστεί αργότερα με μια Διάβασε Γ(). Τώρα το Γ(2).η_Λίστα_μου$(1)  θα δώσει ότι και πριν αλλά δεν θα υπάρχει το Αλφα, ούτε καν η Κλάση ο_Φάκελός_μου αφού όλα αυτά θα διαγραφούν. Τα στοιχεία όμως στον πίνακα Α() που έγιναν στοιχεία του Γ() (ο Α() διαγράφτηκε στο πέρας του τμήματος) ήταν ενσωματωμένα στον πίνακα, και η έννοια Encapsulation έχει επ΄ακριβώς την έννοια της Ενθυλάκωσης (τα στοιχεία που βρίσκονται εντός στοιχείου, και πάνε μαζί με αυτό).
Εδώ στο παράδειγμα δεν δείχνουμε την Ενθυλάκωση. Τα δυο αντικείμενα Άλφα και Βήτα είναι όπως λέμε γειωμένα, στατικά, ενώ εκείνα που βρίσκονται σε στοιχεία πίνακα είναι πτητικά, μεταφερόμενα (επειδή οι πίνακες μπορούν να μεταφερθούν, να επιστραφούν αλλά όπως θα δούμε και σε άλλη ανάρτηση να μετακινήσουν τα στοιχεία τους)


Κατάλογος Χρήστη
Κλάση ο_Φάκελός_μου {
      Πίνακας η_Λίστα_μου$()
      επόμενο_στοιχείο, μετρητής
      Συνάρτηση Βρες_πρώτο$ {
            Διάβασε μονοπάτι$
            τωρινό_μονοπάτι$=κατ$
            Αν τοπος.αρχείου$(μονοπάτι$)="" Τότε μονοπάτι$=τωρινό_μονοπάτι$+όνομα.αρχείου$(μονοπάτι$)
            Αν τυπος.αρχείου$(μονοπάτι$)="" Τότε μονοπάτι$=μονοπάτι$+".txt"
            κατάλογος τοπος.αρχείου$(μονοπάτι$) ' το καθαρίζουμε αν έχει όνομα αρχείου
            Επιλογή   ' καθαρίζουμε τον πίνακα του μενού επιλογής
            \\ παρακάτω χρησιμοποιούμε το + για να βάλει η εντολή Αρχεία την έξοδο στο μενού επιλογής
            \\ χωρίς να μας το δείξει. Βάζει μόνο το όνομα, όχι τύπο και μονοπάτι
            \\ αν βάλουμε ένα θαυμαστικό θα μας ταξινομήσει το αποτέλεσμα
            Αρχεία ! + όνομα.αρχείου$(μονοπάτι$) ' του λέμε να πάρει το όνομα αρχείου ή δίνει μηδενικό
            Αν Επιλογές>0 Τότε {
            .μετρητής<=Επιλογές
            ο_τύπος_μου$="."+τύπος.αρχειου$(μονοπάτι$)
            μονοπάτι$=τοπος.αρχείου$(μονοπάτι$) '' τώρα δεν το χρειαζόμαστε με τυχόν όνομα
            Πίνακας .η_Λίστα_μου$(.μετρητής+1)
            \\ ο πίνακας Επιλογή$() είναι συνάρτηση ειδική, δεν μπορεί να αντιγραφεί άμεσα
            \\ θα βάλουμε στη λίστα όλο το όνομα
            Αν ο_τύπος_μου$=".*"  τότε {
                  Για ι=1 έως Επιλογές {.η_Λίστα_μου$(ι)=μονοπάτι$+επιλογή$(ι)}
            } αλλιως {
                  Για ι=1 έως Επιλογές {.η_Λίστα_μου$(ι)=μονοπάτι$+επιλογή$(ι)+ο_τύπος_μου$ }
            }
            Καταλογος τωρινό_μονοπάτι$
            .επόμενο_στοιχείο<=1
            =.η_Λίστα_μου$(.επόμενο_στοιχείο)
            Επιλογή  ' καθαρίζουμε το πίνακα
            } Αλλιώς { ="" }
      }
      Συνάρτηση Βρες_Επόμενο$ {
      .επόμενο_στοιχείο++
      Αν διάσταση(.η_Λίστα_μου$(),1)>.επόμενο_στοιχείο Τότε { =.η_Λίστα_μου$( .επόμενο_στοιχείο ) } Αλλιώς =""
      }
}
Έγγραφο β$
\\ μπορούμε να φτιάξουμε και άλλα αντικείμενα που θα βάλουμε τους φακέλους από άλλο μονοπάτι
αλφα=ο_Φάκελός_μου()
α$=αλφα.Βρες_πρώτο$("*.GSB")
Ενω α$<>"" {
      Αναφορα μορφη$("{0} - {1}Byte",α$, Αρχειου.Μήκος(α$))
      β$=α$+{
      } ' έβαλα και μια αλλαγή γραμμής. Στα έγγραφα το = κάνει προσθήκη
      α$=αλφα.Βρες_Επόμενο$()
}
Σώσε.Έγγραφο β$,"ΓΙΩΡΓΟΣ.txt"
\\ τώρα θα βάλουμε το αντικείμενο άλφα να ψάχνει κάτι άλλο.
\\ πρέπει το όνονα να έχει ένα ? ή * αλλιώς το δέχεται σαν τύπο
γ$=αλφα.Βρες_πρώτο$("ΓΙΩ*.txt")
ΤΥΠΩΣΕ γ$
\\ εδώ είναι ίδια  - το ονομα.αρχειου$() κάνει τα κεφαλαία σε πεζά ως έχουν.
ΤΥΠΩΣΕ ονομα.αρχειου$(γ$)=ονομα.αρχειου$("ΓΙΩΡΓΟΣ.txt")
\\ εδώ δεν είναι ίδια γιατί το πεζ$() βάζει τελικό ς για σίγμα επειδή ακολουθεί τελεία!
ΤΥΠΩΣΕ ονομα.αρχειου$(γ$)=πεζ$("ΓΙΩΡΓΟΣ.txt")


δ$=κομ$ '' περιμένουμε ένα πλήκτρο


βήτα=ο_Φάκελός_μου()
κ$=βήτα.Βρες_πρώτο$("C:\*.*")
Ενώ κ$<>"" {
      Αναφορά κ$
      κ$=βήτα.Βρες_επόμενο$()
}


Κατάλογος "c:\"
\\ μας δείχνει αρχεία
Κατάλογος ! "txt"
Κατάλογος ? ' επιλέγουμε κατάλογο
Τυπωσε Κατ$
Κατάλογος Χρήστη


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

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

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