Τετάρτη, 11 Νοεμβρίου 2020

Αναθεώρηση 7, Έκδοση 10

 Τελειοποίησα το XMLData αντικείμενο. Η βασική ιδιότητα, xml δίνει το δένδρο σαν κείμενο και παίρνει το δένδρο σαν κείμενο (διαγράφοντας το τρέχον δένδρο). Αυτό γίνεται σε κάθε κλαδί (το οποίο είναι επίσης ένα δένδρο). Μπορούμε να στήνουμε το δένδρο προγραμματιστικά με εντολές αντί να δώσουμε το κείμενο. Τώρα προστέθηκαν και εντολές για διαγραφή. Στο info προστέθηκε το xml2, που δείχνει πως βγάζουμε τα κλαδιά (με δείκτες σε αντικείμενο) σε μια λίστα, όπου τα ταξινομούμε και μετά στήνουμε γρήγορα το δένδρο, αντί να βάζουμε XMLnode, απευθείας με XMLdata.

To XMLNode είναι ένα αντικείμενο που μας δίνει το XMLdata και πάνω σε αυτό κάνουμε προσθήκες σε χαρακτηριστικά (attributes),  προσθήκη σε τιμή, και το βάζουμε σε ένα αρχικά απροετοίμαστο XMLNode του λείπει το XMLNode. Δεν μπορούμε να χειριστούμε κάτι από το XMLNode γιατί είναι κλειστό για μας. Απλά το δίνουμε στο   XMLdata και αυτό το χειρίζεται, μέχρι να το δώσουμε για "πάντα",  και έτσι να κάνουμε το XMLdata να λειτουργεί. Στην ουσία υπάρχει ένα άλλο αντικείμενο εσωτερικά στο XMLData το οποίο έχει διαφορετικό όνομα και αυτό δεν το προσεγγίζουμε άμεσα. Το XMLData εμφανίζεται σαν XMLmono τύπος, είναι ένας Adapter, όπου το αυθεντικό XMLmonoInternal απλά βρίσκεται μέσα του. Όλο το δένδρο είναι φτιαγμένο μόνο με το XMLmonoInternal, αλλά η πρόσβαση σε αυτό γίνεται με τους Adapters. Πχ όταν κάνει αναζήτηση ενός tag (ετικέτας) για να δημιουργήσει μια λίστα, εσωτερικά το XMLmonoInternal χρησιμοποιεί το αντικείμενο Collection (της VB), και το αποτέλεσμα το παίρνει το εξωτερικό αντικείμενο XMLmono, και το μεταγράφει σε αντικείμενο της Μ2000, που μπορούμε να το δουλέψουμε πιο εύκολα (σε αντικείμενο σωρό τιμών). Όταν ζητάμε ένα δείκτη για ένα δένδρο εσωτερικό του δένδρου, τότε το XMLmono φτιάχνει ένα νέο XMLmono (λέγεται και wrapper), και σε αυτό δίνει τον "κρυφό" δείκτη του XMLmonoInternal.

Δείτε πως έχει το πράγμα. Τα αντικείμενα που χειριζόμαστε στη Μ2000 είναι τριών ειδών. Το ένα είναι το Group ή Ομάδα, και λέγεται και αντικείμενο χρήστη γιατί το φτιάχνει όπως θέλει, εδώ χρησιμοποιούμε την τελεία για να δείξουμε τα μέλη της ομάδας που θα χρησιμοποιήσουμε, Το δεύτερο είναι τα αντικείμενα που παρέχει η γλώσσα για να βάζουμε στοιχεία, όπως οι πίνακες, οι δείκτες σε πίνακες (τουπλέ),, οι λίστες, οι σωροί, και άλλα. Αυτά έχουν εντολές που γράφουμε περιφραστικά, είναι ενσωματωμένα στο συντακτικό της γλώσσας. Τέλος έχουμε τα εξωτερικά, τα λεγόμενα COM. Αυτά μπορεί να είναι από το σύστημα ή ιδιωτικά. Ορισμένα αντικείμενα εσωτερικά της Μ2000 μπορούν να χρησιμοποιηθούν από άλλα προγράμματα, όπως η λίστα. Όλα αυτά τα COM αντικείμενα (και οι φόρμες και τα στοιχεία ελέγχου του GUI) τα χειριζόμαστε με τις εντολές Όρισε (Declare), ή και με την Όρισε ΜεΓεγονοτα (Declare WithEvents),   Μέθοδος (Method) και συνδέουμε μεταβλητές με ιδιότητες με την Με (With),. Επειδή αυτά γίνονται ενώ εκτελείται το περιβάλλον, δηλαδή για το περιβάλλον εκτέλεσης είναι Late Bound, η προσπέλαση στα αντικείμενα γίνεται μόνο από τις μεθόδους και τις ιδιότητες που δηλώνονται Pubic στη VB6 ή όποια άλλη γλώσσα (τα COM αντικείμενα μπορούν να γραφτούν σε διάφορες γλώσσες, στην ουσία αυτό που έχουμε είναι γλώσσα μηχανής και σύνδεση με βιβλιοθήκες).  Για να επικοινωνούν τώρα αντικείμενα και κώδικας μέσα από το περιβάλλον (τον εκτελέσιμο κώδικα), υπάρχουν οι μέθοδοι και ιδιότητες που ορίζονται ως Friend, φιλικές, δηλαδή μπορούν να χρησιμοποιηθούν μόνο από τον "ιδιοκτήτη" ή "κατασκευαστή" ενός αντικειμένου. Στην περίπτωσή εδώ από τη Μ2000. Έτσι με αυτό το επίπεδο "ασφάλειας", υπάρχει απομόνωση από το μέρος του προγράμματος σε Μ2000 και του εκτελέσιμου του περιβάλλοντος της Μ2000.

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

Παλαιότερα η Μ2000 ήταν πιο στριφνή με τα αντικείμενα, πχ στη λίστα δεν άφηνε να βάλουμε αντικείμενα COM, όπως γίνεται από αυτήν την αναθεώρηση (βάζαμε μόνο τα στάνταρ και τις ομάδες). Τα αντικείμενα COM όταν συνδέονται με γεγονότα δεν θέλουμε να είναι μετακινήσιμα, δηάδή να είναι στατικά. Επίσης όταν έχουμε ιδιότητες μιας φόρμας δεν θέλουμε να κρατάμε δείκτη προς την φόρμα γιατί δεν θα απελευθερώσει ποτέ τη μνήμη (μέχρι να διαγραφεί και το τελευταίος δείκτης. Και εκεί η Μ2000 κάνει την δουλειά wrapper, δηλαδή έχει το mHandler, ένα αντικείμενο που χρησιμοποιεί για πολλά άλλα αντικείμενα, και είτε μεταφέρει κάποιο άλλο αντικείμενο, είτε δηλώνει με αναφορά σε συγκεκριμένη θέση μεταβλητής, όπου μπορεί να υπάρχει, ή και να αλλάξει το αντικείμενο χωρίς το mHandler να έχει θέμα, ή να χρειάζεται ενημέρωση. Έτσι όταν συνδέουμε ιδιότητες, με κάποιο αντικείμενο, αυτές δεν κρατάνε δείκτη στο αντικείμενο (άρα δεν έχουν επίπτωση στη ζωή του),  αλλά μια αναφορά εκεί που βρίσκεται ο δείκτης. Μια συνδεδεμένη ιδιότητα είναι αυτή που έχει περάσει από ένα στάδιο ανίχνευσης κωδικού ιδιότητας για δοσμένο όνομα ιδιότητας (έτσι δουλεύει το COM, μέσω της iDISPATCH διεπαφής). Κάθε φορά που πάμε να εκτελέσουμε την ιδιότητα, για διάβασμα ή για γράψιμο (ότι μας αφήνει το αντικείμενο), χρησιμοποιείται ο κωδικός άμεσα (χωρίς να γίνεται αναζήτηση). Ακόμα και στις μεθόδους που δεν συνδέουμε τμήματα και συναρτήσεις τα ονόματα των κλήσεων κρατούνται σε λίστα και άμεσα δίνουν τον αριθμό εκτέλεσης, από την δεύτερη εκτέλεση (η Μ2000 κρατάει λίστες για όλα τα αντικείμενα στη συγκεκριμένη περίοδο εκτέλεσης).

Γενικά οι γλώσσες όπως η VB6 λειτουργεί με tlb βιβλιοθήκες, τiς λεγόμενες Type Libraries. Τα αντικείμενα COM έχουν για τη διεπαφή iDispatch ενσωματωμένη βιβλιοθήκη και η Μ2000 μπορεί να την δείξει. Δείτε το παράδειγμα FS με ποιο τρόπο εμφανίζουμε στη κονσόλα της Μ2000 τις μεθόδους και τις ιδιότητες ενός αντικειμένου  COM.

Αυτά προς το παρόν.

ΓΚ





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

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