Δευτέρα, 17 Απριλίου 2017

Παράδειγμα με 30 Παράθυρα (κώδικας στα Ελληνικά)




(υπάρχει νέα αναθεώρηση 7, αλλά έχει να κάνει μόνο με την εντολή Δοκιμή)

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


\\ Παράδειμα με 30 παράθυρα!
\\ με ctrl+tab αλλάζουμε τα παράθυρα
\\ με κλικ στη κονσόλα και Esc κλείνουμε τα παράθυρα (ένας τρόπος)
\\ με κλικ άνω αριστερά κλείνουμε ένα παράθυρο
\\ Το πρόγραμμα δείχνει πως δημιουργούμε πίνακες φορμών και στοιχείων
\\ Δείχνει πως θα λαμβάνουμε μηνύματα από τις φόρμες και τα στοιχεία
\\ Τα ονόματα των γεγονότων του γραφικού περιβάλλοντος είναι στα αγγλικά
\\ Το γραφικό περιβάλλον χρησιμοποιεί στοιχεία που έχει μόνο η Μ2000
\\ και είναι γραμμένα στο κώδικά της.
\\ Ενώ έχουμε 30 παράθυρα και σε καθένα δύο πλήκτρα (buttons)...
\\ ... έχουμε μόνο μια εξυπηρέτησης γεγονότος στη συνάρτηση Πλήκτρα1.Click


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


\\ Η Φόρμα1.Unload παίρνει μια μεταβλητή με αναφορά από τη φόρμα
\\ για το λόγο αυτό και τον παραπάνω (λόγω αυξημένης θέασης) η Διάβασε έχει το Νέο
\\ (ώστε να μπορεί να ξανασυνδέσει αναφορά - σε νέα μεταβλητή, που θα σβήσει μετά)


\\ Στο παράδειγμα με δεξί κλικ του ποντικιού αφαιρούμε το τίτλο στα παράθυρα
\\ (και έτσι χάνεται η δυνατότητα μετακίνησης)
\\ Στο επόμενο δεξί κλικ επαναφέρουμε τον τίτλο


\\ Με αριστερό κλικ ζωγραφίζουμε κύκλους, ενώ παράλληλα σε όλα τα παράθυρα...
\\ 30 νήματα ζωγραφίζουν, ένα σε κάθε παράθυρο.


\\ Τις αναφορές στα πλήκτρα (buttons) τις αποθηκεύουμε σε ένα πίνακα που έχει ομάδες
\\ κάθε ομάδα έχει έναν πίνακα που θα πάρει τον πίνακα των στοιχείων.
\\ κάθε στοιχείο που φτιάχνουμε σε φόρμα έχει δυο αντικείμενα (τουλάχιστον),
\\ το φανερό που βλέπουμε, και ένα άλλο, το οποίο ελέγχει το φανερό.
\\ Αυτό ορίζουμε ως Πλήκτρο, και δημιουργεί το φανερό στη φόρμα.
\\ Όταν αποδεσμευτούν οι πίνακες, θα διαγραφούν μόνο δείκτες στο αντικείμενο ελέγχου
\\ Μόλις οι φόρμες αποδεσμευτούν (θα γίνει όπως και να έχει αν σταματήσουμε με Esc)
\\ τότε καθαρίζονται τα φανερά στοιχεία και ανάποδα, καθαρίζονται και οι συνδέσεις στα αντικείμενα ελέγχου
\\ οπότε τα αντικείμενα ελέγχου μένουν χωρίς δείκτη σε αυτά και καταστρέφονται!


Οθόνη ,0 \\ καθαρίζουμε όλη την οθόνη
Παράθυρα=30
\\ Θα δώσουμε ένα τίτλο στη κονσόλα (στη γραμμή εργασιών)
\\ Δοκιμάστε με ή χωρίς Ελαχιστοποίηση
Εμφάνιση=1 \\ Ελαχιστοποίηση 0 , Κανονικό 1
Τίτλος "Παράθυρα στη Μ2000", Εμφάνιση
Όρισε Φόρμα1(Παράθυρα) Φόρμα
Κλάση Πλήκτρα {
      Πίνακας Πληκ()
      ΧρώμαΚύκλου=#FFFFFF
      Τμήμα Βάλε_Τίτλο { Με .Πληκ(Αριθμός), "Caption", Γράμμα$}
      Συνάρτηση Τίτλος$ { Με .Πληκ(Αριθμός), "Caption" ως Αποτέλεσμα$ : = Αποτέλεσμα$}
}  
Πίνακας Στοιχεία(Παράθυρα)=Πλήκτρα()

Για ι=0 Έως Παράθυρα-1 {
      Για Στοιχεία(ι) {
            Όρισε Πλήκτρα1(2) Πλήκτρο Φόρμα Φόρμα1(ι)
            Για κ=0 Έως 1 {
                  Μέθοδος Πλήκτρα1(κ), "move", 1000+4000*κ, 2000,3000,1000
                  \\ κάνουμε τις γωνίες καμπύλες, ο αριθμός είναι λόγος (ratio)
                  Μέθοδος Πλήκτρα1(κ), "curve",3
            }
            .Πληκ()=Πλήκτρα1()
            .ΧρώμαΚύκλου=Χρώμα(Τυχαίος(200)+50, Τυχαίος(200)+50, Τυχαίος(200)+50)
      }
     Επίπεδο Φόρμα1(ι) {
            Φόντο 1,4
            Δρομέας 0,2
            Αναφορά 2, "Γεια Χαρά!"
     }
      Μέθοδος Φόρμα1(ι), "Show"
}
Σημ 1: Αναμονή 6000 : ΤύπωσεΜεΑνανέωση("CloseNow") : Για ι=1 Έως 2 : Μέθοδος Φόρμα1(ι), "CloseNow" : Επόμενο ι
Σημ 2: Αναμονή 3000 : ΤύπωσεΜεΑνανέωση("Unload") : Ανανέωση : Όρισε Φόρμα1() Τίποτα
Σημ 3: Άναψε \\ παίρνουμε την εστίαση στην κονσόλα
Σημ 4: Τύπωσε "ok" : Έξοδος


\\ η παρακάτω χρειάζεται για να κλείσουν τα νήματα
Φόρμα1_1=Αληθές


Στοιχεία(1).Βάλε_Τίτλο 0, "Κλικ εδώ"
Στοιχεία(1).Βάλε_Τίτλο 1, "Οκ"
Στοιχεία(2).Βάλε_Τίτλο 1, "Δοκιμή!"


Με Φόρμα1(0), "Visible" ως ορατό


Συνάρτηση Φόρμα1.Unload {
      Διάβασε Νέο Αρ_Φόρμας, &Όχι_οκ
      Όχι_οκ=Αληθές \\ να μην αποφορτωθεί τώρα
      Αν Ρώτα("Να κλείσω την φόρμα?")=1 Τότε {
            Αν Αρ_Φόρμας=1 Τότε Φόρμα1_1=Ψευδές
            Μέθοδος Φόρμα1(Αρ_Φόρμας), "CloseNow"
      }
}
Συνάρτηση Πλήκτρα1.Click {
      Διάβασε ΠοιοΠλήκτρο, ΠοιαΦόρμα
      Τύπωσε "Φόρμα:";ΠοιαΦόρμα,"Πλήκτρο:";ΠοιοΠλήκτρο
      Τύπωσε Στοιχεία(ΠοιαΦόρμα).Τίτλος$(ΠοιοΠλήκτρο)
      Αν ΠοιοΠλήκτρο=1 and ΠοιαΦόρμα=2 Τότε Δοκιμή
}
Συνάρτηση Φόρμα1.MouseMove {
      Διάβασε ΠοιαΦόρμα, Πλήκτρο, Κουμπι_Shift, Χ, Υ
      Αν Πλήκτρο=1 Τότε {
           Επίπεδο Φόρμα1(ΠοιαΦόρμα) {
                  Θέση Χ, Υ
                  Κύκλος 500, 1, Στοιχεία(ΠοιαΦόρμα).ΧρώμαΚύκλου
            }
      }
}
Συνάρτηση Φόρμα1.MouseDown {
      Διάβασε ΠοιαΦόρμα, Πλήκτρο
      '    Πέτα 3    \\ Πετάμε τα Κουμπι_Shift, Χ, Υ
      Αν Πλήκτρο=2 Τότε {
            Μέθοδος Φόρμα1(ΠοιαΦόρμα), "Control", 1 ως Στοιχείο_Χρήστη
            Με Στοιχείο_Χρήστη, "Visible" ως ορατό1
            ορατό1=Όχι ορατό1
      }
}
\\ τα νήματα έχουν θέαση όλο το τμήμα, θα βλέπουν το Φόρμα1_1
\\ η εντολή Νήμα Αυτό Σβήσε, σβήνει το νήμα μέσα από το νήμα
\\ χωρίς να χρησιμοποιήσουμε τον αριθμό του νήματος
\\ Τα νήματα έχουν σύνδεση με το αντικείμενο εξόδου που φτιάχτηκαν
\\ Για το λόγο αυτό τα φτιάχνουμε μέσα σε αυτό Επίπεδο Φόρμα1(ι) {  }
\\ το νήμα δεν κρατάει άμεση αναφορά στη φόρμα, αλλά έμμεση
\\ Η Αν Φόρμα1_1 Τότε { } Αλλιώς Νήμα Αυτό Σβήσε
\\ μπορεί να αφαιρεθεί σε αυτό το παράδειγμα
\\ και να μείνει μόνο η Χάραξε...


Για ι=0 Έως Παράθυρα-1 {
      Επίπεδο Φόρμα1(ι) {
            Νήμα {
                  Αν Φόρμα1_1 Τότε {
                           Χάραξε Έως Τυχαίος(κλίμαξ.χ), Τυχαίος(κλίμαξ.υ), Τυχαίος(7,15)
                  } Αλλιώς Νήμα Αυτό Σβήσε
            } ως ΈναΑκόμα Κάθε 100
            \\ το ΈναΑκόμα παίρνει για κάθε νήμα άλλη τιμή, αλλα δεν θέλουμε
            \\ εδώ να την κρατήσουμε
      }
}
Νήμα {
      ΤύπωσεΜεΑνανέωση(Γραφή$(Τώρα,"hh:mm:ss"))
} ως Ενημέρωσε Κάθε 1000


Κύριο.Έργο 100 {
      Αν Όχι ορατό Τότε Έξοδος
}


Προς εκει
\\ δεν χρειάζεται ο καθαρισμός στοιχείων
\\ ο οποίος θα γίνονταν έτσι:
Για ι=0 Έως Παράθυρα-1 {
      Για Στοιχεία(ι) {
            Πίνακας .Πληκ()
      }
}
εκει:
Όρισε Φόρμα1() Τίποτα
Τίτλος "Τέλος"
Άναψε
Ρουτίνα ΤύπωσεΜεΑνανέωση(α$)
      Τύπωσε α$
      Ανανέωση
Τέλος Ρουτίνας