Επίσης καθυστερημένα κι εγώ, μέσα σ' όλα έλειπα και σε διακοπές.
George J., σ' ευχαριστώ για την απάντησή σου.
Πρόβλημα 1:
Οι παρενθέσεις με παραξένεψαν κι εμένα. Δεν είναι δικός μου κώδικας.
Αυτόματα γράφεται από το ActiveX Control Interface Wizard. Μόλις
διάβασα την απάντηση το δοκίμασα και ...τίποτα

. Αμέσως μετά ήρθε η
αναλαμπή

. Είχα την υποψία ότι κάποια γραμμή αναιρούσε την τιμή της
ιδιότητας του BackColor. Στη ρουτίνα ReadProperties άλλαξα τη σειρά των
γραμμών κι έβαλα αυτή που αφορά το BackColor τελευταία και δούλεψε.
Μετά από δοκιμές βρήκα ότι έφταιγε η ιδιότητα Appearance. Με την
παρακάτω δοκιμή γίνεται πέρα για πέρα κατανοητό:
Σε μία φόρμα αλλάξτε το BackColor και στη συνέχεια δώστε στην ιδιότητα
Appearance την τιμή 1 - 3D (ενώ είναι ήδη 1!). Το χρώμα του BackColor
επιστρέφει στο αρχικό του συστήματος. Αυτό γινόταν και στη
ReadProperties.
Πρόβλημα 2:
Και πάλι, στην InitProperties ο κώδικας που αφορά το Ambient.Font είναι
γραμμένος αυτόματα. Απ' ότι είδα η Ambient.ScaleUnits είναι String και
όχι enumarated integer όπως οι σταθερές vbTwips, vbPixels. Να παίρνω if
Ambient.ScaleUnits = "Twip" then AmbScaleMode = vbTwips κτλ; Και αυτό
που δεν ανταποκρίνεται σωστά είναι το ScaleMode του Control και όχι το
ScaleMode της φόρμας. Αλλά και κάτι άλλο: Κάποιες ιδιότητες δεν
ορίζονται μέσα από τις γραμμές του κώδικά μας, έτσι δεν είναι; Π.χ.
ανεξάρτητα από το τι ActiveX Control θα φτιάξω αυτό θα έχει τις
ιδιότητες Index, ToolTipText, Left, Top χωρίς να έχω μεριμνήσει για
αυτές. Μπορώ να ορίσω τις ιδιότητες Width και Height των
ContainedControls μέσα από κώδικα; Το μόνο που μπορώ να φανταστώ είναι
το ScaleMode και ενώ αυτό κάνω δε λειτουργεί. Με το ScaleUnits θα το
ψάξω λιγάκι και γενικά θέλει λίγο ψάξιμο.
Πρόβλημα 3:
Εδώ θα εφεύρω το μονόπρακτο του διαλόγου!
George J. Capnias:2 events δεν θα εκτελούνται ταυτόχρονα.
Κατανοητότατο.
George J. Capnias:Μέσα σε ένα event προσπαθούμε να γράφουμε κώδικα που θα εκτελεστεί όσο
το δυνατόν πιο γρήγορα, για να εξασφαλίσουμε ότι δεν θα προκίψει ένα
άλλο event που θα προσπαθήσει να εκτελεστεί, όταν εκτελείται ο κώδικάς
μας.
Ιδανικό και μερικές φορές ουτοπικό! Πολλές φορές έχω ταλαιπωρηθεί από
τέτοιες περιπτώσεις. Μαλιστα πρόσφατα παραδόξως έγινε κλήση από event
σε event την οποία δεν είχα φανταστεί, με βόλεψε αφάνταστα πολύ και ενώ
προσπάθησα, ακόμα δεν έχω εντοπίσει!
George J. Capnias:Συνήθως εγώ έχω μια static boolean που όταν εκτελώ κώδικα event event την κάνω true...
Παρομοίως. Τελικά δεν πρωτοτυπώ συνεχώς!
George J. Capnias:Ο μηχανισμός των windows μαζεύει τα
events σε μια ουρά και περιμένει την εφαρμογή να τα βγάλει και να τα
επεξεργαστεί...
Εδώ ας σταθούμε λίγο. Σύμφωνοι. Υπάρχει ουρά και με τον ένα τρόπο τα
events κρατιούνται στην ουρά ενώ με τον άλλον όχι. Ποια η διαφορά ενός
PictureBox από το δικό μου Control; Διότι στο PictureBox το αποτέλεσμα
δείχνει ότι τα events δεν κρατιούνται στην ουρά. Και στα δύο
χρησιμοποιώ το Enabled. Διότι όλα αυτά είναι κατανοητά αλλά μήπως η
απάντηση είναι άλλη; Στο σημείο αυτό να παραθέσω και μια υποψία μου:
Κάνω πολλαπλά click με τη ροδέλα στο Combo. Με το πρώτο click το event
του Combo θέτει το Enabled του Parent Control σε False. Τα υπόλοιπα
click περιμένουν στην ουρά. Μόλις ολοκληρωθεί η εκτέλεση του κώδικα το
Enabled επιστέφει σε True. Η ουρά ανοίγει και τα click εκτελούνται,
αλλά: Στην περίπτωση του PictureBox το Focus πηγαίνει στο PictureBox
και τα click εκεί δε βρίσκουν κώδικα να εκτελέσουν ενώ στην περίπτωση
του Control το Focus επιστρέφει στο Combo, εκτελείται το επόμενο click
και τελικά εκτελούνται όλα. Να τονίσω ότι εντοπίζω διαφορά μόνο στο
Combo και μόνο στα events από ένα συνεχόμενο ρολάρισμα της ροδέλας
(υπάρχει παράδειγμα στο επισυναπτόμενο για να τονιστεί ακριβώς αυτό).
George J. Capnias:Καλό είναι στα ActiveX DLL, ActiveX EXE
και ActiveX Controls τα projects να γίνονται compile με Binary
Compatibility...
Αυτό θέλει λίγο ψάξιμο. Ξέρω πως γίνεται αλλά δεν ξέρω ποια η διαφορά.
Δεν περιμένω να το ψάξω πρώτα και μετά να απαντήσω διότι τότε θα
απαντούσα προκλητικά αργά.
Η αναφορά σε Compatibility μου θύμησε και μία ερώτηση που έχω περί των ActiveX Controls. Την αναφέρω στο τέλος.
George J. Capnias:Δες να μην χρησιμοποιείς δικά σου enums...
Πράγματι θα ήταν καλό. Μάλιστα τα enum που έχω φτιάξει δημιουργούν και
πρόβλημα στη χρήση τους καθώς τα ονόματα είναι μη-επιτρεπτά και κάθε
φορά χρειάζεται να τα περικλείεις με αγκύλες.
Κάτι που ανέφερες στην αρχή το αφήνω για το τέλος. Αισθάνομαι πως το
post ξεχυλώνει αλλά ίσως η όλη συζήτηση έχει ένα κοινό σημείο αναφοράς
τα ActiveX Controls.
George J. Capnias:Το πρόβλημα με τις διαδρομές δεν είναι
φοβερό, μερικές αλλαγές στο .vbg και στα .vbp και είμαστε οκ!
Ψύχραιμο σε βλέπω. Πράγματι αν ανοίξω τα αρχεία αυτά με το
σημειωματάριο μπορώ να κάνω κάποιες παρεμβάσεις. π.χ. μία διαδρομή
Form=D:\Παντελής\Προγραμματισμός\Drafts\Browsers\Folder
Browser\frmBrowser.frm τη μετατρέπω σε Form=frmBrowser.frm και πιάνει
(η φόρμα frmBrowser.frm να βρίσκεται στον ίδιο φάκελο με το αρχείο
.vbp). Αλλά στην αντιστοίχιση
Object={59E5D0C8-4C70-489A-87B0-AB080AF1204C}#1.0#0; UserControl.ocx τι
μπορώ να κάνω; Μου βγάζει κάτι πράγματα για upgrade control και γενικά
δε βγάζω άκρη. Και το βασικότερο: Ορισμένες φορές αυτές οι διαδρομές
αποθηκεύονται χωρίς να καταλάβω το γιατί. Μπορώ να κάνω μία ρύθμιση
ώστε να αποφέυγω τέτοια προβλήματα; Ίσως κάποιες φορές αυτή η
αποθήκευση των διαδρομών να είναι χρήσιμη αλλά για μένα είναι μόνο
μπελάς. Όλες τις φόρμες, τις κλάσεις και τα μόντουλα που αφορούν ένα
project τις αποθηκεύω πάντα στον ίδιο φάκελο.
Παντελής