Newsgroup: it.comp.lang.pascal
Titolo: cambio colore

ho un quadrato giallo su sfondo bianco e cliccandoci sopra lo voglio far 
diventare rosso e ricliccandoci di nuovo giallo e cosï¿œ via fino a che 
decido di chiudere la finestra.
avevo pensato ad un ciclo repeat del tipo
repeat
se ï¿œ giallo e ci clicco disegnalo rosso
se ï¿œ rosso e ci clicco disegnalo giallo
until chiedo di chiudere la finestra
purtroppo l'effetto visivo ï¿œ orrendo con colori che si rincorrono quindi 
c'ï¿œ sicuramente un errore. mi dite qual ï¿œ? :)

 c'è sicuramente un errore. mi dite qual è? :)
 
No ci devi arrivare da solo!
 
Scherzo. Dunque raggioniamo.
 
a) Come disegni il quadrato?
b) I colori sono randomici o sono prestabiliti?
c) Cosa usi?

 c) Cosa usi?
 
sto usando free pascal, per la grafica uso l'unità wingraph 
http://math.ubbcluj.ro/~sberinde/wingraph/
 
 
mi piacerebbe molto capire dove concettualmente sbaglio nel mio repeat
grazie per il tuo aiuto
 

 No ci devi arrivare da solo!
 
allora, con delay ho risolto il problema dei colori che si sovrappongono 
ma se il muose è premuto i colori cambiano fino a che non rilascio il 
tasto. adesso ci penso.....


credo di aver sistemato anche questo con un controllo sul tasto del mouse


secondo me è proprio il "reapeat" il problema. Se ho capito bene quello 
che vuoi:
 
- Quadrato giallo
- click
- Quadrato colore1
- click
- Quadrato colore2
- click
- Quadrato colore1
- ecc
 
se è così non serve un repeat anzi il problema è proprio li.
Devi gestire la cosa per eventi ( quando il mouse viene premuto succede 
qualcosa ) con il repeat lui continuerà a ridisegnare il quadrato senza 
farti vedere niente.
 
Io fare qualcosa tipo
 
procedure OnMouseClick( ... );
begin
	I := ( I + 1 ) MOD 2;
	SetBkColor( Colore[ I ] );
	Fillrect(...);
end;
 
dove sia I che Colore sono varibili globali. In particolare Colore è un 
array con i tuoi colori ( ovviamente puoi aumentare la dimensione 
dell'array per contenere quanti colori vuoi.

 dell'array per contenere quanti colori vuoi.
 
 
interessante, grazie ma se non uso il repeat come faccio a far cambiare 
i valori di getmousex e getmousey?


Ovvio che da qualche parte un repeat ci deve stare. Di solito un 
programma ad eventi è fatto con una strottura di questo tipo:
 
init
run
done
 
dove in init ci sono tutte le inizializzazioni, in run c'è il main loop, 
e in done ci sono le "distruzioni".
 
 
nel mail loop beh è un po' complesso comunque di solito c'è qualcosa che 
genera eventi e poi un qualcosa che li analizza. Nel tuo caso ( visto 
che hai solo il mouse ) hai getmousex/y quindi ( invento )
 
repeat
	Event := getMouseEvent( );
	if Event = Event.Click then OnMouseClick( Event );
until fine
 
Notare che l'evento OnMouseClick si verifica solo una volta per "click" 
indipendentemente da quanto tieni premuto il tasto: puoi decidere tu se 
farlo succedere quando il tasto viene premuto o rilasicato. Di solito ( 
ad esempio per i bottoni ) si definisce il "click" una sequenza 
MouseDown/MouseUp sullo stesso elemento. Il doppio Click è la stessa 
cosa in un certo tempo ( mezzo secondo? ).
 
Per quanto riguarda gli analizzatori di eventi ( in questo caso 
getMouseEvent ) non c'è una regola che dica che siano o meno bloccanti. 
Ma di norma lo sono. E lasciano il posto agli altri task ( così la CPU 
non arriva al 100% ).


grazie, ho del materiale su cui lavorare