Mi riferisco allo stesso codice che avevo inserito nella scorsa discussione e che riporto qui sotto per chiarezza:
Public Sub ListLavori_Select()
'######################################################################### Sceglie il lavoro dalla lista proposta #####
pos3 = ListLavori.Index
If pos3 = 0
sw_altro = True
If FMain.tipoBll - 1 = 2
TextPersona.SetFocus
Endif
TextDescr.SetFocus
INS_PREZZO(0)
Else
descr$ = lavori$[pos3]
TextDescr.Text = descr$
prezzoUnit = prezzoVis[pos3]
INS_PREZZO(1)
Endif
ListCapi.Enabled = False
ButtonInsert.Background = &FF0000
ButtonInsert.Enabled = False
ButtonCancel.Background = &FF0000
ButtonCancel.Enabled = False
ButtonConf.Background = &00FF00
ButtonConf.Enabled = True
TextDescr.SetFocus
End
Il blocco finale di istruzioni, a parte l'ultima inserita per i ben noti accadimenti, serve a settare i vari bottoni del form dopo gli input richiesti, succede però che i vari pulsanti si settano gia prima di aver in particolare eseguito l'input del prezzo, questo fa cadere la procedura in condizione di errore, naturalmente bloccando il programma (ciò succedeva anche prima di inserire l'istruzione TextDescr.SetFocus ).
E' possibile evitare questo comportamento? E come?
Vi ringrazio ancora e saluto.
Io sposterei
ButtonInsert.Background = &FF0000
ButtonInsert.Enabled = False
ButtonCancel.Background = &FF0000
ButtonCancel.Enabled = False
ButtonConf.Background = &00FF00
ButtonConf.Enabled = True
in una sub a parte che viene chiamata alla fine delle inserzioni di input.
ma come si bloccano e si sbloccano i bottoni
Possiamo distinguere due condizioni:
1) il blocco dell'azione sull'Oggetto;
2) il blocco del sollevare eventi legati all'Oggetto.
Il primo caso si attua assegnando il valore booleano "False" alla proprietà ".Enabled" dell'oggetto Button. Così, pur cliccando sul tasto, non è abilitata la possibilità di premerlo, neppure visivamente.
Per sbloccare la proprietà ".Enabled", basterà assegnarle ovviamente il valore di True.
Il secondo caso si attua mediante l'uso del Metodo ".Lock( )" della Classe statica "Object". In questo caso, cliccando sull'Oggetto, lo vedremo virtualmente muoversi, ossia schiacciarsi, ma risulterà inibita ogni capacità di sollevare un evento previsto per quell'Oggetto.
Per sbloccare la capacità del Button di sollevare un proprio evento, sarà necessario utilizzare il previsto Metodo ".Unlock( )" della Classe statica "Object".
Mostriamo di seguito un semplice esempio pratico:
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
Button1.Enabled = False
Else
Button1.Enabled = True
Endif
End
Public Sub ToggleButton2_Click()
If ToggleButton2.Value Then
Object.Lock(Button1)
Else
Object.Unlock(Button1)
Endif
End
Public Sub Button1_Click()
Print "Il Button è agibile"
End
Possiamo distinguere due condizioni:
In vero potremmo aggiungere un'altra possibilità: quella offerta dalla proprietà ".Visible" dell'Oggetto, che - se posta a False - annulla completamente la visibilità dell'Oggetto sul Form, inibendo così il suo uso.
Volendo, dunque, completare il codice sopra mostrato:
Public Sub ToggleButton3_Click()
If ToggleButton3.Value Then
Button1.Visible = False
Else
Button1.Visible = True
Endif
End
Grazie per le risposte fin ora inserite,
Il discorso di Gianluigi che comunque è molto sensato, in qualche modo era già stato codificato nella routine che avevo inserito e che ripeto per vostra comodità:
Public Sub ListLavori_Select()
'######################################################################### Sceglie il lavoro dalla lista proposta #####
pos3 = ListLavori.Index
If pos3 = 0
sw_altro = True
If FMain.tipoBll - 1 = 2
TextPersona.SetFocus
Endif
TextDescr.SetFocus
INS_PREZZO(0)
Else
descr$ = lavori$[pos3]
TextDescr.Text = descr$
prezzoUnit = prezzoVis[pos3]
INS_PREZZO(1)
Endif
ListCapi.Enabled = False
ButtonInsert.Background = &FF0000
ButtonInsert.Enabled = False
ButtonCancel.Background = &FF0000
ButtonCancel.Enabled = False
ButtonConf.Background = &00FF00
ButtonConf.Enabled = True
TextDescr.SetFocus
End
In allegato ho anche postato la schermata del form su cui si va ad interagire; Come funziona l'inserimento dati? Semplicemente grazie al tasto insert si sceglie dalla lista sopra di esso un tipo di capo su cui si intende eseguire un lavoro, il tasto Cancel serve solo a togliere un tipo di capo in caso di sccelta sbagliata, la scelta fatta viene visualizzata nella grid soppra a cancel e nella lista a fianco vengono visualizzati i lavori eseguibili su quel tipo di capo.
Eseguendo una scelta tra i lavori presenti si entra nella Public Sub ListLavori_Select() con pos3 diverso da zero a questo punto viene eseguita la If pos3 = 0 dopo la else ove vengono passati i dati relativi alla scelta fatta ed eseguita la procedura INS_PREZZO(1), cioè senza nessun input.
In questa fase il problema non si manifesta, si manifesta invece inserendo la scelta Altro...., appena eseguita questa scelta si entra nella Public Sub ListLavori_Select() con pos3 uguale a zero a questo punto viene eseguita la If pos3 = 0 prima della la else ove trova l'istruzione TextDescr.SetFocus e di seguito la chiamata alla procedura INS_PREZZO(0) che in questo caso viene eseguita con l'input dell'importo del lavoro; Come vedete seguendo il mio ragionamento il bottone di Conferma non dovrebbe essere interessato da nessun sblocco e quindi dovrebbe rimanere inusabile. Nella pratica invece appena il campo descrizione attraverso il ben noto Public Sub ListLavori_Select() prende fuoco, cioè subito dopo la pressione dell'item Altro.... il bottone Conferma, lo si ritrova di colore verde ed è quindi attivo.
L'unica alternativa a questa situazione, a quanto mi può sembrare, è quindi gestire l'errore relativo alla eventuale errata pressione del tasto Conferma.
Cosa ne pensate della mia disanima, siete d'accordo con le mie conclusioni.
Vi ringrazio e vi saluto ancora.
Per me l'ora è tarda e quindi sono a rischio strafalcioni, ma io qui:
ButtonConf.Background = &00FF00
ButtonConf.Enabled = True
leggo che il pulsante Conferma viene azionato e colorato di verde prima di dare il focus alla casella descrizioni.
Pertanto è normale che accada quello :-\
Se non vuoi che in un dato caso il pulsante si attivi devi inserirne il comportamento anch'esso in una scelta (If).
:ciao: