Προς το περιεχόμενο
  • 0

Ενημέρωση για τη Μ2000 (Γλώσσα προγραμματισμού)


M2000

Ερώτηση

Δημοσ. (επεξεργασμένο)

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

Ο κώδικας είναι ανοικτός και δωρεάν. Παράλληλα η εξέλιξη συνεχίζεται, με βελτιώσεις, καθώς και με συμπλήρωση της ενσωματωμένης βοήθειας.

Για να τρέξει το περιβάλλον χρειάζεται μόνο ένα αρχείο το m2000.exe (το οποίο είναι υπογεγραμμένο, και υπάρχει και το ca.crt ως ριζικό αρχείο αν θέλει κανείς να ενημερώσει τα windows για την υπογραφή). Όμως καλό είναι να υπάρχει μαζί το helpM2000.mdb το αρχείο με την βοήθεια στα Ελληνικά και Αγγλικά.

 

Έχω Blog στο οποίω δημοσιεύω προγράμματα που τρέχουν στο περιβάλλον της γλώσσας

georgekarras   blogspot gr (δεν το βάζω με σύνδεση για να μην κάνω referral link στο blog μου).

Τα παραπάνω αρχεία και ο κώδικας της γλώσσας (σε visual basic 6) παρέχονται μαζί σε φάκελο από το Dropbox (όπου μπαίνουν οι νέες αναθεωρήσεις). Το φάκελο αυτό το βρίσκουμε από το "Κώδικας Γλώσσας" στη σελίδα στο blog.

 

Λίγα λόγια για τη γλώσσα:

Η γλώσσα είναι διερμηνευτής που τρέχει σε δικό του περιβάλλον. Τα αρχεία που χρησιμοποιεί είναι αρχεία κειμένου σε Utf8. Όλες οι εντολές είναι και σε αγγλικά και σε ελληνικά. Η γλώσσα δεν είναι wrapper μιας άλλης γλώσσας, αλλά είναι πρωτότυπη, δηλαδή έχει στοιχεία που δεν έχουν άλλες γλώσσες (όπως και το ανάποδο, δεν έχει στοιχεία που έχουν άλλες γλώσσες). Αυτό που σίγουρα έχει είναι ότι πλησιάζει το 99% της Basic, Ενώ η Basic δεν φτάνει ούτε το 20% από την Μ2000. Και αυτό γιατί η Μ2000 έχει αντικείμενα, που η Basic δεν έχει (τέτοια αντικείμενα δεν έχει ούτε η VB6 στην οποία έχει γραφτεί η γλώσσα).

Υπάρχουν όρια στην απόδοση, όπως για παράδειγμα οι συναρτήσεις δεν μπορούν να περάσουν τις 128 συνεχόμενες κλήσεις στην αναδρομή, ενώ οι ρουτίνες μπορούν να έχουν όσο θέλουμε (βάζουμε όμως όριο αν θέλουμε). Ένα άλλο όριο είναι ότι πίνακες μπορούν να έχουν μέχρι δέκα διαστάσεις (αρκετές πιστεύω). Οι μεταβλητές έχουν ότι χαρακτήρες θέλουμε (και όσους θέλουμε) αλλά το πρώτο να είναι γράμμα και εξαιρούνται κάποια σύμβολα που έχουν νόημα όπως το ίσον. Όμως όσο μεγαλύτερα είναι τα ονόματα τόσο επιβαρύνουμε το διερμημευτή (αφού τα χειρίζεται ως έχουν και όχι με διπλή μετάφραση, σε κάτι πιο απλό). Τα αλφαριθμητικά είναι σε UTF16LE αλλά όπως στα Windows, δηλαδή δυο μόνο bytes ανά χαρακτήρα, όπως το UCS-2. Οι πραγματικοί είναι double και οι ακέραιοι είναι double χωρίς δεκαδικά! Υπάρχουν οι Long (Μακρύς) που είναι πραγματικός ακέραιος 32bit. Επίσης υπάρχει το Έγγραφο που εσωτερικά είναι λίστα συνδεδεμένων αλφαριθμητικλων (ανά παράγραφο). Τέλος υπάρχουν δυο τύποι αντικειμένων η ομάδα και το όρισμα (το τελευταίο είναι ένα κανονικό COM αντικείμενο, π.χ. μπορεί να είναι το Word)

 

Εκτός από τις κλασικές εντολές, υπάρχουν άλλες για γραφικά, εικόνες, βάσεις δεδομένων και πολυμέσα.

 

Στα υπέρ της γλώσσας είναι ότι έχει ότι χρειάζεται, δεν κάνει το χρήστη να ψάχνει για βιβλιοθήκες. Το περιβάλλον της Μ2000 είναι ένας εικονικός υπολογιστής. Μπορεί να επικοινωνεί με άλλες εφαρμογές γραμμένες σε Μ2000 μέσω σωληνώσεων!

Γράφουμε εντολές με τόνους! Π.χ. Τύπωσε 10*3, 10 δια 4     ' εδώ το διά είναι η ακέραια διαίρεση

 

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

 

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

 

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

 

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

 

Μια απλή απάντηση λοιπόν στο "γιατί τη Μ2000" είναι στο δες και σκέψου αυτό που ο άλλος το ετοίμασε στο περιβάλλον, πώς θα το ετοιμάσεις στη Python; Π.χ. στην Μ2000 μπορείς να εμφανίζεις κείμενο με αναλογική γραφή και σε πλήρη στοίχιση...Έχει η Python τέτοια εντολή; Όχι απλά πρέπει να βρει κανείς τη βιβλιοθήκη να μάθε π,.χ. προγραμματισμό σε GTK και ...τελικά τίποτα δεν γίνεται...θες τρία εξάμηνα μελέτη για να κάνεις αυτό που έχω έτοιμο! Ασφαλώς με τη C++ κάνεις τα πάντα, αν έχεις χρόνο και είσαι κλάσης προγραμματιστής, ενώ αν δεν είσαι δεν κάνεις τίποτα.

 

Η Μ2000 φτιάχτηκε για εκείνον που βλέπει τις άλλες γλώσσες και τις παρατάει αμέσως διότι δεν ξέρει τι είναι "τούτα" τα wprintf,

Η Μ2000 έχει το όμοιο με τη Basic

Για ι=1 έως 1000
Τύπωσε ι
Επόμενο ι

 

Αλλά και το πιο γρήγορο

Για ι=1 έως 1000 {
Τύπωσε ι

Οι αγκύλες είναι το μπλοκ εντολών.

 

Αυτά για την ώρα. 

Για οποιαδήποτε σκέψη ή ιδέα ας τη συζητήσουμε εδώ!

Γ.Κ.

Επεξ/σία από M2000
  • Like 4
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • Απαντήσεις 308
  • Δημιουργία
  • Τελευταία απάντηση

Συχνή συμμετοχή στην ερώτηση

Συχνή συμμετοχή στην ερώτηση

Δημοφιλή Μηνύματα

Ω, θεέ μου... Νομίζω η εικόνα αυτής της παράθεσης λέει πάρα πολλά από μόνη της. Είναι σκέτο ποίημα. Ηλικία 16-17 (3η λυκείου). Nickname Brazzers 1080p. Αυτοπροσδιορίζεται ως εθνικιστής. Τελεία. Παρά

import turtle wn = turtle.Screen() # Set up the window and its attributes wn.bgcolor("lightgreen") wn.title("Tess") tess = turtle.Turtle() # Create tess and set some attributes tess.col

Δημοσιευμένες Εικόνες

Προτεινόμενες αναρτήσεις

  • 0

Δεν βλέπω "φασιστικές απόψεις" και προφανώς κάτι πήρε στραβά ο Groot. Παρακαλώ για τις ανάγκες τις επικοινωνίας σας χρησιμοποιήστε PM..

Ευχαριστώ!

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Αν έχω καταλάβει καλά η γλώσσα που έχει φτιάξεις είναι εναλλακτική της VB. Όπως ήδη γνωρίζει ένας μεγάλος λόγος της επιτυχίας της VB είναι το GUI design και το QT σε αυτό τον τομέα είναι κορυφή , όχι μόνο γιατί τρέχει σε όλες τις πλατφόρμες , όχι μόνο γιατί έχει Native Look αλλά και γιατί στην ουσία έρχεται με το δικό του IDE , GUI designer.

 

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

 

Γενικά είμαι υπέρ της ιδέας της χρησιμοποιήσης υπάρχων βιλιοθηκών και εργαλείων αντί να τα φτιάξουμε απο την αρχή. Ωστε κάποιος να επικεντρώνεται στην δημιουργία εργαλείων που δεν υπάρχουν αντί να ανακατασκευάζει κάτι που ήδη υπάρχει και είναι κατώτερο του εναλλάκτικου.

 

Ναι με το QT η Μ2000 θα πάει έτη φωτός μπροστά στο κλάδο GUI και φυσικά θα έχει και ενα IDE με GUI designers. Δες πχ το pyQT

 

https://wiki.python.org/moin/PyQt

 

Και εννοείται υπάρχουν πολλά άλλες βιβλιοθήκες που μπορείς να προσθέσεις.

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

..........

 

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

............

 

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

H M2000 δεν είναι εναλλακτική της VB6. Είναι μια basic με αντικείμενα και τώρα έχει και φόρμες! Απευθύνεται σε μερακλήδες! Αν θες μπορείς να φτιάξεις ένα παιχνίδι σε αυτήν. Έχει sprites. Αν θες φτιάξε γραφικά. Αν θες φτιάξε κάποια βάση δεδομένων και κοίταξε τι μπορείς να κάνεις. Μπορείς να ασχοληθείς. Αν είσαι τόσο παλαβός μπορεί να την κάνεις Front End για κάτι (έχει εντολή Dos που στέλνει εντολές στην κονσόλα και Win που στέλνει εντολές στο Run).

Το καλό είναι ότι θες μόνο ένα exe και ένα mdb (αν θες το πετάς και αυτό)...και η γλώσσα τρέχει...χωρίς installation. Σε όποιοδήποτε μηχάνημα από XP και πάνω...με οποιαδήποτε γλώσσα (π.χ. Windows Αγγλικά...τρέχει κανονικά)

Επεξ/σία από M2000
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Για τη Μ2000:

Η εφαρμογή που τρέχει τη γλώσσα είναι γραμμένη σε VB6, και αυτή έχει γίνει καθαρά γλώσσα μηχανής (η VB6 κάνει compiling σε γλώσσα μηχανής ή αν επιλέξει κανείς σε bytecode, αλλά εδώ έχουμε βελτιστοποίηση σε γλώσσα μηχανής, π.χ. μια βελτιστοποίηση είναι ότι δεν κάνει ελέγχους σε δείκτες πινάκων, όπως η C).

Η Μ2000 είναι διερμηνευτής (interpreter), δηλαδή εκτελεί καθώς μεταφράζει και ένα λάθος θα το βρει στη πορεία εκτέλεσης, π.χ. to Α$=3 είναι λάθος, θα έπρεπε να βάλουμε αλφαριθμητικό, αλλά δεν θα το βρει αν δεν φτάσει ο διερμηνευτής εκεί. 

Η tokenized μορφή είναι στην ουσία ένα πρώτο πέρασμα. Με το πρώτο πέρασμα τέτοια λάθη βρίσκονται. Επίσης καθορίζονται τα άλματα και το πόσες και ποιες είναι οι μεταβλητές. Αυτό δεν το κάνει η Μ2000. Ότι είναι να το κάνει το κάνει άμεσα. Π.χ. το Α=10 θα το κάνει εκείνη την ώρα που το βρήκε, αν υπάρχει Α θα βάλει την τιμή αν δεν υπάρχει θα την φτιάξει. Δηλώνουμε πίνακες μόνο πριν τους χρησιμοποιήσουμε. Το σύστημα που ακολουθεί η Μ2000 είναι να χρησιμοποιεί ανάλυση του κώδικα την ώρα της εκτέλεσης. Θα βρει για παράδειγμα την Τύπωσε (ή στα Αγγλικά την Print), θα επισημάνει τη γλώσσα γιατί έχει σημασία για μερικά ονόματα που διαφοροποιούν την εντολή, και δεν αφήνει να μπερδέψουμε το συμπλήρωμα της εντολής με άλλης γλώσσας αναγνωριστικό, και υπάρχει ένας διερμηνευτής ειδικά για την τύπωσε (η οποία είναι πολύπλοκη εντολή, έχει και εσωτερικές εντολές, για αλλαγές χρωμάτων και άλλα πολλά).

 

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

π.χ. Ένθεση "Τύπωσε 2" είναι σαν να βάλαμε το Τύπωσε 2

ή Τύπωσε Έκφρ("Χ**2") είναι σαν να κάνουμε το Τύπωσε Χ**2

Αυτά τα δυο δεν μπορούν να γίνουν σε γλώσσα που δίνει το κώδικα από compiler γιατί τα ονόματα όπως Τύπωσε και η μεταβλητή ως όνομα Χ δεν είναι πια στο κώδικα!

 

Οι γλώσσες που εκτελούν άμεσα κώδικα ως κείμενο λέγονται και script γλώσσες. αν και αυτό μπορεί στην εκτέλεση να γίνει bytecode, ή να υπάρχει αυτό που λέγεται just in time compiler (πράγμα που σκοπεύω αργότερα να κάνω για τη Μ2000).

 

Ενδιαφέρον εδώ παρουσιάζει το τι γίνεται ο κώδικας που δίνει κανείς στη Μ2000, από την άποψη του που πηγαίνει και πώς τρέχει.Ένα πρόγραμμα σε Μ2000 έχει τμήματα, συναρτήσεις, κλάσεις, και μερικές άμεσες εντολές, μια από τις οποίες θα τρέξει το πρώτο τμήμα. Δεν υπάρχει εδώ ανάγκη να έχουμε ένα τμήμα/συνάρτηση Main. Όταν τρέχει ένα τμήμα ο κώδικάς του αντιγράφεται σε ένα αντικείμενο εκτέλεσης. Και σε αυτό το τμήμα ο κώδικας στην κυριολεξία καταναλώνεται...δηλαδή γραμμές που έχουν τρέξει αφαιρούνται! Δεν υπάρχει "program counter", υπάρχει "μη καταναλωμένος κώδικας". Ένα τμήμα μπορεί να δημιουργεί ότι και ένα πρόγραμμα, δηλαδή συναρτήσεις, τμήματα, κλάσεις. Εκτός από αυτά υπάρχουν και άλλα δυο: Οι ρουτίνες και τα νήματα. Οι ρουτίνες είναι μέρη του τμήματος/συνάρτησης και δεν έχουν δικό τους αντικείμενο εκτέλεσης. Τα νήματα δεν έχουν όνομα αλλά αριθμό και ανήκουν και αυτά στο τμήμα/συνάρτηση που τα δημιούργησε αλλά έχουν δικό τους αντικείμενο εκτέλεσης.

Τα αντικείμενα εκτέλεσης μπορούν να έχουν στατικές μεταβλητές, έτσι αν ένα τμήμα κληθεί από διαφορετικά αντικείμενα εκτέλεσης θα έχει για το καθένα διαφορετικές στατικές. Αν ένα νήμα το παράγω δέκα φορές και έχει δυο στατικές θα έχουμε 20 στατικές μεταβλητές. Τα νήματα τρέχουν παράλληλα. Υπάρχει ένας TaskManager στη Μ2000 που δέχεται κλήσεις από το Kernel (ανήκει στα Windows), σαν να κάνουμε κλικ σε button σε ένα παράθυρο. Κάθε φορά που τρέχει ο TaskManager διακόπτεται το κύριο πρόγραμμα και μπαίνει "σφήνα" το νήμα που έχει σειρά βάσει του χρόνου που δίνεται, Το κάθε νήμα δηλαδή τρέχει ανά τακτά χρονικά διαστήματα, και υπάρχουν δυο τρόποι να τρέξει μια εντολή και να γυρίσει στο TaskManager ή να τρέξει όλες τις εντολές και να γυρίσει.

Η Μ2000 έχει τα δικά της παράθυρα και τώρα ετοιμάζω και άλλα στοιχεία ελέγχου. Αυτά λοιπόν όταν κάνουμε κλικ σε ένα button ετοιμάζει ένα αντικείμενο εκτέλεσης και τρέχει τη ρουτίνα για το συγκεκριμένο button για το γεγονός αυτό.

 

Ουσιαστικά ο κώδικας της γλώσσας ρυθμίζει μια λίστα τμημάτων/συναρτήσεων μια λίστα πινάκων/μεταβλητών, (και οι δυο λειτουργούν με συνάρτηση κατακερματισμού, δηλαδή βρίσκουν το όνομα με την μία εκτελώντας μια συνάρτηση που του λέει που πρέπει να είναι στον πίνακα η μεταβλητή, και σε περίπτωση που πέσει και κάτι άλλο τότε θα είναι στο ίδιο μέρος αφού μπαίνει σε συνδεδεμένη λίστα πίσω από το πρώτο - στην ίδια θέση - αν δεν το κατάλαβες δήλωσε το να στο εξηγήσω). 

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

 

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

 

Καλό είναι να δεις το εγχειρίδιο εδώ http://georgekarras.blogspot.gr/p/2000.html και να κάνεις αντιγραφή κομμάτια και να τα τρέχεις στη Μ2000.

(αν την ανοίξεις και θες να τη κλήσεις γράψε Τέλος ή END, αν θες βάζεις τόνους στα ελληνικά δεν είναι απαραίτητο).

  • Like 1
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ανέβασα την αναθεώρηση 193.

Τώρα  τα παράθυρα της Μ2000 έχουν μια ιδιότητα "sizable" και με True (Αληθές ή Αληθής), μπορούν να αλλάξουν μέγεθος με χειρισμό με το ποντίκι (άλλαζαν μέγεθος προγραμματιστικά αλλά όχι με το ποντίκι).. Αυτό που προσφέρει το σύστημα είναι ότι αν πάμε το δείκτη στην κάτω δεξιά γωνία αλλάζει το εικονίδιο του δείκτη και μπορούμε με αλλάξουμε το μέγεθος. Παράλληλα βγαίνει ένα μήνυμα Resize() για να φτιάξουμε ή να μετακινήσουμε στοιχεία.

Επιπλέον έφτιαξα ένα τρόπο να έχουμε Popup παράθυρο πάνω από παράθυρο. Ένα τέτοιο παράθυρο δεν είναι τύπου modal (δεν μπλοκάρει δηλαδή τα άλλα παράθυρα), αλλά αν χάσει το focus τότε κλείνει. Επίσης δίνουμε και το που θα ανοίξει, ή μάλλον προτείνουμε πού θα ανοίξει, και αυτό ανοίγει με τρόπο να είναι εντός της οθόνης, δηλαδή αν δεν το παίρνει να εμφανιστεί εκεί που προτείνουμε με Χ και Υ, θα πάει προς το κέντρο της οθόνης αλλά κοντά στα Χ και Υ. Επίσης δέχεται τίτλο και και μπορούμε να μετακινήσουμε το παράθυρο popup πριν χάσει την εστίαση (focus). (κάτι που δεν το κάνουν τα popup παράθυρα - όπως το context menu- των Windows).

 

Στο παράδειγμα εδώ (στα αγγλικά), φτιάχνουμε ένα modal παράθυρο (ανοίγει πάνω από τα άλλα αφού τα κάνει ανενεργά και συμβαίνει αυτό μέχρι να κλείσει), και με δεξί κλικ στο χώρο του ανοίγει το Popup παράθυρο. Αν κάνουμε κλικ στο modal παράθυρο ή στη κονσόλα (η κονσόλα δεν κλειδώνει από το modal, αλλά δεν έρχεται και μπροστά, είναι πάντα στο φόντο, και μπορούμε να την κρύψουμε), τότε το popup φεύγει!

 

Για να είναι πιο ωραίο πρόσθεσα στο Popup ένα TextBox (είναι διαφορετικό από το EditBox - το EditBox είναι επεξεργαστής κειμένου), και έβαλα την λειτουργία όταν πατάμε enter στο textbox να αλλάζει ο τίτλος του modal παραθύρου.

 

Οι φόρμες κάνουν unload όταν δηλώσουμε Declare όνομαφόρμας Nothing, αλλά και αν πατήσουμε το Esc, όπου διακόπτουμε το πρόγραμμα και κλείνουμε παράθυρα (και νήματα κλείνει) και καθαρίζει και τις μεταβλητές. Το Esc με Escape Off βγαίνει εκτός, αλλά είναι χρήσιμο όταν θέλουμε να ετοιμάσουμε ένα πρόγραμμα και θέλουμε να το διακόπτουμε με ένα κλικ.

 

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

Μια εξήγηση για αυτήν την εντολή: With Text1,"Text" as txt$

Ο διερμηνευτής δημιουργεί ένα αντικείμενο που εμείς το βλέπουμε ως txt$. Μέσα σε αυτό υπάρχει μια αναφορά για το Text1 αντικείμενο και ένας αριθμός για την ιδιότητα "Text". Κάθε ιδιότητα αντικειμένου έχει έναν αριθμό, η With το βρίσκει και έτσι κάθε φορά που χρησιμοποιούμε το txt$ δεν χρειάζεται να αναζητούμε πάλι το όνομα. Πάντα δηλαδή εσωτερικά η ανάγνωση ή η εγγραφή σε ιδιότητα γίνεται μέσω του αριθμού - χειριστή αυτής-  που δίνει το αντικείμενο. Μπορούμε να βάλουμε και στοιχείο πίνακα π.χ. Α$(3) να έχει ένα τέτοιο αντικείμενο. Το αντικείμενο στο txt$ διαγράφεται στο τέλος εκτέλεσης του τμήματος που το έφτιαξε (με όποιο τρόπο τελείωσε αυτό, όπως και με το Esc).

 

Κανονικά κάτι που έχει οριστεί σε ένα τμήμα είναι τοπικό, και το βλέπει μόνο το τμήμα. Εδώ όμως παρατηρούμε ότι το txt$ το βλέπει η συνάρτηση Text1.Enter(). Αυτό συμβαίνει γιατί έχει κληθεί η συνάρτηση με μια Call Local, όπου βάζει το κώδικα της συνάρτησης στο χώρο του τμήματος, που έχει δημιουργηθεί η φόρμα aPopUpForm. Όμως ό,τι νέα μεταβλητή φτιάξουμε εκεί θα διαγραφεί στο πέρας της Text1.Enter(). Έτσι θα διαγραφούν και στην Form1.MouseDown() τα button, X και Υ. Τα ονόματα σε αυτές τις ρουτίνες τα επιλέγουμε με την ιδέα ότι δεν θα παίζουν τα ίδια στο τμήμα. Όμως αν θέλουμε με Local X, Y : Read X, Y μπορούμε να σκιάσουμε άλλες Χ και Υ που ξέρουμε ότι έχει το Τμήμα. Αν έχουμε να κάνουμε τοπικές με αναφορές, και επειδή δεν αφήνει ο διερμηνευτής να δώσουμε άλλη αναφορά σε υπάρχον αναφορά τότε έχουμε την Read New που δημιουργεί νέα μεταβλητή και αποδίδει και την αναφορά, μέχρι να διαγραφεί στο πέρας της συνάρτησης (στο παράδειγμα δεν έχουμε τέτοιο πράγμα). Υπάρχουν ορισμένα μηνύματα από το παράθυρο που έχουν πέρασμα τιμής με αναφορά, όπως το unload() που δίνει ένα νούμερο για να γράψουμε True και να μην κάνει Unload η φόρμα. Αλλά θα το δούμε αυτό σε άλλο παράδειγμα!

 

 

 

 

Declare Form1 Form
Declare aPopUpForm Form
With Form1, "Title", "Hello There"
With aPopUpForm, "Title", "This is a PopUp Form"
Declare Text1 TextBox Form aPopUpForm
Method Text1,"Move", 2000,2000,6000,600
With Text1,"Text" as txt$

Function Text1.Enter {
      \\ If we press enter in textbox in popup form
      \\ we change title in form1
      With Form1, "Title", txt$
}
Function Form1.MouseDown {
\* Use STACK to see stack in console...
\* ...before you decide what to do with the values
\* Stack is cleared by you or by system if found any value
      Rem 1 : Stack
      Read button
      If button<>2 Then Exit
      Drop  \\ drop shift
      Read X, Y
      Method Form1, "PopUp", aPopUpForm, X, Y
}
Method Form1,"Show", 1 \\ modal  means wait to return
\\ we return focus to console
Show
\\ this is optional but is right to placed here
Declare Text1 Nothing
\\ we need these to unload forms
Declare aPopUpForm Nothing
Declare Form1 Nothing

 

 

 

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

Επίσης έβαλα παράδειγμα με custom Popup (που έχει ένα textbox), το οποίο το δημιουργούμε άμεσα και "χάνεται" με το που χάνει την εστίαση!

 

(αισίως η Μ2000 είναι στην αναθεώρηση 197)

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ανέβασα ένα απλό πρόγραμμα όπου σχεδιάζουμε αριθμούς Bitmap, δηλαδή εικόνες 5Χ7 Κουκίδες. Έχω βάλει ένα πρόγραμμα να κάνει αντίστροφη μέτρηση από το 9999 στο 0000

Εδώ είναι μια εικόνα (από ανάλυση 1440Χ900)

countdown.png

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Στο βίντεο που ακολουθεί φαίνεται η διαδικασία όπου ανοίγω το αρχείο pong.gsb βάζω ως σημείωση τη γραμμή που κάνει το αρχείο "εκτελέσιμο"  και το ανοίγω με load pong

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

 

  • Like 2
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Screenshot 1440X900

Υπάρχουν 4 sprites (παίκτες), το μπαλάκι, η δεξιά ρακέτα και οι δυο αριστερές.

Και τό όνομα αυτού:MongPong..

Οι scanlines έχουν μπει επίτηδες (#222222 με εναλλαγή #555555)

 

mongpong.png

Επεξ/σία από M2000
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Κώδικας ...για Range και Sum με Lambda (και ας λέει ο Elorand ότι δεν είναι)

Να μερικές lambda συναρτήσεις

 

Η Range η οποία πακετάρει ένα εσωτερικό Lamda με τις κατάλληλες τιμές για αρχή και τέλος.

Η δεύτερη είναι η Sum η οποία τρέχει μια συνάρτηση που παίρνει ως εισαγωγή...μέχρι να βγει λάθος. και τότε επιστρέφει του σούμα.

Η τρίτη είναι μια αλφαριθμητική lambda η οποία μάλιστα δεν επιστρέφει τιμή, απλά την καλούμε με Call (ή Κάλεσε)

 

 

Range = Lambda -> {
      Read St, Ed
      =Lambda St, Ed -> {
            if Ed>St Then {
                  Ed--
                  =Ed
            }  Else Error "finish"
      }
}

Sum = Lambda -> {
      Read What
      S=0
      Try {
            S+=What()
            Loop
      }      
      =S
}
Print Sum(Range(1,4))

 

a$=lambda$ ->{Read a$ : Print a$}
Call a$("George")


Η σύνταξη της Lambda είναι ως εξής:

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

2, μερικές Non Local variables. Την ώρα της δημιουργίας μπορεί να είναι νέες ή υπάρχουσες. Αν είναι νέες μπορούμε να δώσουμε τιμή με =. Όμως εδώ είναι μια διαφορά, αυτές οι μεταβλητές δεν είναι απαραίτητα για εισαγωγή, μπορεί να είναι για επεξεργασία. Αυτές θα εμφανίζονται μέσα στο τμήμα της εκτέλεσης, αλλά πουθενά αλλού. Όταν δε κάνουμε αντιγραφή, αντιγράφονται και αυτές. Μπορούμε να έχουμε απλές τιμές ή άντικείμενο Lambda, δηλαδή να μια lambda μπορεί να έχει και άλλες lambda μαζί της.σε Non Local μεταβλητές. Οι τοπικές μεταβλητές "καθαρίζονται" στο πέρας της εκτέλεσης. Μέσα στο μπλοκ μπορούμε να έχουμε ότι θέλουμε, ακόμα και τοπικά τμήματα και συναρτήσεις, πίνακες, οτιδήποτε. Ακόμα μπορούμε να έχουμε οτιδήποτε γενικό συνδεδεμένο.

 

3. Μετά το -> (είναι απαραίτητο ακόμα και αν δεν υπάρχει το 2) έχουμε μπλοκ ή απλά μια παράσταση.

Με ελληνικές εντολές!

 

Περιοχή = λάμδα -> {
      Διάβασε Αρ, Τε
      =λάμδα Αρ, Τε -> {
            Αν Τε>Αρ Τότε {
                  =Αρ
                  Αρ++
            }  Αλλιώς Λάθος "Τέρμα"
      }
}
Κύβος=λάμδα -> αριθμός**3
ΣτηνΟθόνη = λάμδα ->{Τύπωσε Αριθμός}
Για_Κάθε_Ένα = λάμδα -> {
      Διάβασε Περ, Συναρ, Εξ
      Δες {
      Κάλεσε Εξ(Συναρ(Περ()))
      Κυκλικά
      }
}
\\Σε μια γραμμή εκτέλεση!
Κάλεσε Για_Κάθε_Ένα(Περιοχή(1,11), Κύβος, ΣτηνΟθόνη)


Να και ένα ωραίο παράδειγμα (στα αγγλικά)

 

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.