Funzione per la formattazione di un campo

di eddy1973 il
17 risposte
Buonasera, ho creato la seguente funzione per per formattare dei campi di una maschera:
Public Function format_campo(ctrl As Access.control) As Boolean
With ctrl
If Len(.Value & vbNullString) = 0 Then
    Select Case format_campo
        Case format_campo = False
                        .SpecialEffect = 0
                        .BorderWidth = 1
                        .BorderColor = rosso
                        .Value = "!"
                        .TextAlign = 1
                        .ForeColor = rosso
        Case format_campo = True
                        .SpecialEffect = 2
                        .BorderWidth = 1
                        .BorderColor = g_chiaro
                        .Value = vbNullString
                        .TextAlign = 1
                        .ForeColor = vbBlack
    End Select
End If
End With
Set ctrl = Nothing
End Function
la funzione la utilizzo poi nel seguente modo:
If Len(Me.txtente_rich & vbNullString) = 0 Then format_campo (Me.txtente_rich) = False
mi restituisce un errore "La chiamata di funzione a sinistra dell'assegnazione deve restituire Variant o Object.

Dove sbaglio?

17 Risposte

  • Sbagli la funzione
    Non ti è chiaro quali sono i parametri di ingresso della funzione (ctrl -> Access.control) e i parametri di uscita (format_campo di tipo boolean) oltremodo fai una assegnazione (set ctrl = nothing) che è totalmente assurda

    Qualsiasi tentativo di correzione di quanto da te scritto porterebbe alla riscrittura completa del tutto in quanto non c'è alcun fondamento logico nel tuo codice ...
  • Alla fine ho modificato così:
    Public Function format_campo(ctrl As Access.control)
    With ctrl
            If Len(.Value & vbNullString) = 0 Then
                .SpecialEffect = 0
                .BorderWidth = 1
                .BorderColor = rosso
                .Value = "!"
                .TextAlign = 1
                .ForeColor = rosso
            Else
                .SpecialEffect = 2
                .BorderWidth = 1
                .BorderColor = g_chiaro 
                .TextAlign = 1
                .ForeColor = vbBlack
            End If
    End With
    End Function
    e ho utilizzato la funzione in un evento keyUp come di seguito:
    Private Sub txtente_rich_KeyUp(KeyCode As Integer, Shift As Integer)
    format_campo Me.txtente_rich
    end sub
    ma non si comporta come speravo.
  • Adesso la funzione appare scritta con cognizione di causa, il richiamo della stessa nell'evento KeyUp probabilmente non è la scelta migliore.
    Qual'è il tuo obbiettivo (sembra che tu voglia far cambiare l'aspetto del controllo quando è vuoto rispetto a quando contiene qualcosa)?
    Quando deve intervenire questo cambio di aspetto ?
  • Si tratta di campi obbligatori. Quando il campo è vuoto deve apparire con bordo rosso e la presenza del carattere ! in rosso e quando il campo è compilato il bordo nero e assenza del carattere ! in rosso. Ovviamente quando l'operatore cancella tutto deve riapparire il carattere ! in rosso e il bordo del controllo in rosso.
    Quale evento sarebbe più opportuno utilizzare per fare questo?
  • Solitamente quando servono questi effetti speciali... servirebbe usare la programmazione ad oggetti... in particolare servirebbe creare una classe che gestisca appunto tutte le opzioni del controllo assegnato alla classe.
    In questo modo basta scrivere 1 codice solo ed istanziare tante classi quanti sono i controlli da gedtire.
    Purtroppo questa tecnica che è normale in altri linguaggi è pressoché sconosciuta agli utenti di Office.

    A prescindere quindi dovrai scrivere codice per ogni controllo... e gestire vari eventi... Enter/Exit del controllo ma anche current di form in caso di newrecord... altrimenti non funziona bene.
  • Pienamente d'accordo. Infatti opero in questo modo non sapendo lavorare con le classi, che dovrò affrontare prossimamente.
    Quello che non capisco è il comportamento della funzione nell'evento keyup. Forse la risposta è che l'unica maniera di risolvere è quella di ricorrere alle classi?
  • No è che devi leggere la proprietà Text e non Value.
  • I controlli sono textbox e una combobox. Se invoco la proprietà .text anzichè .value:
    Private Sub txtente_rich_KeyUp(KeyCode As Integer, Shift As Integer)
    format_campo Me.txtente_rich.Text
    end sub
    mi restituisce errore "tipo non corrispondente" in evento keyup.
  • Nella funzione... non quando la chiami che ovviamente vuole un oggetto Control.
  • Si ma se uso la proprietà .text anzichè .value nella funzione non ha lo stato attivo. Come risolvo?
  • Ok. Ho risolto ricorrendo al metodo setfocus per rendere attivo lo stato del controllo:
    Public Function format_campo(ctrl As Access.control)
    With ctrl
    ctrl.Setfocus
            If Len(.Value & vbNullString) = 0 Then
                .SpecialEffect = 0
                .BorderWidth = 1
                .BorderColor = rosso
                .Value = "!"
                .TextAlign = 1
                .ForeColor = rosso
            Else
                .SpecialEffect = 2
                .BorderWidth = 1
                .BorderColor = g_chiaro 
                .TextAlign = 1
                .ForeColor = vbBlack
            End If
    End With
    End Function
    Ora và bene. Grazie.
  • Scusa ma come fa a non avere lo stato attivo...?
    Su che evento lo chiami...?
  • Evento keyUp. Questo è per uno dei controlli:
    Private Sub txtente_rich_KeyUp(KeyCode As Integer, Shift As Integer)
    format_campo Me.txtente_rich
    end sub
  • A maggior ragione non può non avere il focus... c'è qualche altra cosa strana...
Devi accedere o registrarti per scrivere nel forum
17 risposte