Autore Topic: Come governare un bottone in evento Click  (Letto 3045 volte)

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Come governare un bottone in evento Click
« il: 21 Agosto 2017, 15:58:30 »
Rieccomi,  :ciao: oggi imperverso con i miei interrogativi, non pichiatemi!

Nel form su cui sto lavorando ho descritto un pulsante "CARICO SARTA" che comanda una variabile boolean SwSart, il mio intendimento sarebbe avere il pulsante colorato in Rosso se la variabile è False ed invece in Verde se la variabile è True.

Per fare ciò ho descritto il seguente evento:
Codice: [Seleziona]
Public Sub ButtonCaricoSarta_Click()
'############################################################# Inserimento / disinserimento del flag CARICO SARTA #####

  If SwSart = False
    SwSart = True
    ButtonCaricoSarta.Background = &00FF00
  Else
    SwSart = False
    ButtonCaricoSarta.Background = &FF0000
  Endif

End
Purtroppo ciò che mi pareva poter funzionare a dovere non pare dare i risultati sperati, :hard: in effetti il pulsante all'entrata della sezione viene settato .Enabled=True e con il background rosso che appena cliccato diventa Verde, purtroppo ad un secondo click non si ripristina il colore verde anche se la variabile viene cambiata a dovere: qual'è il problema che mi affligge? Vi ringrazio.

Ciao a tutti. :ciao:
« Ultima modifica: 21 Agosto 2017, 15:59:06 da Franco_da_vc »
Bye by Afo

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #1 il: 21 Agosto 2017, 16:58:07 »
A me funziona sia con QT che con GTK  :-\

Potresti scriverlo così e risparmi il booleano, se non ti serve al di fuori di qui:
Codice: [Seleziona]
  If ButtonCaricoSarta.Background = &00FF00 Then
    ButtonCaricoSarta.Background = &FF0000
  Else
    ButtonCaricoSarta.Background = &00FF00
  Endif

 :ciao: :ciao:
« Ultima modifica: 21 Agosto 2017, 16:59:46 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #2 il: 21 Agosto 2017, 19:00:43 »
Ti ringrazio GianLuigi per la tua risposta:
A me funziona sia con QT che con GTK  :-\

Potresti scriverlo così e risparmi il booleano, se non ti serve al di fuori di qui:
Codice: [Seleziona]
  If ButtonCaricoSarta.Background = &00FF00 Then
    ButtonCaricoSarta.Background = &FF0000
  Else
    ButtonCaricoSarta.Background = &00FF00
  Endif
Per quanto riguarda la variabile boolean, come ben hai compreso tu, mi serve in una altra parte del programma, quindi è importatante che compaia in quel brano di codice, mi sono però accorto solo ora, purtroppo, che nel precedente messaggio ho scritto una imprecisione:
Purtroppo ciò che mi pareva poter funzionare a dovere non pare dare i risultati sperati, :hard: in effetti il pulsante all'entrata della sezione viene settato .Enabled=True e con il background rosso che appena cliccato diventa Verde, purtroppo ad un secondo click non si ripristina il colore verde anche se la variabile viene cambiata a dovere: qual'è il problema che mi affligge? Vi ringrazio.
Il giusto è invece: purtroppo ad un secondo click non si ripristina il colore Rosso anche se la variabile viene cambiata a dovere. in parole brevi ciò che desidero è che con SwSart=False il pulsante abbia il background rosso, mentre in ogni caso con SwSart=True il pulsante abbia il backgroundverde. :-[
Vi ringrazio ancora per gli aiuti.
Bye by Afo

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #3 il: 21 Agosto 2017, 19:28:21 »
Intendi una cosa così?:
Codice: [Seleziona]
Private SwSart As Boolean

Public Sub ButtonCaricoSarta_Click()
'############################################################# Inserimento / disinserimento del flag CARICO SARTA #####

  If SwSart = False
    ButtonCaricoSarta.Background = &FF0000
     SwSart = True
  Else
    ButtonCaricoSarta.Background = &00FF00
    SwSart = False
  Endif

End

Public Sub Form_Open()

  SwSart = True
  ButtonCaricoSarta_Click()

End

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #4 il: 21 Agosto 2017, 20:56:38 »
Intendi una cosa così?:
Codice: [Seleziona]
Private SwSart As Boolean

Public Sub ButtonCaricoSarta_Click()
'############################################################# Inserimento / disinserimento del flag CARICO SARTA #####

  If SwSart = False
    ButtonCaricoSarta.Background = &FF0000
     SwSart = True
  Else
    ButtonCaricoSarta.Background = &00FF00
    SwSart = False
  Endif

End

Public Sub Form_Open()

  SwSart = True
  ButtonCaricoSarta_Click()

End


Beh! Penso che i due listati corrispondano per molto, a dire il vero la variabile SwSart e stata dichiarata come public e non come private, la seconda cosa che mi desta interrogativi è la seconda parte del listato (quella all'interno della sub Form_open) non capisco a cosa possa servire la chiamata
Codice: [Seleziona]
  ButtonCaricoSarta_Click()
al suo interno. In ogni caso grazie GianLuigi per i suggerimenti

 :ciao:
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #5 il: 21 Agosto 2017, 21:10:02 »
in parole brevi ciò che desidero è che con SwSart=False il pulsante abbia il background rosso, mentre in ogni caso con SwSart=True il pulsante abbia il backgroundverde.

Non mi è molto chiaro se tu vuoi che, quando il pulsante è "rosso", anche la variabile booleana globale assuma il valore di False.

Cioè così:
Codice: [Seleziona]
Private bo As Boolean


Public Sub Button1_Click()

  If bo = True
    Button1.Background = Color.Red
    bo = False
  Else
    Button1.Background = Color.Green
    bo = True
  Endif
   
End

In caso negativo, dovresti allora mostrare un breve codice funzionante che riproduca il problema da te posto.
« Ultima modifica: 21 Agosto 2017, 21:51:10 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #6 il: 21 Agosto 2017, 21:54:46 »
Grazie Vuott per l'intervento
a dire il vero la variabile SwSart e stata dichiarata come public e non come private
Per quale ragione hai dichiarato "pubblica" quella variabile globale ? La utilizzi in altre Classi o Moduli da te creati ?

In effetti la variabile SwSart viene usata solamente all'interno della Classe FFacit.Class che è associata alla form FFacit.Form.
Quindi devo pensare che le varie variabili sia meglio dichiararle "Private"?
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #7 il: 21 Agosto 2017, 22:05:31 »
Quindi devo pensare che le varie variabili sia meglio dichiararle "Private"?
E' inutile dichiararle Pubbliche, se le utilizzi strettamente all'interno di una Classe o Modulo.

...da qualche parte nel forum, anni fa, si pose anche la questione se la dichiarazione "Pubblica" comportasse - tra l'altro - maggiore dispendio di memoria.  ...dovrei ritrovare questa discussione...
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #8 il: 21 Agosto 2017, 22:23:11 »
Beh! Penso che i due listati corrispondano per molto, a dire il vero la variabile SwSart e stata dichiarata come public e non come private, la seconda cosa che mi desta interrogativi è la seconda parte del listato (quella all'interno della sub Form_open) non capisco a cosa possa servire la chiamata
Codice: [Seleziona]
  ButtonCaricoSarta_Click()
al suo interno. In ogni caso grazie GianLuigi per i suggerimenti

 :ciao:

Devi leggere il listato con più attenzione, infatti il mio lavora esattamente all'opposto del tuo.
Tu chiedi che il bottone con SwSart=True abbia il background verde e io con la prima chiamata, ma potrebbe essere lanciatada una qualunque altra routine, ti dimostro che se SwSart=True il button se premuto (ButtonCaricoSarta_Click()) si colora di verde.
Quindi se tu vuoi che quando SwSart è True il button premuto si colori di verde e viceversa si colori di rosso, questo lo fa e pone anche SwSart a False e viceversa.
Se invece desideri un'altro comportamento allora devi spiegare meglio cosa vuoi.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #9 il: 22 Agosto 2017, 03:10:58 »
devi spiegare meglio cosa vuoi.

   
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #10 il: 22 Agosto 2017, 11:08:04 »
devi spiegare meglio cosa vuoi.

   
:D

Comunque tanto per essere più chiaro, suppongo che se hai messo un booleano globale esso debba essere letto da altre parti; ma il codice postato da te contiene un evidentissimo bug prima di valutare lo stato del booleano lo cambia e pertanto non potrai mai ottenere una lettura corretta.
Anche se la procedura che cambia lo stato del booleano è solo all'interno del pulsante, comunque non può essere inserita nella parte di codice che la valuta, ma prima.

Facciamo un'ipotesi di algoritmo, io carico attraverso delle textbox, dei checkbox e dei combobox i dati per la sarta, se il pulsante che valuta (penso sia caricosarta) valuta  che tutti gli inserimenti vanno bene allora cambierà lo stato del booleano a true altrimenti a false. Ma prima del valutatore che sarà posta in fondo alla routine e che dovrà solo vedere se il booleano è a true o false e in base a questo cambiare il colore  e basta.

Poi alla fine delle valutazioni da parte di tutte le routine che devono contribuire sull'ultima riporterai il booleano a false pronto per un nuovo carico.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #11 il: 22 Agosto 2017, 21:27:25 »
Prima di continuare con il discorso desidero in ogni caso ringraziarvi per l'attenzione che state dedicando alla mia problematica.

Vorrei però introdurre una nuova riflessione: potrebbe darsi che all'interno di un evento _Click che interessi l'oggetto su cui sto lavorando non si possa modificare l'attributo .Background dell'oggetto stesso; mi spiego in un altro punto del del listato la direttiva ButtonCaricoSarta.Background = <colore da me scelto> funziona tranquillamente ho perciò la cosa mi ha messo dei dubbi. Ho allora introdotto introdotto questo altro segmento di codice:
Codice: [Seleziona]
Public Sub ButtonCaricoSarta_LostFocus()

  If SwSart = False
    ButtonCaricoSarta.Background = &FF0000
  Else
    ButtonCaricoSarta.Background = &00FF00
  Endif

End
Ed ecco cosa succede: dopo aver eseguito altre operazioni su oggetti nella parte superiore della form (Data preceduta da del nella schermata allegata) terminando con un invio si attiva il pulsante Carico sarta con sfondo rosso, a quel punto SwSart è False cioè inattivo e il tutto è giusto, quindi clicco sul pulsante e spostando il mouse lo sfondo diventa verde, SwSart è True cioè attivo ed il tutto è di nuovo giusto, a questo punto torno a cliccare sul pulsante, ma spostando il mouse lo sfondo resta verde mentre SwSart è divenuto False e questo non va bene, ma basta che io dia un Tab che si scatena l'evento sopra riportato ed il tasto prende la colorazione giusta cioè rossa, ciò vuol dire che l'istruzione ButtonCaricoSarta.Background = &FF0000 nell'evento _LostFocus() ha funzionato mentre nell'evento _Click() non ha funzionato.

Che ne dite?

Ciao a tutti e grazie!
« Ultima modifica: 22 Agosto 2017, 21:31:27 da Franco_da_vc »
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #12 il: 22 Agosto 2017, 21:46:05 »
spostando il mouse lo sfondo diventa verde, SwSart è True cioè attivo
Scusami, quale riga di comando fa diventare True la variabile SwSart, all'atto dello spostamento del mouse sul tasto ?  :-X
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #13 il: 22 Agosto 2017, 22:00:03 »
Io mi sto perdendo, non capisco cosa vuoi dire.
Qualunque evento se scatenato è in grado di cambiare i colori di fondo.
Se vuoi che ti possa aiutare dovresti descrivere, l'algoritmo che stai inseguendo, nella maniera più semplificata possibile ma che possa consentirmi di capire.
Qualcosa tipo l'ipotesi che ho fatto io.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re:Come governare un bottone in evento Click
« Risposta #14 il: 23 Agosto 2017, 10:55:22 »
Grazie vuott per il tuo interessamento;
spostando il mouse lo sfondo diventa verde, SwSart è True cioè attivo
Scusami, quale riga di comando fa diventare True la variabile SwSart, all'atto dello spostamento del mouse sul tasto ?  :-X
La riga di comando che porta la variabile SwSart a true è contenuta in questo codice:
Codice: [Seleziona]
Public Sub ButtonCaricoSarta_Click()
'############################################################# Inserimento / disinserimento del flag CARICO SARTA #####

  If SwSart = False
    SwSart = True
    ButtonCaricoSarta.Background = &00FF00
  Else
    SwSart = False
    ButtonCaricoSarta.Background = &FF0000
  Endif

End
Il problema e che con questo evento (_click) il background non si modifica come ho sperimentato nel mio primo messaggio.
Questo altro brano di codice che ho evidenziato nel mio ultimo messaggio
Codice: [Seleziona]
Public Sub ButtonCaricoSarta_LostFocus()

  If SwSart = False
    ButtonCaricoSarta.Background = &FF0000
  Else
    ButtonCaricoSarta.Background = &00FF00
  Endif

End
non fa altro che, alla perdita del focus, andare a verificare il valore di SwSart ed accordare il background con lo stato della variabile, in questo evento il background si riesce a modificare e anche se tardivamente l'ameniccolo pare funzionare.
Bye by Afo