Rilevare il nome dell'etichetta di un controllo

Anonimo
2015-05-28T16:18:05+00:00

ACCESS: In una form ho la necessità di ordinare i record con un clic sull'etichetta dei campi e, volendo evitare di scrivere il codice per ciascuna etichetta, vorrei scrivere un'unica routine che rilevando il nome dell'etichetta, esegue il relativo codice.

Grazie.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

24 risposte

Ordina per: Più utili
  1. Anonimo
    2015-05-29T09:09:43+00:00

    ciao Maurizio,

    posso chiederti una cosa?

    ieri sera, ho tentato, con scarsi risultati, l'implementazione di un evento di classe per impostare l'orderBY nella form e rendere l'evento utilizzabile da tutte le form.

    riesco a scatenare l'evento e il successivo ordinamento solamente se dichiaro esplicitamente la form in cui l'evento deve essere scatenato.

    cerco di spiegarmi meglio, e se non è sufficientemente chiaro, in serata posto una demo...

    se la form si chiama ordini.

    se dichiaro :

    private withEvents frm as form_ordini ---> in modo esplicito nel modulo di classe

    e setto la variabile oggetto nella class initialize set frm=forms!ordini

    ed istanzio la classe nella form richiamando su load il metodo initialize

    il raisevent che scatena l'orderby Desc o ASC a seconda del controlSource passato è ok.

    in questo modo però :

    private withEvents frm as access.form

    e poi così :

    e setto la variabile oggetto nella class initialize set frm=codecontextoJect

    niente da fare....

    Volevo capire se la strada è corretta piuttosto che no.  Questo sulla base del fatto che hai usato un' insieme VBA nel post precedente quindi credo la strada corretta sia più la tua che la mia anche per l'impostazione di un orderBY con una classe specifica.

    Mi basta anche un si o un no...poi cerco di realizzare il tutto autonomamente.

    Spero sia sufficientemente chiaro l'obbiettivo....

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-05-28T20:01:27+00:00

    Capito.

    In tal caso non ti resta che giocartela con classe. Precisamente due classi. Per esempio così:

    ____________________________________________________________

    Option Compare Database

    Option Explicit

    Private Const mcMod As String = "Form_frm1"

    Private myFrm As clsFrm

    Private Sub Form_Load()

          Debug.Print mcMod, "Form_Load"

          Set myFrm = New clsFrm

          myFrm.Start Me

    End Sub

    Private Sub Form_Unload(ByRef Cancel As Integer)

          Set myFrm = Nothing

          Debug.Print mcMod, "Form_Unload"

    End Sub

    ____________________________________________________________

    Option Compare Database

    Option Explicit

    Private Const mcMod As String = "clsFrm"

    Public myCtls As VBA.Collection

    Public Sub Start(ByVal frm As Access.Form)

    Dim itmCtl  As clsCtl

    Dim ctl     As Access.Control

          For Each ctl In frm.Controls

            If TypeName(ctl) = "Label" Then

              Set itmCtl = New clsCtl

              itmCtl.Start ctl

              myCtls.Add itmCtl, ctl.Name

            End If

          Next

          Set itmCtl = Nothing

          Set ctl = Nothing

    End Sub

    Private Sub Class_Initialize()

          Debug.Print mcMod, "Class_Initialize"

          Set myCtls = New VBA.Collection

    End Sub

    Private Sub Class_Terminate()

    Dim i As Long

          For i = 1 To myCtls.Count

            myCtls.Remove 1

          Next

          Set myCtls = Nothing

          Debug.Print mcMod, "Class_Terminate"

    End Sub

    ____________________________________________________________

    Option Compare Database

    Option Explicit

    Private Const mcMod As String = "clsCtl"

    Private WithEvents myLbl As Access.Label

    Public Sub Start(ByVal ctl As Access.Control)

        Select Case TypeName(ctl)

        Case "Label"

          Set myLbl = ctl

          myLbl.OnDblClick = "[Event Procedure]"

        Case Else

          ' DO NOTHING

        End Select

    End Sub

    Private Sub Class_Initialize()

          Debug.Print mcMod, "Class_Initialize"

    End Sub

    Private Sub Class_Terminate()

          Set myLbl = Nothing

          Debug.Print mcMod, "Class_Terminate"

    End Sub

    Private Sub myLbl_DblClick(ByRef Cancel As Integer)

          MsgBox myLbl.Name

    End Sub

    ____________________________________________________________

    Sperimenta questo codice con una maschera (frm1) e qualche Label e TextBox, io ne ho usati 5 e 5, di nome lbl1 .. lbl5, txt1 .. txt5. E un pulsante, giusto per metterlo.

    Se hai fatto tutto giusto al doppio clic sulle label dovrebbe comparire un msgbox col nome della label.

    EDIT:

    Aperta e poi chiusa la maschera, nella finestra Immediata dovresti vedere:

    Form_frm1     Form_Load

    clsFrm        Class_Initialize

    clsCtl        Class_Initialize

    clsCtl        Class_Initialize

    clsCtl        Class_Initialize

    clsCtl        Class_Initialize

    clsCtl        Class_Initialize

    clsCtl        Class_Terminate

    clsCtl        Class_Terminate

    clsCtl        Class_Terminate

    clsCtl        Class_Terminate

    clsCtl        Class_Terminate

    clsFrm        Class_Terminate

    Form_frm1     Form_Unload

    EDIT2:

    Il file di esempio è **qui**.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-05-28T18:39:36+00:00

    @Sandro e Maurizio, Vi ringrazio ma mi sono espresso in modo approssimativo. In effetti quello che chiedevo è proprio la soluzione all'alternativa suggeritami da Maurizio riferendosi alle etichette libere ma a quanto vedo la soluzione mi comporterebbe comunque di scrivere tante routine per quante sono le etichette.

    Per spiegarmi, quando in una Form ho più tasti (es: Stampa - PDF - Anteprima) anziché scrivere il codice per ogni tasto, scrivo una sola funzione tipo:

    Function Tasto()

    AZ = Me.ActiveControl.Caption  'ricavo testo del tasto

    if AZ = "stampa" then

    .....

    elseif AZ = "stampa" then

    ....

    else

    ...

    end function

    Ad ogni tasto, sull'evento clik, gli abbino =Tasto()

    Pensando che il Me.activecontrol.caption rilevasse il nome anche dalle etichette e non solo dai controlli, pensavo di fare la stessa cosa.

    Approfondirò il suggerimento di Maurizio per vedere se posso adattarlo.

    Grazie ad entrambi.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-05-28T17:04:16+00:00

    Ciao luigix73,

    se ho capito bene intendi automatizzare quello che si ottiene col clic destro su un controllo, come in questa immagine:

    Se è così, un modo potrebbe essere il seguente:

    Private Sub OrderByActiveControl()

    Dim s As String

    Dim e As Long

          On Error Resume Next

          s = Me.ActiveControl.ControlSource

          e = Err.Number

          Err.Clear

          On Error GoTo ErrH

          If e Then Exit Sub

          Me.OrderBy = s

    ExtP:

          Exit Sub

    ErrH:

          MsgBox Err.Description, vbCritical, "ERR#" & Err.Number

          Resume ExtP

    End Sub

    Private Sub Campo1_DblClick(ByRef Cancel As Integer)

          OrderByActiveControl

    End Sub

    Private Sub Campo2_DblClick(ByRef Cancel As Integer)

          OrderByActiveControl

    End Sub

    EDIT:

    Dimenticavo... Parli di etichette, ma se le etichette sono allegate al controllo quanto sopra produce lo stesso effetto sia che il doppio-clic avvenga sul controllo che sulla sua etichetta.

    Se invece le etichette sono libere allora OrderByActiveControl dovrà essere modificata:

    1. aggiungi come argomento un controllo
    2. invece che ricavare la proprietà ControlSource dal controllo attivo la ricavi dal controllo in argomento.
    3. nella routine-evento delle etichette scriverai per esempio:

    OrderByActiveControl Me.Campo1

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2015-05-28T16:36:32+00:00

    ciao Luigix73,

    intedi ordinare crescente o decrescente in base al doppio click sull'etichetta della relativa text box?

    dimmi se può andare una cosa del genere...poi la sistemiamo, mi interessa il concetto per ora:

    Option Compare Database

    Option Explicit

    Private strOrder As String

    Private Sub lblidordine_DblClick(Cancel As Integer)

    If strOrder = "desc" Then strOrder = "asc" Else strOrder = "desc"

    Me.OrderBy = "idordine " & strOrder

    End Sub

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento