Autor Tema: vb.Net personalizar Control Personalizado XD  (Leído 32623 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #30 : julio 26, 2008, 11:27:27 am »
orale.... aquí explico con un código lo que quiero lograr....

imaginate una clase como la siguiente:

Citar
Public Class TypeCajaTexto
        Enum PosiblesTipos As Integer
            False
            SoloNumeros
            ConDecimales
        End Enum

        Private tipos_ As PosiblesTipos
        Private Decimales_ As Integer

        Property Decimales() As Integer
            Get
                Return Decimales_
            End Get
            Set(ByVal value As Integer)
                Decimales_ = value
            End Set
        End Property

        Property SolamenteNumeros() As PosiblesTipos
            Get
                Return tipos_
            End Get
            Set(ByVal value As PosiblesTipos)
                tipos_ = value
            End Set
        End Property
End Class

ahora bien... la clase tiene dos propiedades SolamenteNumeros y Decimales, lo que quiero es hacer que mientras la propiedad SolamenteNumeros sea False, la propiedad Decimales sea de solo lectura.... o que no se vea en la paleta de Propiedades[atributo Browsable=False]

ya en cuasicódigo, quedaría algo así:
Citar
        Property SolamenteNumeros() As PosiblesTipos
            Get
                Return tipos_
            End Get
            Set(ByVal value As PosiblesTipos)
                tipos_ = value
                If value = PosiblesTipos.ConDecimales then
                     Decimales.Attributes([ReadOnly]) = False
                Else
                     Decimales.Attributes([ReadOnly]) = True
                End If
            End Set
        End Property
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #31 : julio 26, 2008, 11:49:13 am »
mmm, hoy si ya te entendi lo que vs queres hacer jejejeje!  :-/  :-/

Vaia mira, HASTA DOND YO C, no c puede hacer lo que intentas hacer, ¿sabes por que?
Vaia creo q eso que vs intentas en ningun control de VS que se comporte de esa manera, que al deshabilitar una onda, deshabilites algo o que ya no te apareza, por la misma razon que cuando estas en tiempo diseño por logica el compilador ya dibujo y carga todas sus propiedades en ese momento, entonces hasta donde yo se eso no se puede hacer.

Te pongo un ejemplo claro en los controles de VS, has visto el control 'DateTimePicker', si te fijas tiene una propiedad llamada Format (creo jejeje  :huh:), vaia entonces si te fija entre el listado que contiene, tiene una que se llama Custom, entonces, tambien en el mismop control existe otra propiedad FormatCustom que es donde pones el formato cuando el usuario elige en format que sea 'CUSTOM'.

Entonces si partieramos de tu logica de lo q intentas hacer, MS en su parte lo q tuvo q hacer es ocultar esa propiedad cuando no seleccione le usuario 'Custom', pero si te fijas no lo hizo asi, la propiedad siempre esta dispnible y habilitada en todo momento, lo que pasa es que no le hace caso, entonces aunq ponga cualquier onda, el compilador no le va hacer caso a esa propiedad hasta que en el otro lado no se alla activado 'Custom'

Entonces como vimos, al parecer no se puede, xq ni MS lo ha hecho, y siguiendo la logica de diseño de un Form, tampoco se puede, asi cambiar en tiempo real. Pero bueno yo simularia lo mismo que te explique con lo que hace MS con su control DateTimePicker

¿Por tanto como nos quedaria?
Primero modificando tu clase me quedaria de la siguiente manera:

Código: [Seleccionar]
Public Class TypeCajaTexto
    Enum PosiblesTipos As Integer
        [False]
        SoloNumeros
        ConDecimales
    End Enum

    Private tipos_ As PosiblesTipos
    Private Num_ As Integer
    Private Dec_ As Single
    Private Val As String

    Property SolamenteNumeros() As PosiblesTipos
        Get
            Return tipos_
        End Get
        Set(ByVal value As PosiblesTipos)
            tipos_ = value
            EvaluacionNum(tipos_, Val)
        End Set
    End Property

    Property Valor() As String
        Get
            Return Val
        End Get
        Set(ByVal Value As String)
            Val = Value
            EvaluacionNum(tipos_, Val)
        End Set
    End Property

    Private Sub EvaluacionNum(ByVal Tipo As PosiblesTipos, ByVal Val As String)
        'Primero verificamos que no este vacio, el cambo de VAL para hacer algun cambio
        If String.IsNullOrEmpty(Trim(Val)) Then
            'Ponemos a Cero las variables que contiene nuestro numero
            Num_ = 0
            Dec_ = 0
            Exit Sub
        End If

        'Verificamos que tipo de dato es el valor que tenemos para hacer la conversion
        Select Case Tipo
            Case PosiblesTipos.SoloNumeros
                If Not Integer.TryParse(Val, Num_) Then Throw New InvalidCastException("Error en la conversion del numero ingresado. Verifique que alla ingresado un numero")
            Case PosiblesTipos.ConDecimales
                If Not Single.TryParse(Val, Dec_) Then Throw New InvalidCastException("Error en la conversion del numero ingresado. Verifique que alla ingresado un numero")
        End Select
    End Sub
End Class

Entonces, al final solo te quedaria poner o hacer dos metodos que te retonen el valor ya sea Num o Dec, que contenga tus numero y eso creo q asi como funciona tu contorl.

PD. Tenia un error de sintaxis en la Enumeracion, para cuando querras poner nombres propios del compilador como FALSE, lo debes de poner en [] para que no tengas problemas!
« Última Modificación: julio 26, 2008, 12:16:04 pm por Juancho »
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #32 : julio 26, 2008, 12:11:26 pm »
entiendo tu punto...

y en cierto grado, ya había pensado que no se podía hacer... y no hay problema


lo que quería evitar es estar validando tanto.....

porque no es solo esos dos criterios tiene mi control.... pero bueno....

ahora, con lo que me has dicho, me has picado con otra cosilla.... je je je

pregunta?

¿como hacer para que mi control tenga una propiedad donde me despliegue un cuadrito donde pueda setear mas propiedades.... ?

algo así como la propiedad Font, que tiene un cuadrito al lado derecho, que te despliega una pantalla donde podes setear, el tipo de fuente, el tamaño, negrilla, etc....


así creo que podría hacer lo que necesito.....
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #33 : julio 26, 2008, 12:20:51 pm »
Mira CORREGI el post anterior que por error se me fue revisa el codigo que puse, ese seria el correcto

¿como hacer para que mi control tenga una propiedad donde me despliegue un cuadrito donde pueda setear mas propiedades.... ?

Con respecto a tu pregunta, yo me referia de forma que como que es un combobox, asi uno desplegable de las propiedades y eso te lo hace automatico el Diseñador, cuando vea que un tipo de varias opciones el te crea el combobox desplegable en las propiedades!

y hacerlo asi como decis el FONT, una vez vi un proyecto de un Grid que hicieron entonces, hicieron su propio cuadro de columnas los de los Grid de Visual y juela ocupan una clase para cada cosita de esas, te juro que yo vi el codigo y no lo entendi, es bn perdido ese codigo, es un ejmplo que encontre pero noc dond esta tendria q buscarlo, entonces mejor lo hic mas sencillo y no lo hic asi, juela era un codig bn pizado! Porque son un monton de clases que tenes que hacer y ocupas uno atributos un poco extraños de nombre de espacio ComponentModel
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #34 : julio 26, 2008, 01:56:15 pm »
justamente eso, es lo que quería evitar.... ocupar tanto código pa validar los datos ingresados.... porque mi caja de texto no solo recibirá valores numericos, sino otro par de hierbas.... y por cada uno hago validaciones que quería evitar, en cierto sentido, claro esta.....


respecto a lo otro, de hacer una propiedad "custom".... he visto ejemplos de lo que quiero.... pero como tu dices, son engorrosos....

nada más quería saber si tenías una forma un poco diferente de como hacerlo.....


pd: yo te iva a preguntar cual era la diferencia del código que habías puesto, con le que yo pues.... porque estaba igual XD..... pero ya vi que ahora si tiene cambios ñalsdfjasdlfkasjklfjsdkl
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #35 : julio 26, 2008, 02:27:15 pm »
Mmm... jajaja es q si bueno yo hasta donde se no se puede, para mi es una forma de hacerlo, pero si te fijas solo una linea de codigo es validarlo no es la gran onda tampoco, jajajaja!  :D  :D

Pero a saber si s podra, en san google no has buscado si se puede hacer como vs queres??

EDITADO

Sabes me puse a buscar y a leer un poco porque me entro la curiosidad de como obtener las propiedades de nuestro control y todo y ver si de esa manera se podia ocultar y si, encontre una forma en la ayuda de VS! Y es por la clase TypeConverter

Digamos en tu propiedade de tipos implemente de la siguiente manera:

Código: [Seleccionar]
    Private _Tipo As Tipos
    <Category("Info")> _
    Property TipoDato() As Tipos
        Get
            Return _Tipo
        End Get
        Set(ByVal value As Tipos)
            _Tipo = value

            'Hacemos la validacion
            If _Tipo.Equals(Tipos.Decimales) Then
                Dim Prop As PropertyDescriptorCollection = TypeDescriptor.GetProperties(GetType(UserControl1))
                MsgBox(Prop("Num").IsReadOnly)
            End If
        End Set
    End Property

Entonces por medio de la clase TypeDescriptor puedo obtener todas las propiedades de Mi clase, en este caso mi control, pero al intentar modificar la propiedad que yo deso, (en este caso yo tengo una propiedad llamada 'Num') todos los valores son ReadOnly, entonces eso significa que no lo puedo modificar los valores una vez Serializado por el diseñador de VS!

Entonces creo q con eso m quedo mas claro que asi en tiempo diseño NO SE PUEDEN MODIFICAR LAS PROPIEDADES, como por ejemplo ocultar!

Vaia entonces mientras estaba leyendo info sobre eso, por casualidad me acorde de una de las paginas que mas m gusta que tiene muy bueno ejemplos y encontre una forma facil de como manejar o crear tus propiedades personalizadas, te anexo unas fotos del ejemplo, y yo creo q te serviria esta manera:




Muy bueno el ejemplo, entonces alli te lo dejo para lo veas esta facil para implementar eso, solo es de entenderle como lo utiliza y creo q algo asi es lo querias hacer, te dejo el link para que veas el proyecto y descargues el codigo fuente.

http://www.codeproject.com/KB/cpp/DropDownPropertyEditor.aspx
« Última Modificación: julio 26, 2008, 03:29:12 pm por Juancho »
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #36 : julio 26, 2008, 03:37:10 pm »
vaia otra...... ahorita voy a leer lo que pusiste....

como te habrás dado cuenta, mi caja, podra recibir solo valores númericos Enteros o con décimales....


ahora toy con un lío.... quiero validar que la cantidad de decimales que ingrese sea lo que yo en la propiedad decimales permití, pero..... que si esta a la izquierda del punto le deje ingresar cualquier numero....

algo así como esto....

en el keyPress estoy trabajando...
' primero evaluo si permite decimales
' si es así permito que ingrese el punto "."
' que quiero hacer?, si esta a la derecha del punto solamente ingrese la cantidad de numeros que la propiedad decimales dice... asi

propiedad decimales =2
caja texto = "221.35"
pero si intenta agregar mas decimales como por ejemplo
caja texto = "221.352"
' no lo permita.... como toy en el evento Key press facil, hago un handled=true
' pero si toy a la izquierda del punto, que me permita ingresar mas numeros
caja texto = "4221.35
' ahi no habría necesidad de cancelar la escritura.....

me explico
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #37 : julio 26, 2008, 04:39:46 pm »
Juela!  :shock: No crees q t estas complicado la vida mucho??  :huh:  :huh:

Vaia realmente para que necesitas hacer eso?? Es que con formato se puede hacer mucho mas facil esa onda!, o con una mascara dinamica!
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #38 : julio 28, 2008, 08:23:25 am »
quería saber como hacerlo de esa manera.....


pero claro, mantendré la validación en el evento validating.... ahí si puedo hacerlo nais.... pero quería nada más ver que ondas con la "escritura"..... quería validar lo que "escribía" no lo que "escribio"
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #39 : julio 28, 2008, 12:22:44 pm »
quería saber como hacerlo de esa manera.....


pero claro, mantendré la validación en el evento validating.... ahí si puedo hacerlo nais.... pero quería nada más ver que ondas con la "escritura"..... quería validar lo que "escribía" no lo que "escribio"

Fijate que yo tengo un codigo para solo dejar pasar numeros, que aparece d ejemplo en la MSDN, solo q lo tengo q buscar y ahoraita estoy un poco ocupado, talvez mas tarde te lo pueda poner, pero m acuerdo que esta en la MSDN!
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #40 : julio 28, 2008, 02:03:54 pm »
ponelo, pero yo ya tengo un código que me funciona bien..... mi intención era validar la cantidad de decimales al momento que escribía.....

pero lo haré diferente... validare cuantos decimales en el evento validating...
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD parte III
« Respuesta #41 : septiembre 20, 2008, 03:02:57 pm »
quiero crear una propiedad que me devuelva todos los controles que estan en el frm "parent" para poder seleccionar uno...

Tal como la propiedad AceptButton y CancelButton de un formulario, que devuelven todos los controles del tipo Button del formulario....



tonces quiero agregarle a mi control una propiedad que me retorne todos los controles de un tipo específico....
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #42 : septiembre 20, 2008, 08:04:05 pm »
quiero crear una propiedad que me devuelva todos los controles que estan en el frm "parent" para poder seleccionar uno...

Tal como la propiedad AceptButton y CancelButton de un formulario, que devuelven todos los controles del tipo Button del formulario....



tonces quiero agregarle a mi control una propiedad que me retorne todos los controles de un tipo específico....

Vaia para empezar la propiedad AcceptButton o CancelButton no es q t devuelva todos los controles tipo buttons, sino lo q te devuelve son los controles q en ella se ha implementado la interfaz IButtonControl, que es la q se encarga q el formulario reconozca tu clase o control como si fuera un boton!

 :offtopic: X cierto si quisieras q un boton q vs allas creado lo quisieras visualizar alli en AccpetButton y CancelButton, solo implementa la Interfaz q t mencione alli para q t aparezca en el fomr y asi tu control la podas seleccionar

Vai con respecto a lo  queres noc si e entendido bn, pero lo que queres hacer es buscar en los controles d un parent, sea un form, un panel o cualquier control contenedor verdad??

Vaia creo yo q podrias crear un arraylist q sea el q t devuelva el tipo especifico, por ejemplo digamos vs le pasas el tipo q queres buscar y t quedaria mas o menos asi:

Código: [Seleccionar]
Public Class Form1

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Dim arLista As ArrayList

        arLista = BuscarControl(Me, New Label)
        MsgBox(arLista.Count)
    End Sub

    Private Function BuscarControl(ByVal ctlParent As Control, ByVal obj As Object) As ArrayList
        Dim arLista As New ArrayList
        Dim ctlTMP As Control

        For Each ctlTMP In ctlParent.Controls
            If ctlTMP.GetType.ToString = obj.GetType.ToString Then arLista.Add(ctlTMP)
        Next

        Return arLista
    End Function

End Class

Entonces es bn sencillo, alli t deje la funcion para cualquier tipo existente o clase, solo instancia un objeto directamente en la funcion y alli te va a comparar con los controles q tengas y te va a devolver un arraylist, habia otra forma d comparacion de tipos pero ya no m acuerdo entonces esa m la invente asi comparar el nombre directamente jajajaj! Espero q t sirva y eso creo q era lo q necesitabas!
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #43 : septiembre 22, 2008, 09:32:54 am »
casi casi.....

pero yo quiero una "propiedad" no una "función"......

tu función esta pegada en el frm parent.... pero yo quiero que sea una propiedad de "mi control"..... te lo explico de otra forma....

imaginate un frm como el siguiente...


tiene dos controles que yo he creado.... son del tipo textBox, se llaman CajaTexto.....

a esos controles CajaTexto les quiero crear una propiedad llamada.... CajaPadre

que hara esta propiedad CajaPadre....

tendrá la lista de todos mis controles CajaTexto que esten en el frm parent.....

me explico...
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re: vb.Net personalizar Control Personalizado XD
« Respuesta #44 : septiembre 22, 2008, 04:22:00 pm »
tu función esta pegada en el frm parent....

No vs no esta pegada, lo podes poner en un modulo o clase, por eso es q le puse como parametro el objeto Control, porque le puedo mandar cualquier control o cualquier formulario y ella lo buscaria!!

Mmmm, no entiendo exactament, jajajaj! hoy si no t capto lo q queres realmente, explicalo en otras palabras! jajajaja! :phew:
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>