PDA

View Full Version : [VB.NET] Evento da codice ( RaiseEvent? )


ZJack
28-08-2009, 20:14
Salve a tutti, vorrei sapere come fare in Visual Basic per "attivare" un evento da codice. Come quando si va sul form, eventi, e si fa doppio click sull'evento DragDrop ad esempio...
Posso farlo in questo modo manualmente certo, ma su 12 picturebox con 2 eventi ciascuna, se poi devo modificare qualcosa non vorrei rifare tutto :(
Provando ad attivare l'evento manualmente non riesco e mi chiede di usare "RaiseEvent".
Sono andato nella documentazione, e ho provato un po' a lavorarci su, ma non è uscito niente di concreto :stordita:
Sapete dirmi come fare per attivarli da codice ? :D

Grazie in anticipo :)

MarcoGG
29-08-2009, 09:54
Posso farlo in questo modo manualmente certo, ma su 12 picturebox con 2 eventi ciascuna, se poi devo modificare qualcosa non vorrei rifare tutto :(
Provando ad attivare l'evento manualmente non riesco e mi chiede di usare "RaiseEvent".


Da quanto ho capito il tuo problema è che non vuoi, avendo una Form con N controlli dello stesso tipo, dover riscrivere N volte gli handler per ogni singolo evento...
RaiseEvent c'entra poco o nulla con questo, nel senso che il suo uso tipico è appunto quello di scatenare un evento "personalizzato" dichiarato in una propria classe...

Puoi fare molto di più con AddHandler . L'esempio classico della pulsantiera : ho una Form con 100 pulsanti ( classe Button ). Come gestire il Click su TUTTI i pulsanti con 4 righe di codice ?

Public Class Form1

Private Sub AlClickSuiPulsanti(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim B As Button = CType(sender, Button)
MsgBox("Hai fatto Click su " & B.Name)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For Each B As Button In Me.Controls
AddHandler B.Click, AddressOf AlClickSuiPulsanti
Next

End Sub

End Class

;)

ZJack
29-08-2009, 14:40
prima di tutto grazie per la risposta :)
rileggendo un po' quello che ho scritto forse non sono stato molto chiaro :stordita: ...
In pratica devo gestire il dragDrop sulle picturebox, clicco su una picturebox e trascino il "contenuto" su una picturebox vuota che la userà come immagine. (6 picturebox con immagini e 6 vuote)
Dovrei attivare l'evento "mousedown" e "mousemove" per le picturebox con l'immagine da trascinare, e attivare "dragdrop" e "dragenter" su quelle vuote che 'riceveranno' l'immagine. Invece che andare nel 'Design' del form, cliccare su 'eventi' e fare doppio click su "mousedown", "mousemove" ecc.. volevo farlo da codice. Come dire "picturebox1.dragdrop.enabled=true" e "picturebox1.dragenter.enabled=true" tanto per fare un esempio inesistente :D

Ho provato comunque a modificare il codice che hai postato ma così avrei altri problemi che non so come risolvere... :wtf: ( del tipo che mi considera anche tutte le picturebox dell'altro form che metto invisibile, e da un'eccezione :( )

il codice che ho provato a mettere è questo
private sub baidragdrop(ByVal sender As System.Object, ByVal e As DragEventArgs)

Dim A As PictureBox = CType(sender,PictureBox)
A.Image = e.Data.GetData(DataFormats.Bitmap)

end sub

private sub baidragenter(ByVal sender As System.Object, ByVal e As DragEventArgs)

Dim B As PictureBox = CType(sender,PictureBox)

If e.Data.GetDataPresent(DataFormats.Bitmap) Then
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If

end sub


For Each A As PictureBox In Me.Controls
AddHandler A.DragDrop, AddressOf baidragdrop
Next

For Each B As PictureBox In Me.Controls
AddHandler B.DragEnter, AddressOf baidragenter
Next

MarcoGG
29-08-2009, 16:07
Semplicemente andrai a condizionare il comportamento degli handler a seconda del "tipo" di picturebox. Come ? Ad esempio impostando in modo opportuno la proprietà "Tag" ( che praticamente tutti i Controls hanno ), e interrogandola via codice, in modo tale che solo sulle box di tipo "drag" sarà possibile prendere le immagini, mentre sarà possibile incollarle solo sulle box di tipo "drop". Su tutte le altre box eventualmente presenti ( Tag = "" ) il drag/drop non sarà disponibile... ;)

ZJack
30-08-2009, 15:28
ti ringrazio per la pazienza, ho provato a fare dei tentativi ma dava sempre quell'errore. Così preso da un attacco di "felicità" ho attivato tutti gli eventi dal 'Design' .
Ora però ho un altro problema :stordita: ... se puoi rispondermi bene, altrimenti aprirò un altro topic. Mi serve sapere il nome dell'immagine in una pictureBox, tipo un "picturebox1.image.getPath()" solo che mi pare di aver letto che non si può fare niente di simile :(

---------------
Ok, mentre stavo scrivendo m'è venuta l'illuminazione :D
devo confrontare l'immagine di due picturebox per verificare che siano uguali, poco fa ho scoperto per sbaglio il .getHashCode e ho cercato cos'era. Dopo di che mi è uscito questo: If (picturebox7.image.gethashcode = picturebox1.image.GetHashCode) Then
msgbox ("e")
Else [...]
e funziona :) ( ho capito il perchè, non vado a caso :p )

grazie ancora :)