Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
Ημιδιαφάνεια στις αναδυόμενες και αποκλειστικές φόρμες
Καλησπέρα Θα ήθελα να κάνω μια ερώτηση σχετικά με την ικανότητα να ενεργοποιήσεις ενα συμβάν σε αναδυόμενες και/ή αποκλειστικές φόρμες. Χρησιμοποιώ το παρακάτω για να μπορώ να ρυθμιζω την διαφάνεια μιας φόρμας Public Sub SetFormOpacity(frm As Form, sngOpacity As Single) Dim lngStyle As Long lngStyle = GetWindowLong(frm.hwnd, GWL_EXSTYLE) SetWindowLong frm.hwnd, GWL_EXSTYLE, lngStyle Or WS_EX_LAYERED SetLayeredWindowAttributes frm.hwnd, 0, (sngOpacity * 255), LWA_ALPHA End Sub Εχω μια φόρμα που λειτουργεί ως query builder και γυριζει καποια αποτελεσματα. Ας πουμε οτι λέγεται Main. Αναλογα με το αν θα πατησει ο χρηστης με διπλό κλικ πανω σε κάποια πεδία ανοίγουν δύο αναδυόμενες και αποκλειστικες φιλτραρισμενες φόρμες (η καθε μια σε διαφορετικό χρόνο). Θα ήθελα όταν ανοιγουν αυτες οι φορμες να χρησιμοποιω το SetFormOpacity για την Main. Δυστυχως κανένα συμβάν της Main από τα On Lost Focus ή On Deactivate δεν με εξυπηρετεί καθώς δεν δείχνει να ενεργοποιείται. Υποθετω εχω παρεξηγησει την ικανοτητα των αναδυόμενων και/ή αποκλειστικών να χανουν το focus τους...και γενικώς τελώ λιγο υπό σύγχυση με την χρηση τους. Μήπως υπάρχει κάποια πρόταση για το παραπάνω? Προς το παρον εχω μια λύση να ανοιγω μια αναδυόμενη ημιδιαφανη άδεια φόρμα πάνω από την main απλά για να τη κρύβω, αλλά την θεωρώ λίγο 'μπακαλίστικη' λύση... Ευχαριστώ εκ των προτέρων Λία |
#2
| ||||
| ||||
Καλησπέρα! Σε μια κοινή λειτουργική μονάδα πέρασε τον παρακάτω κώδικα: Κώδικας: Option Compare Database Option Explicit Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _ ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" ( _ ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _ ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Const WS_EX_LAYERED = 524288 Private Const GWL_EXSTYLE = -20 Private Const LWA_ALPHA = 2 Public Sub SetFormOpacity(WHandle As Long, sngOpacity As Single) Dim lngStyle As Long lngStyle = GetWindowLong(WHandle, GWL_EXSTYLE) SetWindowLong WHandle, GWL_EXSTYLE, lngStyle Or WS_EX_LAYERED SetLayeredWindowAttributes WHandle, 0, sngOpacity, LWA_ALPHA End Sub Κώδικας: Private Sub Form_Load() SetFormOpacity Me.hwnd, 128 ' 50 - 255 ; 128 = 50% Διαφάνεια End Sub Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#3
| |||
| |||
Πρώτα απ όλα ευχαριστώ για την άμεση απάντηση :) Δεν διευκρινησα στο πρωτο οτι εχω ήδη δηλώσει μεταβλητές κλπ. Χρησιμοποιώ το SetFormOpacity ετσι κι αλλιως επιτυχως στην 'μπακαλιστικη' εκδοχή μου. Το πρόβλημά μου είναι ότι κανένα event της Main στο οποιο έθεσα την αλλαγή δεν κάνει fire όταν η Main πάει πίσω (συγνωμη χρησιμοποιω μονο αγγλικό office και δεν ειμαι τοσο καλή στην ελληνικη ορολογία) Kαι έχω την εντύπωση ότι ίσως δεν εχω καταλαβει σωστά τις ιδιοτητες των modal/pop up. Οταν παει πισω δεν χανει το focus? Γιατι δεν μου δουλευει το SetFormOpacity στο Οn Lost Focus της Main? |
#4
| ||||
| ||||
Όταν ανοίξει μια αποκλειστική φόρμα ή ένα παράθυρο διαλόγου: Οποιοσδήποτε κώδικας που ίσως τρέχει εκείνη τη στιγμή διακόπτεται και θα συνεχίσει αφού κλείσει το παράθυρο της αποκλειστικής φόρμας ή διαλόγου. Συνεπώς το Οn Lost Focus της Main θα διακοπεί προσωρινά και έτσι δεν θα εκτελεστεί η διαδικασία "SetFormOpacity". Μόνο ο κώδικας της αποκλειστικής φόρμας έχει την εξουσιοδότηση να εκτελεστεί. Αν καλέσεις τη διαδικασία "SetFormOpacity" από την αποκλειστική φόρμα όπως φαίνεται στο παράδειγμα μου η διαδικασία θα εκτελεστεί κανονικά. Φιλικά Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#5
| |||
| |||
Τελικά η συζητηση καμια φορα βοηθάει να βάλω σε σειρά αυτό που έχω στο μυαλό μου Ελυσα το θεμα μου ενεργοποιώντας τη διαφάνεια της Main παραλληλα με το ανοιγμα της Form2 DoCmd.OpenForm "form2", acNormal SetFormOpacity Me.hwnd, 100 και επανεφερα το κανονικό χρώμα με το onclose της form2 Private Sub Form_Close() SetFormOpacity Forms!Main.hwnd, 255 End Sub Το παραπανω το ήθελα για να μη μπερδευεται ο καταχωρητης από τα στοιχεια της φορμας που φαινοταν πισω και ηταν μεγαλη. Τώρα το βλέμμα του θα πεφτει στην μπροστά. Ευχαριστώ πολύ! Λία |
#6
| ||||
| ||||
Καλημέρα! Λία, πάρα πολύ ωραίο εφέ! Δες στο συνημμένο μια ακόμα προσέγγιση. Είναι απλό στη χρήση. Για να ανοίξεις μια φόρμα, είτε αποκλειστική είτε αναδυόμενη χρησιμοποιείς : OpenPopupForm "Form1" Καλή συνέχεια!
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#7
| |||
| |||
Εξαιρετικό παράδειγμα στο συνημμένο σου!!! Μ αρεσει το Fade in, Fade out της διαφάνειας! Στη πρωτη πρωτη προσπαθεια ειχα φτιαξει μια τετοια φορμα που ανοιγε πισω αλλα επεφτε ουρανοκατεβατη και δεν μ αρεσε σαν αποτελεσμα. Αυτο που μου εδειξες ειναι πολυ πιο ελκυστικό στο μάτι. Ας πάμε στο ζουμί τώρα... Παλευα να βρω τι ειναι αυτο που κανει την Form2 να κλεινει οταν χανει την εστιαση. Αν καταλαβα καλα η διαφορα ειναι στο οτι η μια ειναι αποκλειστική και η άλλη οχι? Μηπως μπορείς να μου δώσεις μια μικρή εξήγηση για τη λειτουργία του Form_Timer()? Αυτό ειναι που αναγκάζει το κλείσιμο? Επίσης μια και πρόσφατα σας βρήκα και άρχισα να γράφω θα ήθελα να πω το εξης... Αρχισα να ασχολούμε με την Access από χόμπυ και ως μια διευκόλυνση στην εργασία μου αλλά πάντα παλευα με ατελειωτο διάβασμα σε ξένα φορουμ. Σημειωτέον δεν εχω ουτε εναν γνωστό να ασχολείται για να συζητησω τυχον προβλήματα που συναντώ και ο μόνος πιστός ακροατής τις ατελειωτες ωρες πανω απο το pc είναι...ο σκυλος μου! Γι αυτο πρεπει να σας πω οτι ειναι ααααπιστευτη η χαρά μου που βρηκα ενα ελληνικό φορουμ με πολυ καλους γνωστες του αντικειμενου και εξαιρετικά απ όσο έχω δει μεχρι τώρα θέματα στο ιστορικό του! Και μόνο η συζήτηση βοηθά απίστευτα το μυαλό να γίνει πιο δημιουργικό...πόσο μάλλον και οι εξαιρετικές προτάσεις σας! Για τα παραπάνω λοιπόν θα ήθελα να πω ένα μεγάλο Ευχαριστώ! (μαλλον θα θελει να σας ευχαριστησει και ο σκυλος μου για την ησυχία του πλεον χεχε) |
#8
| ||||
| ||||
Καλησπέρα! Ο κώδικας του συμβάντος Form_Timer() στη φόρμα " frmBg" ελέγχει ποιο παράθυρο έχει την εστίαση και κάνει τις ανάλογες ενέργειες. Πιο αναλυτικά: Κώδικας: ' frmName = Μεταβλητή τύπου "String". περιέχει το όνομα της αναδυόμενης φόρμας. ' WHandle = Μεταβλητή τύπου "Long" παίρνει που επιστρέφει η GetActiveWindow() ' frmHandle = Μεταβλητή τύπου "Long" ; το νούμερο του παραθύρου της αναδυόμενης φόρμας Private Sub Form_Timer() ' έχει ρυθμιστεί να εκτελείται κάθε 50 χιλιοστά του δευτερολέπτου. On Error Resume Next If Not IsOpen(frmName) Then ' Αν η αναδυόμενη φόρμα δεν βρίσκεται σε κανονική προβολή τότε... DoCmd.Close acForm, Me.Name '...Κλείνει την ημιδιαφανή φόρμα "frmBg" (αυτή τη φόρμα) DoCmd.Close acForm, frmName '...Κλείνει την αναδυόμενη φόρμα Exit Sub '...Εξοδος από τη διαδικασία End If WHandle = GetActiveWindow() ' GetActiveWindow() = συνάρτηση API που επιστρέφει το νούμερο του ' εστιασμένου παραθύρου. Θα μπορούσε κανείς να χρησιμοποιήσει την ' Screen.ActiveForm της Access. Δεν λειτουργεί σωστά σε παλαιότερες εκδόσεις Access If WHandle <> frmHandle Then ' Αν το νούμερο του εστιασμένου παραθύρου είναι διαφορετικό από το νούμερο 'της αναδυόμενης φόρμας.... If GetActiveWindow = Me.hWnd Then '...και εάν το νούμερο του εστιασμένου παραθύρου είναι διαφορετικό ' από το νούμερο αυτής της φόρμας που σημαίνει ότι ο χρήστης έχει ' εστιάσει κάποιο παράθυρο έκτός της εφαρμογής τότε... DoCmd.Close acForm, Me.Name ' Κλείνει την ημιδιαφανή φόρμα "frmBg" (αυτή τη φόρμα) DoCmd.Close acForm, frmName ' Κλείνει την αναδυόμενη φόρμα End If End If End Sub Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
[ Φόρμες ] Αναζήτηση σε φόρμες που επιστρέφει φόρμες | theo93 | Access - Ερωτήσεις / Απαντήσεις | 17 | 12-08-14 10:54 |
φόρμες - υποφόρμες | tolkap | Access - Ερωτήσεις / Απαντήσεις | 0 | 17-01-14 19:17 |
[ Φόρμες ] Aυτόματη προσαρμογή στις διαστάσεις της οθόνης | mikekal1oo | Access - Ερωτήσεις / Απαντήσεις | 4 | 29-04-13 14:52 |
Απορία σχετικά με το πως βάζω όριο στις μέρες ενοικίασης | Vansel | Access - Ερωτήσεις / Απαντήσεις | 19 | 02-06-12 13:10 |
Φόρμες πολλαπλών ενεργειών | Zoe Forte | Access - Ερωτήσεις / Απαντήσεις | 2 | 09-05-12 00:10 |
Η ώρα είναι 20:30.