PDA

Visualizza versione completa : Cancellare contenuto controlli maschera.


Fast-M
17-05-2005, 11.33.53
Salve a tutti.
Qualcuno può spiegarmi il metodo per cancellare il contenuto di tutti i controlli di una maschera di access tramite vba in un sol colpo?
Se in una maschera ho 6 text box,4 listbox,4 combobox è noioso e comunque poco elegante andare ad impostare la proprietà di ogni controllo in modo che non visualizzi più nulla al suo interno!
Grazie anticipatamente!

:confused:

LoryOne
17-05-2005, 16.14.10
...passavo di qua... :D

Fast tu vuoi troppo però può essere un'utile procedura da riutilizzare in futuro.

Anche se in Access esistesse una procedura già pronta, altro non farebbe che:

Iterare su ogni controllo contenuto nella classe (o gruppo) Controls ereditato dall'oggetto Form (ossia la tua maschera)
Per ogni controllo identificarne la tipologia (utilizza TypeOf) ed effettuare l'operazione ad esso associato.

In poche parole si potrebbe tradurre il tutto in uno script del genere:


For Each Ctl in Form.Controls
if TypeOf Ctl Is TextBox Then Ctl.Text=vbNullString
If TypeOf Ctl Is ListBox Then .....
If TypeOf Ctl Is ComboBox Then ....
If ....
Next

Fast-M
18-05-2005, 00.30.18
Grazie come sempre Lory, comunque sono arrivato alla soluzione già stamattina perchè ho trovato il blocco che non mi faceva funzionare quello che concettualmente era corretto.
Infatti volevo usare l'insieme Controls e iterare tra tutti i suoi elementi, ma non so perchè mi ero mangiato la s finale e anzicchè Controls scrivevo Control definendo semplicemente un puntatore ad un controllo anzicchè un puntatore all'insieme Controls.:D
Trovato l'inghippo di distrazione ho risolto in modo simile a quello che hai proposto e cioè:
----------------------------------
Public Sub SvuotaControlli()
Dim i As Integer, ctl As Controls, _
txt As TextBox, cmb As ComboBox, _
lst As ListBox
Set ctl = Forms!MiaForm.Controls
For i = 0 To ctl.Count - 1
Select Case ctl(i).ControlType
Case acTextBox
Set txt = ctl(i)
txt = ""
Case acComboBox
Set cmb = ctl(i)
cmb = ""
Case acListBox
Set lst = ctl(i)
lst.RowSource = ""
End Select
Next
End Sub
----------------------------
Ma è un pò più macchinoso del tuo che è davvero ottimizzato, ma mi era sfuggito di mente l'operatore TypeOf.
Ti faccio notare comunque, giusto perchè è una cosa che mi ha fatto quasi uscire pazzo per diversi giorni, che in access non conviene mai riferirsi alla proprietà text di una textbox in modo esplicito, ma conviene sempre ometterla e avvalersi del fatto che è la proprietà predefinita del controllo textbox.
Infatti con i principali eventi come il Click, se provi ad impostare il valore della proprietà text di un altra text box dall'evento click di una combobox si ottiene sempre quello strano errore:
"impossibile impostare la proprietà a causa di..."
Scrivendo invece semplicemente il nome della textbox="..." funziona tutto correttamente. E' comunque un problema di access, perchè in Vb non è mai successo.
Grazie di nuovo!
:)

LoryOne
18-05-2005, 08.30.39
Ti faccio notare che in access non conviene mai riferirsi alla proprietà text di una textbox in modo esplicito, ma conviene sempre ometterla e avvalersi del fatto che è la proprietà predefinita del controllo textbox.


Ottimo !
Da quanto hai esposto sembra che la proprietà predefinita per una textbox in Access sia Value invece di Text e che quest'ultima necessiti lo stato attivo sul controllo prima di cambiar contenuto.

Sebbene si possa eludere tranquillamente l'errore con questo script:


With TxtTesto
.SetFocus
.Text = vbNullString
End With
Screen.PreviousControl.SetFocus


la soluzione da te proposta consente si scrivere meno ed ottenenre lo stesso risultato (Y)
Access, comunque, l'è 'na bruta bestia :) :D

Fast-M
18-05-2005, 12.06.33
Ma comunque la proprietà di default del controllo textbox dovrebbe essere la text non la value.
La value, se non vado errato è la default della combobox e della listbox.
Aggiungo che non è un problema di focus, perchè se provi come ti ho detto ad impostare il valore della proprietà text di una textbox dall'evento click di una combobox anche se ti preoccupi di spostare il fuoco sulla textbox prima di settarne il valore ti da comunque sempre lo stesso errore.
cioè se fai:
-----------------
Private Sub Combo1_Click()
text1.setfocus
text1.text="Prova errore"
End Sub
-----------------
Non ho mai provato usando il With, ma non credo cambi qualcosa visto che il With dovrebbe servire solo a non riscrivere il nome del controllo.
Prova comunque e fammi sapere perchè mi ha fatto uscire pazzo per giorni sta cosa ed è comunque una palese incoerenza nel funzionamento di access.
Ciao.

Fast-M
18-05-2005, 12.18.37
Comunque ho ottimizzato il mio codice così:
-----------------------------
Public Sub SvuotaControlli()
Dim txt As TextBox, cmb As ComboBox, _
lst As ListBox, ctl As Control
For Each ctl In Forms(0).Controls
If TypeOf ctl Is TextBox Then
Set txt = ctl
txt = ""
End If
If TypeOf ctl Is ComboBox Then
Set cmb = ctl
cmb = ""
End If
If TypeOf ctl Is ListBox Then
Set lst = ctl
lst.RowSource = ""
End If
Next
End Sub
----------------------------
Vorrei solo evitare di usare il numero 0 per riferirmi alla form chiamante, ma ho provato ad impostare in questa sub un parametro di tipo Form, ma non ha funzionato. Cioè ho provato:
-------------------------
Public Sub SvuotaControlli(maschera as Form)

e poi dalla form chiamante ho scritto:
SvuotaControlli(Forms!NomeDiQuestaForm)
e mi ha dato errore.
Forse perchè dalla form chiamante ho cercato di passare se stessa e dovevo invece passare un clone o altro?
Grazie di nuovo!
:)