Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

cambio colore

6 views
Skip to first unread message

pincopallino

unread,
Jul 7, 2013, 4:03:32 AM7/7/13
to
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 ᅵ? :)

Il Razziatore

unread,
Jul 7, 2013, 11:23:48 AM7/7/13
to
Il 07/07/2013 10.03, pincopallino ha scritto:
> 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 è? :)

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?

pincopallino

unread,
Jul 7, 2013, 11:54:58 AM7/7/13
to
Il 07/07/2013 17.23, Il Razziatore ha scritto:

> a) Come disegni il quadrato?

fillrect(x1,y1,x2,y2)

> b) I colori sono randomici o sono prestabiliti?

sono 2 colori che decido io e quelli sono

> 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

pincopallino

unread,
Jul 8, 2013, 2:23:16 AM7/8/13
to
Il 07/07/2013 17.23, Il Razziatore ha scritto:

> 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.....

pincopallino

unread,
Jul 8, 2013, 2:57:36 AM7/8/13
to
credo di aver sistemato anche questo con un controllo sul tasto del mouse

Il Razziatore

unread,
Jul 8, 2013, 12:34:41 PM7/8/13
to
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.

pincopallino

unread,
Jul 8, 2013, 2:01:53 PM7/8/13
to
Il 08/07/2013 18.34, Il Razziatore ha scritto:

>
> 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.


interessante, grazie ma se non uso il repeat come faccio a far cambiare
i valori di getmousex e getmousey?

Il Razziatore

unread,
Jul 8, 2013, 6:46:27 PM7/8/13
to
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% ).

pincopallino

unread,
Jul 9, 2013, 11:31:02 AM7/9/13
to
grazie, ho del materiale su cui lavorare

0 new messages