Newsgroup: it.comp.appl.access
Titolo: Withevents, forms e sottoforms

Carissimi, bentrovati e buon anno!
Grazie ai vari post consultati, son riuscito a generalizzare una
routine di ordinamento (cresc e desc) di una form continua, tramite
withevents e l'evento click delle label che sono situate
nell'intestazione della maschera e che fungono da "titolo della
colonna" (per dirla alla excel).
Fin qui tutto ok ma poi ho provato, con lo stesso codice e
procedimento, ad implementare l'ordinamento in una subform continua,
mi spiego. Ho una form non continua che al suo interno contiene la
subform continua che al click delle label in intestazione deve
ordinarsi.
Vi posto il codice utlizzato:
'nella FORM
Private Sub Form_Load()
    Call FunzioneEventiTxtCbx(Me.Name)
End Sub
'MODULO
Public Function FunzioneEventiLbl(NomeForm As String)
    Dim ClickLbl As SuEventoLbl
    Dim Ctl As Control
    For Each Ctl In Forms(NomeForm).Controls 'IL CODICE SI BLOCCA QUI
        Select Case Ctl.ControlType
        Case 100 'acLabel
            Set ClickLbl = New SuEventoLbl
            If Ctl.Tag = "ManinaTxt" Then ClickLbl.EspansioneLbl Ctl
            Istanze.Add ClickLbl
        End Select
    Next
End Function
'MODULO DI CLASSE
Option Compare Database
Option Explicit
Private WithEvents Lbl As Label
Public Controllo As Control
Public Function EspansioneLbl(Lb As Label)
    Set Lbl = Lb
    Lbl.OnClick = "[Event Procedure]"
End Function
Private Sub Lbl_Click()
    If Lbl.Tag = "ManinaTxt" Then Call DaOrdinare(Mid(Lbl.Name, 4,
Len(Lbl.Name)))
End Sub
Public Function DaOrdinare(NomeControllo As String)
On Error Resume Next
    Application.Echo False
    Dim Controllo As Control
    For Each Controllo In Screen.ActiveForm.Controls
        If Controllo.Tag = "DaOrdinare" Then
            If Controllo.Name = NomeControllo Then Controllo.ForeColor
= 6697728 '16711680
            If Controllo.Name <> NomeControllo Then
Controllo.ForeColor = 0
        End If
    Next Controllo
    Select Case Screen.ActiveForm.OrderBy
    Case NomeControllo
        Screen.ActiveForm.OrderBy = NomeControllo & " DESC"
    Case NomeControllo & " Desc"
        Screen.ActiveForm.OrderBy = NomeControllo
    Case Else
        Screen.ActiveForm.OrderBy = NomeControllo
    End Select
    Screen.ActiveForm.OrderByOn = True
    Application.Echo True
End Function
Torno a precisare che il codice postato funziona quando si è in
presenza di una sola form continua, ma quando la form è contenuta in
un'altra form (e quindi è una subform) ricevo questo errore:
Impossibile trovare la maschera 'NomeSubForm' a cui si fa riferimento
in un'espressione macro e nel codice di VB ed il codice si blocca
sull'istruzione FOR.
Spero vogliate aiutarmi nel raggiungere la soluzione!
Grazie anticipatamente
Michele


A maggior informazione, ho provato ad eseguire solo la subform, senza
la form madre, e non ho ricevuto alcun errore. Quindi credo che
l'errore non sia nella sostanza del codice, ma nella forma, ovvero
sono sbagliati i riferimenti.
Grazie ancora

 ha scritto nel messaggio 
news:196a73e3-931c-4e64...@k39g2000hsf.googlegroups.com...
Carissimi, bentrovati e buon anno!
Grazie ai vari post consultati, son riuscito a generalizzare una
routine di ordinamento (cresc e desc) di una form continua, tramite
withevents e l'evento click delle label che sono situate
nell'intestazione della maschera e che fungono da "titolo della
colonna" (per dirla alla excel).
Fin qui tutto ok ma poi ho provato, con lo stesso codice e
procedimento, ad implementare l'ordinamento in una subform continua,
mi spiego. Ho una form non continua che al suo interno contiene la
subform continua che al click delle label in intestazione deve
ordinarsi.
Vi posto il codice utlizzato:
'nella FORM
Private Sub Form_Load()
a quale funzione passi il nome della form?
___________________________________
    Call FunzioneEventiTxtCbx(Me.Name )
___________________________________
End Sub
'MODULO
Public Function FunzioneEventiLbl(NomeForm As String NomeSubForm as string)
    Dim ClickLbl As SuEventoLbl
    Dim Ctl As Control
Qui in che modo gli passi il nome della form e subform?
:
___________________________________________________________________________________
    For Each Ctl In Forms(NomeForm).Controls(NomeSubForm).controls  'IL 
CODICE SI BLOCCA QUI
___________________________________________________________________________________








    Application.Echo True
End Function


-- 
Ciao
Geppo 


Attenzione a non confondere l'oggetto "subform" con il form contenuto in 
tale oggetto ed inoltre l'insieme forms "non" vede i subform
i.e. una cosa del genere Forms(nomeform) e' errata.
-- 
ac
y-1=x



'nella FORM

'MODULO









    Application.Echo True
End Function
Torno a precisare che il codice postato funziona quando si č in
presenza di una sola form continua, ma quando la form č contenuta in
un'altra form (e quindi č una subform) ricevo questo errore:
Impossibile trovare la maschera 'NomeSubForm' a cui si fa riferimento
in un'espressione macro e nel codice di VB ed il codice si blocca
sull'istruzione FOR.
Spero vogliate aiutarmi nel raggiungere la soluzione!
Grazie anticipatamente
Michele
[---------------------RISPOSTA---------------------]
Non ho ben capito il tutto ma mi pare manchi la ricorsione all'oggetto
Form...!
Prova a modificare questa cosě:
Public Function FunzioneEventiLbl(frm As Access.Form)
    Dim ClickLbl As SuEventoLbl
    Dim Ctl As Control
    For Each Ctl In Forms(NomeForm).Controls 'IL CODICE SI BLOCCA QUI
        Select Case Ctl.ControlType
            Case 100 'acLabel
                Set ClickLbl = New SuEventoLbl
                If Ctl.Tag = "ManinaTxt" Then ClickLbl.EspansioneLbl Ctl
                Istanze.Add ClickLbl
            Case acSubform
                Call FunzioneEventiLbl(ctl.Form)
            End Select
    Next
End Function
Chiaramente su LOAD devi parrare l'Oggetto e non il Nome...
Call FunzioneEventiTxtCbx(Me)
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

 ---------------------------------------------------------------------------
Grazie 1000 a tutti e 3: siete stati a vario titolo molto più che
utili.
Ho iniziato a lavorare sulla modifica di Alex, sulla quale mi sono
permesso di correggere la seguente riga:
   For Each Ctl In Forms(NomeForm).Controls
in....
   For Each Ctl In Frm.Controls
saltando (finalmente) l'errore che ho descritto prima. :-)
Ora, sto lavorando sul ritorno della funzione (l'ordinamento della
form o subform) e voglio smanettarci ancora un bel pò (ma credo vista
l'ora se ne parli domani mattina) prima di richiedere ancora il vostro
prezioso aiuto. Cmq mi è già chiaro che l'errore sta tutto nella
confuzione fra l'oggetto subform e il form in esso contenuto.
Grazie ancora e a risentirci (magari con la soluzione e non con
un'ulteriore richiesta d'aiuto.....)
Michele

Grazie 1000 a tutti e 3: siete stati a vario titolo molto più che
utili.
Ho iniziato a lavorare sulla modifica di Alex, sulla quale mi sono
permesso di correggere la seguente riga:
   For Each Ctl In Forms(NomeForm).Controls
in....
   For Each Ctl In Frm.Controls
saltando (finalmente) l'errore che ho descritto prima. :-)
Ora, sto lavorando sul ritorno della funzione (l'ordinamento della
form o subform) e voglio smanettarci ancora un bel pò (ma credo vista
l'ora se ne parli domani mattina) prima di richiedere ancora il vostro
prezioso aiuto. Cmq mi è già chiaro che l'errore sta tutto nella
confuzione fra l'oggetto subform e il form in esso contenuto.
Grazie ancora e a risentirci (magari con la soluzione e non con
un'ulteriore richiesta d'aiuto.....)
Michele
Si è un refuso del Copia/Incolla/Modifica della tua funzione...!



Carissimi,
grazie ai vostri consigli son riuscito ad eliminare errori e problemi
sulla questione "withevents", però ora mi trovo davanti alla
difficoltà di ordinare la maschera continua, a seconda se è una
maschera indipendente oppure se è una subform.
Ecco il codice
'in FORM -----------------------------------------
Private Sub Ricerca_Click()
On Error Resume Next
    FiltroRicerca = Me.Filter
    Select Case FunzioneRicerca(Me.Name)
    Case True
        Me.Filter = FiltroRicerca
        Me.FilterOn = True
    Case False
        Me.FilterOn = False
    End Select
    Application.Echo True
End Sub
'in MODULO -----------------------------------------
Public Function FunzioneRicerca(NomeForm As String) As Boolean
On Error Resume Next
    Dim Stringa As String
    Dim NumCampi As Integer
    Application.Echo False
    Forms(NomeForm).Xxx.SetFocus
    Stringa = InputBox("Inserire il testo da ricercare." & Chr(13) &
Chr(13) & "Cliccare sul tasto 'Annulla' per avere l'elenco completo.",
"   .: Ricerca :.")
    If Forms(NomeForm).ConteggioRecord = Null Then
        FiltroRicerca = ""
    End If
    Select Case Stringa
    Case Is <> ""
        If FiltroRicerca <> "" Then FiltroRicerca = FiltroRicerca & "
AND "
        X = 0
        For Each Campo In Forms(NomeForm).RecordsetClone.Fields
            If Mid(Campo.Name, 1, 2) <> "Id" And Mid(Campo.Name, 1, 3)
<> "Cod" Then NumCampi = NumCampi + 1
            'NumCampi = NumCampi + 1
        Next Campo
        For Each Campo In Forms(NomeForm).RecordsetClone.Fields
            If Mid(Campo.Name, 1, 2) <> "Id" And Mid(Campo.Name, 1, 3)
<> "Cod" Then
                X = X + 1
                Select Case X
                Case 1
                    FiltroRicerca = FiltroRicerca & "([" & Campo.Name
& "] Like '*" & Stringa
                Case NumCampi
                    FiltroRicerca = FiltroRicerca & "*' OR [" &
Campo.Name & "] Like '*" & Stringa & "*')"
                Case Else
                    FiltroRicerca = FiltroRicerca & "*' OR [" &
Campo.Name & "] Like '*" & Stringa
                End Select
            End If
        Next Campo
        FunzioneRicerca = True
    Case Cancel
        FunzioneRicerca = False
        FiltroRicerca = ""
    End Select
End Function
Il codice postato funziona alla grande se è eseguito da e su una
maschera continua a se stante. Quello che serve realizzare è ordinare
una subform continua, con il tasto ricerca situato nella maschera
principale, anche dovendo riscrivere il codice, ma con i riferimenti
sono in alto mare. Aspetto suggerimenti.
Grazie 1000
Michele

 - Mostra testo tra virgolette -
Sicuramente ho postato la function errata, infatti non centra niente,
e forse ho trovato la soluzione. Se funziona la posto.
Grazie
Michele