Italian DoEvents..Non capisco...non capisco :D

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Sto impazzendo per capire come diamine funziona questo comando.
Allora, a me servirebbe che si svolgesse u'azione prima di eseguire la successiva:
Tipo:
Conto alla rovescia di 3 con tanto di campanello e, quando termina, partenza del timer del gioco vero e proprio.

...invece, il conto alla rovescia va, il campanello suona... ma parte pure il timer del gioco!!! :mad:

A parte che, come detto ad Erel, il .SetVolume(0.2,0.2) del MediaPlayer, sul mio telefono (Haier W910) non funziona... o meglio, si sente a tutto volume comunque cambi e, ogni tanto, si abbassa improvvisamente :eek:... ora ho anche problemi con i colori!!!
Cavolo!!! :mad:


B4X:
If txt.Length=numLettere+1 Then
                SV.SingleLineLayout.Label.TextColor=Colors.Yellow
                Rix.TextColor=Colors.Yellow
                Log("TROVATA x5" & txt)
                PntFrase=0
                Punteggio(txt,0,numLettere-1)
                PntFrase=PntFrase*5 'Mettere una grafica moltiplicatore
                Main.PuntiLiv(Main.fndPlayer)=Main.PuntiLiv(Main.fndPlayer)+PntFrase
                Log("Punti:" & PntFrase & " _ Totali Livello:" & Main.PuntiLiv(Main.fndPlayer))
                Punti=PntFrase
                Rix.Initialize("")
                Rix.Text=Risultato &  " (x5)"
                PuntiS.Text=Punti
                MettiDati.AddSingleLine(txt)
        
        Else If txt.Length>LenPrima AND txt.Length<numLettere+1 Then
                SV.SingleLineLayout.Label.TextColor=Colors.Green
                Rix.TextColor=Colors.Green
                Log("TROVATA x2" & txt)
                PntFrase=0
                Punteggio(txt,0,LenPrima-1)
                Punti=PntFrase
                Main.PuntiLiv(Main.fndPlayer)=Main.PuntiLiv(Main.fndPlayer)+PntFrase
                Log("Punti:" & PntFrase & " _ Totali Livello:" & Main.PuntiLiv(Main.fndPlayer))
                PntFrase=0
                Punteggio(txt,LenPrima,txt.Length-1)
                Punti=Punti+(PntFrase*2)
                Main.PuntiLiv(Main.fndPlayer)=Main.PuntiLiv(Main.fndPlayer)+(PntFrase*2)
                Log("Puntix2:" & PntFrase & " _ Totali Livello:" & Main.PuntiLiv(Main.fndPlayer))
                Rix.Initialize("")
                'Rix.TextSize = 12 * TextScale
                Rix.Text=Risultato & " " & PntFrase &"(x2)"
                PuntiS.TEXT=Punti
                MettiDati.AddSingleLine(txt)
        Else If txt.Length>0 AND txt.Length<=LenPrima Then
            SV.SingleLineLayout.Label.TextColor=Colors.White
            Rix.TextColor=Colors.White
            Log("TROVATA" & txt)
            PntFrase=0
            Punteggio(txt,0,txt.Length-1)
            Punti=PntFrase
            Main.PuntiLiv(Main.fndPlayer)=Main.PuntiLiv(Main.fndPlayer)+PntFrase
            Log("Punti:" & PntFrase & " _ Totali Livello:" & Main.PuntiLiv(Main.fndPlayer))
            Rix.Initialize("")
            Rix.Text=Risultato
            PuntiS.Text=Punti
            MettiDati.AddSingleLine(txt)
        Else If txt.Length=0 Then
            SV.SingleLineLayout.Label.TextColor=Colors.Red
            Rix.TextColor=Colors.Red
            'NON trovata e tolgo metà dei punti
            Log("NESSUNA PAROLA: " & Risultato)
            PntFrase=0
            Punteggio(Risultato,0,Risultato.Length-1)
            Punti=-(PntFrase/2)
            Main.PuntiLiv(Main.fndPlayer)=Main.PuntiLiv(Main.fndPlayer)-(PntFrase/2)
            Log("Punti Persi: -" & (PntFrase/2) & " _ Totali Livello:" & Main.PuntiLiv(Main.fndPlayer))
            Rix.Initialize("")
            Rix.Text=Risultato & " (X)"
            PuntiS.TEXT=Punti
            MettiDati.AddSingleLine(Risultato)
        End If
        If Main.NoSound=False and txt.length=0 Then
            suono2.Load(File.DirAssets,"CoinN.wav"):suono2.Play
        Else
           suono2.Load(File.DirAssets,"Coin.wav"):suono2.Play
        End If

    Rix.Text=Rix.Text & Rset(PuntiS.text, rigaWidth-Rix.text.Length)
    DoEvents
    SV.AddSingleLine(Rix.Text)
   DoEvents
    SV.SetSelection(SV.Size)


In pratica, ogni tanto (specialmente quado finisce la listview e scrolla) al completamente di una parola esistente, seppur ne inserisco una sbagliate, il colore diventa Giallo, Verde o Bianco... ma non Rosso. La cosa è Random...Ho provato a togliere lo scrolling automatico (SV.SetSelection(SV.Size), ma non cambia una cippa! Sempre colori a caso. Mò sbrocco :mad::D
Davvero, cavolo... ma come si può fermare un evento prima di far partire un'altro?

Risultato imbrattamento colori (codice sopra):

strano comportamento.png
 
Last edited:

udg

Expert
Licensed User
Longtime User
If Main.NoSound=FalseThen
suono2.Load(File.DirAssets,"CoinN.wav"):suono2.Play
Else
If Main.NoSound=FalseThen suono2.Load(File.DirAssets,"Coin.wav"):suono2.Play
EndIf

Questo mi lascia un po' perplesso. Se non è un errore di copiatura, allora non capisco come debba funzionare.
Sembra che dici di testare che NoSound sia falso (ed in tal caso hai il play di CoinN), ma se non lo è testi di nuovo ed inutilmente che sia sempre falso.

Mi sarei aspettato qualcosa tipo:
B4X:
If Main.NoSound=FalseThen
 suono2.Load(File.DirAssets,"CoinN.wav"):suono2.Play
Else
  suono2.Load(File.DirAssets,"Coin.wav"):suono2.Play
EndIf
 

LucaMs

Expert
Licensed User
Longtime User
hehehe certo che fai sempre certe domande!!!

(stavo scrivendo mentre è arrivata la risposta di udg: è una osservazione giusta, ma non influisce sullo "strano comportamento")

Nel codice che hai pubblicato non vedo timer.

C'è una serie di IF che impostano valori (tra l'altro in un'altra activity, la main, cosa che a me non piace, ma ok) e poi esegui un suono.

Questo poco codice non può creare i problemi di cui parli.

(le case di cura sono aperte in estate? :D)
 

udg

Expert
Licensed User
Longtime User
Ciao Luca,

vediamo chi dei due scrive per primo due righe per il countdown.. eh eh
Lo so che con questa invito la lepre a correre..

B4X:
Sub Process Globals
Dim Timer1 AsTimer
End Sub

Sub Globals
Dim t As Int
End Sub

Sub CountdownAndStart
t=3
lblCountDown.test=t
Timer1.Initialize("Timer1",1000)
Timer1.Enabled=True
End Sub

Sub Timer1_Tick
t=t-1
If t =0 Then
   Timer1.Enabled=False
   StartTheGame
else
   lblCountDown.test=t
end if
End Sub

ps: ho barato, ma oggi mi sento così :)
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
No il Timer c'è, è normale... non che posso scrivere TUTTO il codice :D

B4X:
Sub tempo_tick

SfondoScuro.BringToFront
CountDown.BringToFront
If txtCountDown<0 Then
        SfondoScuro.Visible=False
        tempo.Enabled=False
        CountDown.visible=False
        Return False
Else
        CountDown.Bitmap=LoadBitmap(File.DirAssets,txtCountDown & "i.png")
        If txtCountDown>0 AND Main.NoSound=False Then
        suono2.Load(File.DirAssets, "Campana.wav")
        suono2.Play
    Else If Main.NoSound=False Then
        suono2.Load(File.DirAssets, "Campana2.wav")
        suono2.Play
    End If
    txtCountDown=txtCountDown-1
End If

End Sub
I valori presenti nella Main, sono valori che riporto per tutte le Activity e ho deciso di fare in questo modo.(La Main è solo l'intro)
Prima del cocice sopra, vi è una SELECT ad un DB che restituisce il valore di txt.
Ho provato in Debug, ma fa normali giri, all'interno delle IF e, quindi, settai giusti colori SV...però, a video, appaiono sballati :eek::mad:...nn capisco, non capisco :D
Riguardo al Timer, partema il gioco viene caricato immediatamente. Il richiamo a questo avviene all'interno diuna SUB
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Fai bene Luca...ad una certa età bisogna pensare a riposarsi :D ...penso che dovrei trovarne una anche per me...ma la vedo dura per coloro che vi soggiornano se rompo come faccio qui :p:D
Però cacchio :mad: Debuggo e ridebuggo... passano sui valori propri e quando appare a video, il colore è diverso!!! Stò veramente a sbroccà!

Comunque, come diamine funziona questo DoEvents? Perché non aspetta che il processo sia terminato? Ma dove va ficcato?

...per fortuna che sta arrivando l'estate così vi lascio riposare e stacco per un mesetto anche io da sto PC :rolleyes:
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Allora! Se tolgo i DoEvents, anche se passp per prima i colori, lui mi mette nella listview il campo riempito ma i colori me li cambia solo alla prma linea :eek:
Proprio non capisco.
Ho solo capito che il DoEvents ha effetto se messo sotto a ciò che si vuol far eseguire. Quindi, nel mio caso:


B4X:
    Rix.Text=Rix.Text & Rset(PuntiS.text, rigaWidth-Rix.text.Length)   
    SV.AddSingleLine(Rix.Text)
        DoEvents
    SV.SetSelection(SV.Size)
Anche se, vedi il timer, non produce l'effetto voluto e, comunque, non capisco il motivo del cambio colore sulla ListView.
Eppure ho tolto il secondo timerr (quello dello scorrere del tempo) e assegnata unavariabile per i colori, mettendo una Select case con una Case Else finale (dove non entra proprio, e mi sta bene) ma senza alcun risultato. Entra, prende il colore, proseguo ma a video il colore è differente :eek::mad:

B4X:
    Select Case colore
        Case 0
            SV.SingleLineLayout.Label.TextColor=Colors.White
        Case 1
            SV.SingleLineLayout.Label.TextColor=Colors.Yellow
        Case 2
            SV.SingleLineLayout.Label.TextColor=Colors.Green
        Case 3
            SV.SingleLineLayout.Label.TextColor=Colors.Red
        Case Else
            SV.SingleLineLayout.Label.TextColor=Colors.Blue
    End Select
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
BASTA non ce la faccio più! :(
Aiutatemi a capire questo dilemma!
Dopo il DoEvents dell'inserimento, mi appare la parola ma con COLORE DIVERSO!!!!
Ecco passo passo il debug:

1mo.jpg
2do.jpg
3a.jpg

4a.jpg


Come si può vedere, non passa da nessuna altra parte... eppure, sull'immagine, il testo "rivelat", logicamente errato, me lo colora di BIANCO!!!!
Ma da dove diamine l'ha preso se è passato sul ROSSO (iImg2)?
PS: notate la frase precedente che era esatta (quindi verde) e invece l'ha messa in Rosso.
Pensavo che poteva dar problemi quel

B4X:
    SV.SetSelection(SV.Size)

che non sarebbe altro che l'autoscrolling della listview... ma, anche togliendolo, non cambia nulla. i colori sballano a random.
Sapete dirmi qual'è il problema? Ne sto uscendo matto!
Grazie
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ciao,

forse dico una sciocchezza, ma SV è una ListView (come penso) oppure una ScrollView(come sembra indicare il nome)?
Nel primo caso, modificare il SingleLineLayout dovrebbe comportare l'applicazione della nuova impostazione a tutte le righe di quel tipo. Ed inoltre, modificare una property di un elemento (es. il colore della label da inserire) non dovrebbe essere preso in considerazione proprio perchè le caratteristiche sono fissate a livello di lista e non di elemento.
Cosa diversa per le ScrollView e la CustomScrollView.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Allora. Questa è una ListView (la chiamata SV l'avevo data perché prima utilizzavo una ScrollView ma senza successo).
Ma sei sicuro?:confused: Allora perché mi viene colorata diversamente quando passo una singola riga?...forse ti sbagli con la AddTwoLines... in quel caso, credo, non si possono assegnare i colori diversi alle 2 (spero di non dire una stupudata :D).
Non credo sia la soluzione, perché, come hai potuto vedere, i colori inizialmente partono normalmente bene... poi, non so per quale dimine di modivo, impazziscono, senza che io ne dichiari alcuno (ora è capitato Bianco ma, se vedi, la parola prima era Rossa mentre doveva essere Verde e, se continuo, diventa Giallo, poi Verde, poi Rosso, poi Verde... insomma a casaccio :confused::confused::confused:)
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ti riporto quanto dice Erel in ListView Tutorial:
The ListView has three "models" which are stored under:
- SingleLineLayout
- TwoLinesLayout
- TwoLinesAndBitmap

Each of this model has an ItemHeight property, a Background property and one or more views properties. Again, if you change any of these properties it will affect all the items of this type.

Possibile che la sequenza di colori a casaccio corrisponda in effetti alla sequenza di cambiamenti di colore comandata dal codice e proposta con un ritardo tale da non essere sincronizzata al caso in esame e quindi apparire random?

Cosa succede se inserisci un comando tipo SV.invalidate per forzare la rigenerazione grafica della lista?
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Niente da fare. :(
Ho provato a ritohgliere l'autoscroll ma nulla!.
Inizia bene ma poi finisce a schifo! :confused:
Ho messo un Log subito dopo i colori e risultano quelli giusti ma a video no. Ora provo a metterne uno dopo.

:mad::mad::mad::mad::mad::mad::mad: Ache mettendo il Log dopo l'auoscrolling (visto che li mi appariva il testo nella lista), il colore su schermo era BIANCO ma il Log era -65536, ovvero ROSSO!! :mad::mad::mad::mad:
Stàò impazzendo. Ora scrivo in inglese e spero che Erel mi dia una mano.
Logicamente, se qualcuno ha sololuzioni, le posti qui.
Grazie.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ora rileggo tutto, tanti post non li ho ancora letti.

Cmq, caro amico max, ti avevo consigliato di dare un'occhiata alla documentazione delle listview.
capisco che è una rottura di scatoline, nemmeno a me va di farlo, ma dato che una listview è un oggetto leggermente complesso,
meglio farlo. Ottenere qualche suggerimento non basta, a volte.

Oh, questo lo dico anche a me! E' una tendenza che abbiamo tutti, soprattutto per la fretta ed il poco tempo.

Tra l'altro, io preferisco di gran lunga la CheckList alla semplice listview. Anche se nel tuo caso potrebbe non essere necessaria, tanto vale usarla subito, magari in futuro ti viene in mente di aggiungere qualcosa e con la CheckList fai prima e meglio.
 

LucaMs

Expert
Licensed User
Longtime User
Ehm... non è facile capirci qualcosa.

Per quanto riguarda le listview, Umberto ha ragione: le modifiche riguardano tutti gli Item (motivo in più per utilizzare la CheckList che, bada bene, può avere lo stesso aspetto della ListView, basta non mettere la CheckBox).

Poi c'è il problema timer: ora si scopre che ne hai due, che uno lo togli... è un po' un casino.

Hai pubblicato videate dell'Activity Gioco, ma è la Main che la lancia, giusto? Dici che il suono parte ma parte anche il gioco: significa che nel Main, come hai scritto, una sub lancia il gioco; bisogna vedere come e come interferiscono i timer, su questo, oltre ai Doevents ed al Sound.

Insomma, a meno di non stare qui ore ed ore, senza vedere tutto il codice, è difficile aiutarti.

Però ci riprovo, rileggo ;)
 

LucaMs

Expert
Licensed User
Longtime User
Mah.

Spiegaci meglio cosa dovrebbe fare l'app.

Iniziare un countdown al contrario, di 3 secondi, per poi far partire un altro timer che da al giocatore il tempo per creare le parole?

Se fosse così, il timer del countdown dovrebbe trovarsi nel Main (e anche il "campanello" !), mentre quello del tempo giocatore nella Gioco.

Ma dobbiamo fare solo supposizioni, senza poter leggere tutto il codice, anche quello della Main!
 

LucaMs

Expert
Licensed User
Longtime User
Dato che non si dorme, con tutta la lucidità che posso avere in questo momento, rileggo e commento un po'.

1) fai bene a mettere commenti come "Mettere una grafica moltiplicatore", alcune cose si fanno con comodo in altri momenti; però ti consiglio di fare come fanno tutti, cioè scrivere "TODO Mettere una grafica moltiplicatore", cioè to do, da fare, perché così non devi scorrere tutto il codice (di tutti i moduli) per vedere se hai dimenticato qualcosa: semplicemente cerchi TODO in ogni modulo;

1a) metterei un'animazione con zoom (scale) di una immagine "5x" ;) con suono;

2) Rix.Initialize(""). E' (sarà) il testo da aggiungere alla ListView; intanto, perché non usare una normale variabile stringa? Poi, non è necessario reinizializzarla in tutti i gruppi di valutazione del punteggio, basta farlo prima del primo If (If txt.Length=numLettere+1Then);

Va beh, non vado avanti, spero mi stia venendo sonno.

I problemi comunque sono due, no? Il colore dei testi ed il timer (oltre al volume audio ma di quello so un bel tubotto!).

Se usi le listview, il colore di un layout (che sia single, twolines o con bitmap) vale per tutte le "righe", come ti ha giustamente detto Umberto.
Per cui, anche se è una rottura, lo so, butta sta listview e usa la CheckList.

Sto riguardando come la uso.

A) Uso una mia funzione CreateItem(vari parametri) che restituisce un Panel.
Come parametri puoi passare i vari valori da visualizzare in ogni "riga" (item) e volendo, anche i colori da dare (ma li puoi anche mettere direttamente all'interno della routine); nella routine crei un Panel, che sarà quello restituito dalla funzione; ci metti due label, una per le Parole e una per i Punti, così non devi nemmeno impazzire con RSet: usi un gravity diverso per ognuna delle due label;

B) uso la AddCustomItem della CheckList, cioè aggiungo la "riga".
Gli passo tre parametri: un ID (di qualunque tipo), il Panel che ricevo da CreateItem e l'altezza del Panel (questa devo guardarla, perché a che serve? Potrebbe rilevarla, no?).

E' lunga da spiegare, facilissima da implementare.


Per i timer, come detto, dovresti metterli nelle due activity, ma, appunto, non mi ripeto.
 

LucaMs

Expert
Licensed User
Longtime User
Ho fatto una provetta.

1) non guardare l'immagine del 5x se non hai ancora mangiato
2) il suono è basso: si può utilizzare qualche sw per aumentarlo nel file stesso
3) mancano i timer: qui, se mi dici cosa deve fare o fai delle modifiche tu e poi lo ripubblichi...!

Intanto ti può essere utile per vedere come usare la CheckList
 

Attachments

  • lm 5x.zip
    86 KB · Views: 232

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Mamma mia quanto hai scritto :eek::D
Ti ringrazio per l'interessamento e per l'aiuto che cerchi di dare. ;)
Bella l'idea del 5X, sicuramete la utilizzerò.
Vedendo il tuo listato e provandolo, non si vedono i Punteggi. Appare solamente uno sfondo blue con le lettere coloate bianco e giallo ma non vi sono punteggi.
Poi, non c'è lo scrolling e la trasparenza.
Purtroppo, come hai visto dalle immagini, le parole dovrebbero andare all'interno di quel riguadro.
Riguardo il fatto dei timer e dell'Activity... ho 4 main per ora, ogniuna che fa il suo compito. Posto, in anteprima :D, le immgini del gioco:

Questa è l'Activity la Main
1.jpg

Poi seguono altre Main Activity
2.jpg


3.jpg


Questa è la Main Activity Gioco dove vi sono il Timer del conto alla rovescia e quello del passare del tempo di gioco.
4.jpg


Non ho capito una cosa ancora. Perché dite che non è possibile mettere più colori alla listview? Eppure, come vedi, i colori ci sono. sono ttte AddSingleLine... posso capire che non è possibile mettere due diversi colori in una doublelines...ma se, ripeto, io passo i colori e li prende, se non era possibile fare, non avrebbe messo TUTTO di uno stesso colore?
 
Last edited:
Top