none
Come rendo disponibile ad un form il valore di uno user control RRS feed

  • Domanda

  • Non riesco a capire come rendere disponibili alcuni valori di uno user control.

    Lo scopo è quello di far uscire le coordinate del mouse nella variabile XcurroPos e Ycurrpos.

    Nel progetto in cui uso lo user control vedo queste due voci ma il contenuto è sempre zero.

    Nello user control ho messo due label che mostrano questi valori e li funzionano ma il valore nelle variabili no.

    Se nel progetto dove, uso lo user control, metto:Panel1.xcurrpos o ycurrpos mi da sempre zero

    Se invece nella form aggiungo un timer e li metto:

    label1.text = panel1.Xcurrpos
    label2.text = panel1.Ycurropos
     

    vedo i valori corretti.

    Ma io vorrei che lo user control sia indipendente e mi dia i valori senza aggiungere altro.

    questo sarebbe il codice

    Imports System.ComponentModel Public Class Panel Inherits UserControl Private Xmin As Double Private Ymin As Double Private Info As Boolean Public XcurrPos As Double Public YcurrPos As Double Private test As Integer = 1 Public Sub New() ' This call is required by the designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. Me.Height = 300 Me.Width = 300 Me.BackColor = Color.DarkGray TB_X.Text = 16 TB_Y.Text = 16 End Sub <EditorBrowsable(EditorBrowsableState.Always)> _ <Browsable(True)> _ <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ <Bindable(True)> _ <Category("ZMyProps")> _ Private Property showInfo As Boolean Get Return Info End Get Set(value As Boolean) Info = value CK_Info.Checked = value End Set End Property Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick If e.Button = Windows.Forms.MouseButtons.Right Then CK_Info.Visible = True TB_X.Visible = True TB_Y.Visible = True Else CK_Info.Visible = False TB_X.Visible = False TB_Y.Visible = False End If End Sub Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove Dim larghezza As Double = Xmin * 2 Dim altezza As Double = Ymin * 2 Dim deltaX As Double Dim deltaY As Double Dim point As Point = PictureBox1.PointToClient(Cursor.Position) deltaX = (larghezza / CDbl(PictureBox1.Width)) deltaY = (altezza / CDbl(PictureBox1.Height)) If showInfo = True Then Label1.Visible = True Else Label1.Visible = False End If Label1.Text = "Mousepoint: " & point.X & "," & point.Y & vbCrLf & "Mousepointdelta: " & Math.Round((point.X * deltaX), 0) & "," & Math.Round((point.Y * deltaY), 0) & vbCrLf & "XPos: " & Math.Round((point.X * deltaX), 3) - Xmin & vbCrLf & "YPos: " & -Math.Round((point.Y * deltaY), 3) + Ymin & vbCrLf & "Panel: " & PictureBox1.Width & "," & PictureBox1.Height XcurrPos = Math.Round((point.X * deltaX), 3) - Xmin YcurrPos = -Math.Round((point.Y * deltaY), 3) + Ymin End Sub <EditorBrowsable(EditorBrowsableState.Always)> _ <Browsable(True)> _ <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ <Bindable(True)> _ <Category("ZMyProps")> _

    Public Property XPos As Double Get Return Me.XcurrPos End Get Set(ByVal value As Double) XcurrPos = value End Set End Property <EditorBrowsable(EditorBrowsableState.Always)> _ <Browsable(True)> _ <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ <Bindable(True)> _ <Category("ZMyProps")> _ Public Property YPos As Double Get Return Me.YcurrPos End Get Set(value As Double) YcurrPos = value Update() End Set End Property Private Sub CK_Info_CheckedChanged(sender As Object, e As EventArgs) Handles CK_Info.CheckedChanged If CK_Info.Checked = False Then Info = False Else Info = True End If End Sub Private Sub TB_X_TextChanged(sender As Object, e As EventArgs) Handles TB_X.TextChanged Xmin = CDbl(TB_X.Text) End Sub Private Sub TB_Y_TextChanged(sender As Object, e As EventArgs) Handles TB_Y.TextChanged Ymin = CDbl(TB_Y.Text) End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick test = test + 1 Label4.Text = test Label2.Text = (XcurrPos) Label3.Text = (YcurrPos) End Sub End Class

    Grazie per l'aiuto, Alberto

    sabato 13 settembre 2014 10:43

Risposte

  • Ciao.

    Penso di aver capito dove sbagli.

    Tu devi passare al Form due valori numerici ricavati nello UC a partire dalle coordinate X e Y del mouse.

    Quindi l'evento MyMouseMouse deve essere del tipo:

    Public Event MyMouseMove(x As Integer, y As Integer)

    Nello UC, nell'evento MouseMove del PictureBox, scriverai

    Modifica: CODICE ERRATO, VEDI POST SUCCESSIVO

    Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
       Label1.Text = e.X.ToString
       Label2.Text = e.Y.ToString()
       RaiseEvent MyMouseMove(e.X, e.Y)
    End Sub

    Nel Form, invece, nell'evento MyMouseMove, scriverai:

        Private Sub UserControl_MyMouseMove(x As Integer, y As Integer) Handles UserControl.MyMouseMove
            Label1.Text = x.ToString
            Label2.Text = y.ToString()
        End Sub



    vibi6


    • Modificato vibi6 sabato 13 settembre 2014 15:57 segnlazione codice da sostituire
    • Proposto come risposta Renato Marzaro []Moderator domenica 14 settembre 2014 04:09
    • Contrassegnato come risposta magico alverman domenica 14 settembre 2014 07:12
    • Contrassegno come risposta annullato magico alverman domenica 14 settembre 2014 07:13
    • Contrassegnato come risposta magico alverman domenica 14 settembre 2014 07:13
    sabato 13 settembre 2014 15:45

Tutte le risposte

  • Ciao magico alverman.

    Devi creare all'interno del tuo User Control un nuovo evento da scatenare quando vuoi sempre nello User Control e da utilizzare all'interno della Form del progetto che utilizza quel User Control.

    Ti faccio un esempio.

    Tu hai un User Control con dentro un controllo Panel e così strutturato:

    Public Class UserControl1
        Public Event MyMouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs)
    
        Private Sub Panel1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
            RaiseEvent MyMouseMove(sender, e)
        End Sub
    End Class

    Poi hai un progetto nel quale hai:

     - l'User Control precedente

     - Due controlli Label

    Il codice di questo progetto è:

    Public Class Form1
        Private Sub uc_MyMouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles uc.MyMouseMove
            Label1.Text = e.X
            Label2.Text = e.Y
        End Sub
    End Class

    Se avvi il Form e muovi il mouse sullo User Control vedrai nella label poste sul Form i valori di X e Y.


    vibi6


    • Modificato vibi6 sabato 13 settembre 2014 11:57 Eliminato codice non necessario
    sabato 13 settembre 2014 11:51
  • Grazie vibi6.

    Quello che mi hai consigliato di fare funziona solo che non è quello che intendevo io.

    Praticamente il mio controllo calcola la posizione del mouse, posizionato su una picturebox e fa alcune operazioni.

    Nel controllo ho messo due label, per testare il risultato. Nella form quindi vedo il controllo con le due label e quando eseguo il form vedo le coordinate modificarsi non appena mi sposto sul controllo.

    Dal momento che Xcurrpos e Ycurrpos del controllo sono pubbliche, le vedo nel progetto che usa il controllo.

    Ma se nel controllo i valori vengono assegnati e li vedo nelle label nel progetto non mi passano.

    Sono così incasinato che forse non riesco neppure a spiegarmi :)

    Grazie, Alberto

    sabato 13 settembre 2014 12:30
  • Ma cosa vuoi dire con "non mi passano". Ti riferisci a qualche evento o a cosa.

    Cosa fai nel Form per assegnare i valori alle label?

    Puoi fare un esempio semplice con il quale si possa replicare quanto si verifica  a te?


    vibi6

    sabato 13 settembre 2014 13:38
  • Allora inserisco le due immagini del controllo posto in un form.

    Clicco con il mouse sul controllo e vedo i valori cambiare nelle due label del controllo

    Le due label esterne al controllo sono sul form sotto l'evento mousemove del controllo e non vengono aggiornate.

    Private Sub XyPanel1_MouseMove(sender As Object, e As MouseEventArgs) Handles XyPanel1.MouseMove
            Label1.Text = XyPanel1.XcurrPos
            Label2.Text = XyPanel1.YcurrPos
    End Sub

    La seconda immagine del controllo aggiorna i valori delle due label del form perchè ho aggiunto un timer che aggiorna le label

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Label1.Text = XyPanel1.XcurrPos
            Label2.Text = XyPanel1.YcurrPos
        End Sub

    Nel controllo nell'evento mouseMove del PicturesBox ho questo:

    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    
            Dim larghezza As Double = Xmin * 2
            Dim altezza As Double = Ymin * 2
    
            Dim deltaX As Double
            Dim deltaY As Double
    
            Dim point As Point = PictureBox1.PointToClient(Cursor.Position)
    
            deltaX = (larghezza / CDbl(PictureBox1.Width))
            deltaY = (altezza / CDbl(PictureBox1.Height))
    
            If chkInfo.Checked = True Then
                Label1.Visible = True
            Else
                Label1.Visible = False
            End If
    
            If chkOver.Checked = True Then
            Else
                If chkOver.Checked = False And e.Button = Windows.Forms.MouseButtons.Left Then
                Else
                    Exit Sub
                End If
            End If
    
            Label1.Text = "Mousepoint: " & point.X & "," & point.Y & vbCrLf &
                        "Mousepointdelta: " & Math.Round((point.X * deltaX), 0) & "," & Math.Round((point.Y * deltaY), 0) & vbCrLf &
                        "XcurrPos: " & Math.Round((point.X * deltaX), 3) - Xmin & vbCrLf &
                        "YcurrPos: " & -Math.Round((point.Y * deltaY), 3) + Ymin & vbCrLf &
                        "Panel: " & PictureBox1.Width & "," & PictureBox1.Height
    
            XcurrPos = Math.Round((point.X * deltaX), 3) - Xmin
            YcurrPos = -Math.Round((point.Y * deltaY), 3) + Ymin
            RaiseEvent MyMouseMove(sender, e)
    
        End Sub

    Le due variabili XcurrPos e YcurrPos del controllo sono pubbliche e le vedo nelle proprietà del controllo sulla form ma per farmi passare il valore devo per forza usare il timer.

    Spero che sia un poco più chiara la cosa :D

    Grazie, Alberto

    sabato 13 settembre 2014 14:43
  • Ciao.

    Penso di aver capito dove sbagli.

    Tu devi passare al Form due valori numerici ricavati nello UC a partire dalle coordinate X e Y del mouse.

    Quindi l'evento MyMouseMouse deve essere del tipo:

    Public Event MyMouseMove(x As Integer, y As Integer)

    Nello UC, nell'evento MouseMove del PictureBox, scriverai

    Modifica: CODICE ERRATO, VEDI POST SUCCESSIVO

    Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
       Label1.Text = e.X.ToString
       Label2.Text = e.Y.ToString()
       RaiseEvent MyMouseMove(e.X, e.Y)
    End Sub

    Nel Form, invece, nell'evento MyMouseMove, scriverai:

        Private Sub UserControl_MyMouseMove(x As Integer, y As Integer) Handles UserControl.MyMouseMove
            Label1.Text = x.ToString
            Label2.Text = y.ToString()
        End Sub



    vibi6


    • Modificato vibi6 sabato 13 settembre 2014 15:57 segnlazione codice da sostituire
    • Proposto come risposta Renato Marzaro []Moderator domenica 14 settembre 2014 04:09
    • Contrassegnato come risposta magico alverman domenica 14 settembre 2014 07:12
    • Contrassegno come risposta annullato magico alverman domenica 14 settembre 2014 07:13
    • Contrassegnato come risposta magico alverman domenica 14 settembre 2014 07:13
    sabato 13 settembre 2014 15:45
  • Scusa magico, abbi pazienza. Ho incollato un pezzo di codice errato.

    Alll'evento MouseMove del PictureBox nello UC scriverai:

        Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            XcurrPos = e.X + 20
            YcurrPos = e.X + 65
    
            Label1.Text = XcurrPos
            Label2.Text = YcurrPos
            RaiseEvent MyMouseMove(XcurrPos, YcurrPos)
        End Sub
    dove ho simulato i tuoi calcoli e che sostituirai con i tuoi nel ricavare le variabli XcurrPos e YcurrPos


    vibi6

    sabato 13 settembre 2014 15:54
  • ..... due parole:

    UN GRANDE !!

    Grazie mille vibi6 :D

    sabato 13 settembre 2014 15:57
  • magico...a buon rendere....! :)

    Ma toglimi una curiosità...quel nick per la serie TV della gloriosa RAI TV di un tempo?


    vibi6

    sabato 13 settembre 2014 16:02
  • Per finire aggiungo (ma a questo punto penso che lo avrai già fatto) che le variabili XcurrPos e YcurrPos non conviene che tu le dichiari Pubblic ma basta dichiararle all'interno dell'evento MouseMove del PictureBox.

    Ciao.


    vibi6

    sabato 13 settembre 2014 16:29
  • Per finire aggiungo (ma a questo punto penso che lo avrai già fatto) che le variabili XcurrPos e YcurrPos non conviene che tu le dichiari Pubblic ma basta dichiararle all'interno dell'evento MouseMove del PictureBox.

    Ciao.


    vibi6

    si le avevo tolte

    Si mi riferisco proprio a quella serie TV :D

    Ho visto solo ora il codice che hai aggiunto ma non riesco a capire quei valori +20 e + 65.

    Il codice precedente funziona alla grande

    Ciao, e ancora grazie

    sabato 13 settembre 2014 17:17
  • Ho visto solo ora il codice che hai aggiunto ma non riesco a capire quei valori +20 e + 65.

    Era solo un esempio di calcolo per le tue variabili. L'ho pure scritto alla fine del post.

    Ovviamente tu scriverai le tue formule esatte:

    XcurrPos = Math.Round((point.X * deltaX), 3) - Xmin

    YcurrPos = -Math.Round((point.Y * deltaY), 3) + Ymin


    vibi6

    sabato 13 settembre 2014 17:27
  • Yeess !!

    Grazie ancora vibi6 !!

    sabato 13 settembre 2014 23:03
  • Yeess !!

    Grazie ancora vibi6 !!

    Ciao magico alverman,

    visto che vibi6 ti ha risolto il problema ricordati di utilizzare la funzione 'Segna come Risposta' per la/le risposte che ti sono state utili così da aiutare a identificare la soluzione anche ai prossimi visitatori di questo thread.

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    • Contrassegnato come risposta magico alverman domenica 14 settembre 2014 07:12
    • Contrassegno come risposta annullato magico alverman domenica 14 settembre 2014 07:12
    domenica 14 settembre 2014 04:09
    Moderatore