Δευτέρα 24 Ιανουαρίου 2022

Αναθεώρηση 55, Έκδοση 10 (Νέο στοιχείο ελέγχου Εικόνα)

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

Το στοιχείο Εικόνα ή Image, έχει τις παρακάτω λειτουργίες:

  • Έχει δικό του Επίπεδο (πχ στο Image1 με Layer Image1 { } δίνουμε εντολές γραφικών στο επίπεδο της εικόνας, αντίστοιχα Επίπεδο Image1 { } στα ελληνικά, το όνομα του στοιχείου μπορεί να είναι οτιδήποτε).
  • Μπορούμε να φτιάξουμε στόχους όπως και στη φόρμα.
  • Οι εντολές Hold και Release εκτελούνται και εδώ (Κράτησε και Άφησε). Έτσι κρατάμε ένα φόντο και το επαναφέρουμε πριν σχεδιάσουμε κάτι/
  • Μπορούμε να περάσουμε το μέρος της φόρμας που "πατάει" η εικόνα στην εικόνα. (αντί να χρησιμοποιούμε τις Κράτησε/Άφησε).
  • Υπάρχουν γεγονότα για click, dblclick, mouseup, mousedown, mousemove, resize.
  • Δεν υπάρχει ιδιότητα εικόνα, για να αλλάξουμε την εικόνα πρέπει να χρησιμοποιήσουμε την εντολή /δομή Επίπεδο ΌνομαΕικόνας { }
  • Όταν ορίζουμε στοιχεία γα τη φόρμα μπορούμε να τα βάλουμε σε μια εικόνα.

Παράδειγμα:  έστω έχουμε ορίσει την φόρμα1 και την εικόνα1: Η παρακάτω εντολή βάσει το Λίστα1 στη φόρμα Φόρμα1 αλλά πάνω στην Εικόνα1.

Όρισε Λίστα1 Λίστα Φόρμα Φόρμα1 Εικόνα Εικόνα1

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

Ειδικά το Listbox ή Λίστα, έχει τώρα όλη τη λειτουργικότητα (θα την δείξω με παραδείγματα σε άλλη ανάρτηση), για να μετακινείται με drag (σύρσιμο) είτε αυτό με επιλογή μόνο οριζόντια, μόνο κάθετα, οπουδήποτε, είτε αυτό που το περιέχει (φόρμα ή εικόνα). Το είχε αυτό το glis4.cls στοιχείο ελέγχου (δείτε το UseFloatList και FloatList στον κώδικα του στοιχείου στο git), αλλά όχι για οποιοδήποτε container.

Επίσης διορθωθηκαν ορισμένες "αβλεψίες" από την 54 και 53 αναθεώρηση, και έτσι το παράδειγμα εδώ:

https://georgekarras.blogspot.com/2017/07/22-89.html  λειουργεί σωστά (Δείχνει τον δρομέα στην διόρθωση και την αλλαγή χρώματος. Αυτό το παράδειγμα δείχνει δυο στοιχεία Λίστα, να ελέγχει το ένα το άλλο, δηλαδή όταν μετακινείται το πρώτο, ακολουθεί το δεύτερο και το αντίστροφο (χωρίς να μπαίνουν σε συνεχομενη κλήση). Από την αρχική σχεδίαση ένα γεγονός δεν αφήνεται να εκτελεστεί ενώ ήδη βρίσκεται σε εκτέλεση (reentrance). Από λάθος όταν αλλάζαμε μέγεθος φόρμας με τα βελάκια, γίνονταν αλλαγή μεγέθους χωρίς να σταλθεί γεγονός (επειδή ήδη ήταν ενεργό, δηλαδή σε εκτέλεση), αλλά άλλαζε το μέγεθος και αυτό διορθώθηκε στην 55 αναθεώρηση, απλά δεν ακούνε τα "βελάκια" για αλλαγή μεγέθους όσο τρέχει το γεγονός "resize" της φόρμας. Ενώ η Vb6 είναι ενός νήματος, όταν στο γεγονός "resize" δοθεί ένα Doevents, κάτι που δίνει χρόνο στο σύστημα, τότε μπορεί να εκτελεστεί άλλο γεγονός (σε αναμονή), το οποίο μπορεί να είναι ίδιο με εκείνο που ήδη εκτελείται. Τι κάνει το σύστημα; Σταματάει τη τρέχουσα εκτέλεση και εκτελεί το πιο πρόσφατο γεγονός, μέχρι να μην υπάρχουν άλλα και μετά γυρίζει και τελειώνει με ότι είχε αφήσει "σταματημένα" (interrupted). Όταν λοιπόν έφτιαχνα μια εφαρμογή με στοιχεία ελέγχου (karel ide) είδα το πρόβλημα. Βασικά στο προγραμματισμό πάντα υπάρχουν λύσεις, όταν δεις το πρόβλημα (και μπορείς να το αναπαράγεις).

Στο παράδειγμα έχω βάλει πάνω στο Image ένα button και ένα checkbox (το check box δεν είναι διάφανο, δεν έχει λογική για διάφανη εμφάνιση, αντίθετα το button εδώ είναι διάφανο).

Όταν δίνουμε κλικ εκτός εικόνας τότε μια φορά εμφανίζετα και μια εξαφανίζεται η εικόνα.

declare Form1 form

declare Image1 image form Form1
declare button1 button form form1 image image1
declare check1 checkbox form form1 image image1
Method Form1, "move", 1000, 1000, 10000, 8000
Method Image1, "move", 1000, 1000, 6000, 4000
Method check1, "move", 0, 1200
With Image1, "Visible" as Visible
Layer Form1 {
Gradient 1, 5
move 0,0
draw to scale.x/2, scale.y/2
circle 1500
move 0,0
// image "καρελ.emf", scale.x/2
}
a=100
Method button1, "transparent"
Layer Image1 {
// mode 12
// mode 12, 8000, 6000
window 16, 8000, 6000;
form 32, 20
method Image1, "CopyBack"
// image "m2000.ico"  // this icon need two time drawing
// image "m2000.ico"
Report 2, "Ok"
Print Scale.x, Scale.y
Print width, height
hold
cls

}
Function Button1.Click {
beep
print "button1"
refresh
}
Function Image1.Click {
beep
print "beep"
layer image1 {
release
refresh
}
method Form1, "Refreshall"
refresh
}
k=true
function form1.click {
k~
visible=k
}
method Form1, "show", 1
declare Form1 nothing





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

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

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