[Vb.net] probleem met event dat een nieuw event genereert

Pagina: 1
Acties:

  • Emmeau
  • Registratie: Mei 2003
  • Niet online

Emmeau

All your UNIX are belong to us

Topicstarter
Ik ben op dit moment bezig om een klein programmaatje te schrijven voor iemand in vb.net

Kort samengevat komt het er op neer dat er een kleurenpalet van 256 kleuren getoond wordt (palet), welke 'gedragged' kunnen worden naar een group van 16 labels. Deze 16 kleuren/labels kleuren vervolgens een plaatje.

globaal idee hoe het form eruit ziet (' <tekst> = beschrijving):
code:
1
2
3
4
[256 kleuren palet]       ' 256 gekleurde labels    
[c0] [c1] [c2]  .. [c15]  ' de 16 kleuren welke in het plaatje gebruikt worden
[t0] [t1] t2]  .. [t15]   '  t0 - t15 zijn text labels welke de index van de gekozen kleur uit het palet van 256 aangeeft.
[img]                     ' het plaatje
c0 - c15 tonen de kleuren die door de gebruiker geselecteerd zijn

de 256 kleuren in het palet zijn labels, die allemaal hun eigen kleur hebben. Deze 256 labels worden dynamisch aangemaakt (omdat .net geen control arrays ondersteund) en met addhandler worden de mouseclick en mousemove events op de labels gezet.

Als dragdrop voorbeeld gebruik ik voorbeeld code zoals op de microsoft site.

Even kort schematisch wat er gebeurd:

1) user dragged een kleur uit het 256 kleuren palet en dropped dit op een van de 16 labels c0..c15
2) dragdrop event zet de backcolor voor label waarop gedropped is
3) het label waarop gedropped is, genereert een BackColorChanged event.
4) in de c[n].BackColorChanged event code, zet ik het textlabel op de juiste waarde.

Nu het probleem:
Als ik, voordat ik het label in de c[n].BackColorChanged event code zet, eerst wat andere zaken doe, wordt er halverwege deze procedure eruit gesprongen omdat een label uit het 256 kleurenpalet kennelijk weer een 'mousemove' event gekregen heeft.

Als de BackColorChanged() er als volgt uit ziet:
Visual Basic:
1
2
3
4
5
6
7
Private Sub Label_BackColorChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    
        for i = 0 to 255
                <doe iets ingewikkelds>
            next
            <zet Tx behorende bij sender op de juiste waarde>
End Sub
wordt het <zet Tx> statement niet meer uitgevoerd

Wat ik dus zoek is een manier om de applicatie te laten wachten tot alle events afgerond zijn.

Een 2e zijdelingse vraag, is het draggen in vb.net echt zo beroerd geimplementeerd dat je met een globale variable moet controleren of de gebruiker aan het draggen is?

Wat heb ik al gedaan:
Microsoft site doorgespit
Google gebruikt, gezocht op "block events", "hold events", "wait for events to finish", "cascaded events" etc
Op Got gezocht op ["Vb.net" events]

Samengevat:
event1 genereert event2, terwijl event2 code wordt uitgevoerd, komt er een nieuwe event1 binnen welke ervoor zorgt dat event2 code niet verder uitgevoerd wordt.
Hoef geen uitgebreide code, als iemand mijn neus de juiste richting op kan zetten, kom ik er verder wel uit.

If you choose to criticise you choose your enemies


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

wat jij beschrijft kan niet. een event stopt niet "zomaar" omdat er een andere event binnenkomt.

events gebeuren zo:
er bestaat een message queue. zowel windows als je programma kennen die message queue.

windows handelt muis, toetsenbord etc af en steekt events in die message queue.

jouw programma kijkt telkens of er een message in die queue zit.
als het zo is, haalt die de event eruit en in .NET wordt dan de juiste event handler opgeroepen en uitgevoerd.
wanneer dat gedaan is gaat je programma opnieuw kijken of er nog events zijn etc etc

dus "zomaar stoppen" kan niet.
debug even je code, doe even een lelijke try-catch blok rond het geheel en zie wat het oplevert.

ASSUME makes an ASS out of U and ME