Sv Community El Salvador

Soporte y Tecnología => Programación => .NET => Topic started by: tekun on July 15, 2008, 03:56:59 pm

Title: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 15, 2008, 03:56:59 pm
2 grandes temas.....

1- Colocarle un puntero especial.

Resulta que he creado un User Control en vb.Net [un control personalizado]; y quiero que cuando se le pasa el puntero por encima tenga un cursor diferente a los comunes de windows,

por ejemplo un cursor de los que estan aquí:

(http://www.educa.madrid.org/cms_tools/files/aa6914e6-f94c-41f8-89f5-4b6ec5960a7d/biggies.jpg)




Ya encontre cierto código en Internet y me funciona bien, pues me cambia el puntero.... Pero cuando agrego mi control a un proyecto y le doy guardar me aparece un mensaje... Repito, el puntero lo cambia y todo bien.... pero me da grima ese mensaje que me aparece siempre que le doy guardar...

aqui ta el mensaje.... me guarda los cambios que he echo pero siempre sale la siguiente pantalla
(http://img296.imageshack.us/img296/5034/errrut5.jpg)




2- Agrupar propiedades....
el pique esta así.... tengo dos propiedades en mi control.... una es por así decirlo, madre de la otra.... Han visto en .Net al propiedad DataBindings, que tiene un signo más(+) al lado izquierdo y al darle clic al signo se despliegan más propiedades....eso es lo que quiero hacer....

una img de ejemplo...
(http://img136.imageshack.us/img136/4570/errr2hw8.jpg)

son solo cosillas, quizá triviales para algunos, pero creo que a mis controles solo eso les falta  :p
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: JGuillen™ on July 15, 2008, 04:08:07 pm
con respecto a la pregunta 2... que control estas usando para agrupar esas propiedades en tu control?  :big_boss:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 15, 2008, 04:45:25 pm
Explicación de la pregunta 2

mi control es una caja de texto.....

mi control tiene una propiedad llamada FocusColor que devuelve un valor tipo "color" que tiene, valga la redundancia, el color de la caja de texto cuando tenga el foco....

pero hay una propiedad llamada ColoringOnFocused tipo boolean, que determina si se cambiara el BackColor de la caja de texto cuando tenga el foco....


estas son propiedades creadas por mis huesos


en otras palabras, la propiedad ColoringOnFocused es mamá de la propiedad FocusColor y quiero que en la paleta de propiedades esten agrupadas por la propiedad ColoringOnFocused, me explico....


aquí una img de mi control, con las propiedades ya funcionando...claro sin estar agrupadas
(http://img413.imageshack.us/img413/7834/errr3nf8.jpg)

quiero que a la izquierda de ColoringOnFocused este el signo mas (+) que espliegue la propiedad FocusColor agrupadas..... me explico


vuelvo y repito, si te parecen triviales estas preguntas abstenerse de comentarios personales y fuera de lugar....

mi objetivo es darle un grado mas profesional a mis controles personalizados....

Gracias :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: vlad on July 16, 2008, 05:43:17 am
Para el primer error se me hace que la propiedad "cursor" esta mal definida, esperando un tipo muy diferente al que le estas suministrando.

Podemos ver la pagina o algo de donde tomaste el codigo para lo del cursor?, o el fragmento del codigo de que maneja el cambio de la propiedad "Cursor" y la parte en tu programa que la usa?.
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 16, 2008, 10:43:01 am
Para el primer error se me hace que la propiedad "cursor" esta mal definida, esperando un tipo muy diferente al que le estas suministrando......

tenés toda la razón, a la misma conclusión llegue, pero lo que me detiene es el echo que mi código es funcional más no es perfecto..... es decir, en tiempo de ejecución al pasar el puntero sobre mi control hace el cambio del cursor....


desde un inicio se me ocurrió poner el código de mi control en el primer post...... pero vi más ganancioso pedirles como hacer el cambio de puntero.... pa no complicar tanto las cosas.... pero ya que me lo solicitas, aquí ta:

1- a mi control le he agrega un archivo .ico, que es el cursor..... se muy bien que los punteros tiene extensión .cur/.ani.... pero mi código no me furulaba con esa extensión.... entonces me vi obligado a cambiar la extensión del archivo a .ico...... en la propiedad de Acción a Generar tiene Recurso Incrustado[vs05]

2- el código esta en el load de mi control....
Code: [Select]
        Dim CurrentAssembly As String = Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString()
        Dim cursorFile As IO.Stream

        cursorFile = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(CurrentAssembly +".nombre_de_mi_cursor.ico")

        Me.Cursor = New Cursor(cursorFile)

y eso es todo.... el cursor me lo cambia.... agrego mi control .dll a un proyecto diferente, ejecuto el formulario y al pasar el puntero sobre mi control se cambia el cursor.... pero cuando al proyecto donde he pegado mi control le doy guardar y si tengo en frente el formulario donde esta mi control aparece el siguiente mensaje...
(http://img296.imageshack.us/img296/5034/errrut5.jpg)

creo que he mencionado algo importante y que se me olvidaba.....  :D je je... ese mensaje solo aparece si tengo en pantalla el formulario donde esta mi control.... si tengo otros o ninguno y le doy guardar ese mensaje no aparece .....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: vlad on July 16, 2008, 10:55:50 am
y si usas Cursor.Current en lugar de Me.Cursor?
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 16, 2008, 10:58:00 am
2- Agrupar propiedades....
el pique esta así.... tengo dos propiedades en mi control.... una es por así decirlo, madre de la otra.... Han visto en .Net al propiedad DataBindings, que tiene un signo más(+) al lado izquierdo y al darle clic al signo se despliegan más propiedades....eso es lo que quiero hacer....

una img de ejemplo...
(http://img136.imageshack.us/img136/4570/errr2hw8.jpg)

son solo cosillas, quizá triviales para algunos, pero creo que a mis controles solo eso les falta  :p

Esto de agrupar propiedades lo hace automaticamente VS! Pero para lograrlo hay que ocupar las cositas que se ponen en < > (se me a olvidado de los nombres de estas cosas  :D) que los pones arriba de una funcion ya se para agregarle propiedades o comportamiento en el entorno de diseño!

Dejame buscarlo que yo hic un ejemplo asi y te mando la explicacion! Que debo de tener un codigo dond ocupe eso! Ya lo explico!


MODIFICADO:    Creo q se llaman atributos pero que alguien m corija si no se llaman asi!  :D x_x


MODIFICADO NUEVAMENTE, Hoy si aqui te dejo, ya lo encontre vs:
RESPUESTA A LA SEGUNDA PREGUNTA

Vaia hoy si ya encontre el ejemplo del programa que hice, jejeje y esta facil y es como te mencione anteriormente, entonces para hacer ese efecto tenes que crear una clase o una estructura que contenga los campos que queres que aparezcan agrupados!

En mi ejemplo era para generar fondos degradados, por tanto agrupaba los campos del color 1, color 2 y si dado caso utilizaban la transparencia por tanto mi clase la llame 'COLORDEGRADADO' el cual incluye 2 propiedades basicas y son las que nos interesan entonces me quedaba declarada asi:

<TypeConverterAttribute(GetType(ExpandableObjectConverter))> _
Public Class ColorDegradado
    Private mAlpha As Integer = 255
    Private mColor As Color = Color.White

    <Description("Especifica el color que tomara")> _
    Property Color() As Color
    End Property

    <Description("El nivel de transparencia que posee el color. 0 es completament transparente y 255 completamente opaco")> _
    Property Transparencia() As Integer
    End Property
End Class

Esa seria mi clase para que los datos que m interesen esten agrupadon en una clase, y tenes que ponerle el atributo que te mencione arriba que es el TYPECONVERTERATTRIBUTE, para que eso se pueda convertir en un tipo expandible.

Una vez tengamos ya creado nuestra clase pasamos al codigo de nuestro control personalizado, entonces alli vas escribir lo siguiente, bueno en mi ejemplo lo hic de la manera siguiente:

Creo la propiedad en mi caso llamada BackColor1 y me quedo asi:

    Private BKColor1 As New ColorDegradado
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
     Category("Apariencia")> _
    Public Property BKColorDegradado1() As ColorDegradado
        Get
            Return BKColor1
        End Get
        Set(ByVal value As ColorDegradado)
            BKColor1 = value
        End Set
    End Property

Vaia si te fijas esta vez agrege 2 atributos:
 1 - DesignerSerializationVisibility este atributo se mal no recuerdo es el que hace que en tiempo diseño muestre el contenido del tipo que fue declarado, en otras palabras, que agarre los campos que contenga la clase que creamos anteriormente.

 2 - Category (Esta noc si ya te la podias), esta es para agruparla a una categoria ya existente o creamos una nueva a la hora de visulalizar las propiedades de nuestro control en Vista por CATEGORIA!


Una vez allas adaptado mi codigo a lo que deseas hacer, te debe de salir y te dejo una imagen de como te queda que es lo que querias lograr:

(http://img387.imageshack.us/img387/285/agruparrp1.th.png) (http://img387.imageshack.us/my.php?image=agruparrp1.png)

Espero que te sirva y cualquier duda me preguntas de algo que no te salga o no entendistes.

PD: Importaciones que debes de hacer son:
  - Imports System.ComponentModel
  - Imports System.ComponentModel.Design

Creo que solo esas son! Espero que te sirvar!   :big_boss:  :thumbsup:

PD 2: Si algunas cosas no las explique bn como los atributos que ocupe, podes buscar mas ayuda en el MSDN, para que entendas mejor la explicacion de esos atributos! Es que el año pasaod hic eso y algunas cosas no m acuerdo muy bn jejejeje!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 16, 2008, 12:48:49 pm
barbaro pajarito......


juancho, desde hace rato toy viendo que andas en algo con .Net.... sos la leche papa..... :)

el atributo Category y Description ya me lo podía los demas no... gracias



y con la pregunta 1 que ondas.... ya le has puesto cursor personalizado a algún control?¿?¿
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: vlad on July 16, 2008, 01:15:18 pm
y si usas Cursor.Current en lugar de Me.Cursor?
No me gusta ser persistente, pero lo dije en base a esto:
http://bytes.com/forum/thread463398.html (http://bytes.com/forum/thread463398.html)

Quote
VB allows you to access a shared method with an instance - in your example
"Me" is the instance. The "Cursor" property is a shared property however, so
there's no need to use an instance - just use the class. VS is simply
informing you that the "Me" will not be evaluated - useless message in this
case, but if your instance term was more complicated then it could be
informative.
Quote
Since Current is a shared property of the Cursor class, you just need to use
Cursor.Current instead of your form's instance of the Cursor class.
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 16, 2008, 02:11:04 pm
siento no haber respondido antes vlad, pero no había probado....  :phew:


y si usas Cursor.Current en lugar de Me.Cursor?

no me hace ningún cambio.....


otra dato, es que en mi control personalizado hay controles insertados, mi control tiene dos texBox.... tonces también tengo esto..
   
Code: [Select]
    Me.txtCodigo.Cursor = Me.Cursor
    Me.txtDescripcion.Cursor = Me.Cursor
Cursor es la variable que declare antes..... y solo dejando cursor.current=Me.Cursor no me hace nada....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 16, 2008, 02:12:55 pm
Vaia mira, estadop viendo pero no entiendo bn tu pregunta? Dejame ver, queres un control personalizado que cuando pase le mouse me cambie de cursor verdad?? Tanto para todos los objetos que este posea adentro verdad? Y no es de los cursores que trae por defecto windows verdad? asi es??
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 16, 2008, 02:18:47 pm
Code: [Select]
update preguntas
set respuesta='SI'
where user='Juancho'

asdkfjasdklfjasdlñfsjñflajf XD
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: vlad on July 16, 2008, 03:37:46 pm
no me hace ningún cambio.....
otra dato, es que en mi control personalizado hay controles insertados, mi control tiene dos texBox.... tonces también tengo esto..
   
Code: [Select]
    Me.txtCodigo.Cursor = Me.Cursor
    Me.txtDescripcion.Cursor = Me.Cursor
Cursor es la variable que declare antes..... y solo dejando cursor.current=Me.Cursor no me hace nada....

Me pregunto... y si porque no mejor usas Cursor sin el Me?

Mas o menos asi:

   
Code: [Select]
Dim cursorFile As IO.Stream
cursorFile = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(CurrentAssembly +".nombre_de_mi_cursor.ico")

Cursor = New Cursor(cursorFile)

................

Me.txtCodigo.Cursor = Cursor
Me.txtDescripcion.Cursor = Cursor

Acabo de probar (VS03) y tal parece eso te lo esta dando porque no se espera la instancia "Me" de la clase Cursor, sino la global "Cursor".

En resumen proba quitando "Me", que para mi seria el hInstance problematico.
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 16, 2008, 03:47:58 pm
RESPUESTA A PREGUNTA UNO

Vaia, esto si nunk habia hecho pero como ahorita estoy de vaca de la u y no tengo nada que hacer me puse a leer un poco de como se hacia. Me acuerdo que en VB6, era bn facil, porque en la propiedad MousePointer ponia 'Custom' y de alli en MouseIcon ponia el icono que queria, pero bueno ahora en el VS 2005 cambia un poco.

Bueno para empezar hice yo mi propio ejemplo y al final te lo anexo.

En la parte del control personalizado yo 'sobreescribi' la propiedad cursor ya que como los controles personalizados heredan propiedades de la clase base 'Control', entonces hice mi propia propiedad para que cuando en mi aplicacion yo le cambie el valor a la propiedad cursor de mi control personalizado, entonces este automaticamente se lo cambie a los q contengan andetro este (que yo sepa la mayoria de controles heredan el cursor que se establece en dond se encuentre contenidos osea su PARENT, significa que si yo le cambio a mi control personaliado la propiedad cursor, todos los elementos contendidos en el tambn la van a cambiar, aunq en los TextBox NO, porque como si ven ellos tiene su propio cambio que muestra el cursor, por eso, bueno creo que solo en ellos pasa eso aunq no estoy seguro), por eso en mi codigo de ejemplo solo a los textbox le cambie el icono.

Mi propiedad cursor en mi control personalizado queda de la siguiente manera:

Code: [Select]
Public Class UserControl1

    Overrides Property Cursor() As Cursor
        Get
            Return MyBase.Cursor
        End Get
        Set(ByVal value As Cursor)
            MyBase.Cursor = value
            TextBox1.Cursor = value
            TextBox2.Cursor = value

        End Set
    End Property
End Class

Bueno, esta es la unica modificacion que le hago a mi control personalizado. Despues me voy a la aplicacion donde ocupo mi control y bueno encontre 2 formas de hacer esto:

1 - Esta forma es la que ofrece MSDN para un cursor personalizado, que es crear un archivo de cursor y despues incrustarlo en los archivos de recurso de nuestra aplicacion por medio de la linea de comandos al inicio de nuestra app. Te dejo el link de MSDN por si lo queres revisar http://msdn.microsoft.com/es-es/library/system.windows.forms.cursor.aspx (http://msdn.microsoft.com/es-es/library/system.windows.forms.cursor.aspx)  PD. A mi no me parecio este metodo lo vi un poco complicado y no debia de ser asi.

2- Segui buscando y encontre el segundo que en el mismo articulo anteriormente citado esta de que es cargar el cursor desde una ubicacion en nuestro disco duro, para esto unicamente dimensionabas una variable del tipo cursor y cargabas la imagen de la siguiente manera:

Code: [Select]
Dim cur as new Cursor("C:\micursor.cur")
usercontrol1.cursor = cur

Y de esa manera lo cambia automaticamente el cursor y tambien todos los controles que contenga este.

Pero me invente una tercera forma:
Partiendo de la segunda forma, para evitarse estar poniendo las direcciones de las imagenes y todo lo demas, vi que me salia mas facil ocupar el Resource de mi aplicacion. (Creo que deberias de estar ocupando el control de recursos en tu aplicacion por tanto no me voy a meter mucho en la explicacion de esto).

Entonces, para no agregar solo archivos del tipo '*.cur' lo podemos hacer por este metodo:

1 - Incrusta la imagen al archivo de recursos de tu aplicacion. Si queres ocupar el que te crea por defecto el VS o crea un nuevo archivo de recursos es independiente.

2- Una vez tengas la imagen, para poderla utilizar como cursor vamos hacer un truco (jejejeje, me acorde que para el tratado de imagenes se ocupa esta conversion), te queda asi:

Code: [Select]
        Dim intP As IntPtr = My.Resources.Resource1.curAgregar.GetHicon
Entonces instancian un tipo IntPtr que es un achivo de posicion o de cursor para windows y como la imagen yo la habia agregado a mi archivo de recursos (por cierto esta se llama 'curAgregar'), entonces los tipo Bitmaps, tiene una funcion que convierte el Bitmap en IntPtr y esta funcion se llama GetHIcon

utilizando eso te queda el codigo de la siguiente manera:

Code: [Select]
        Dim intP As IntPtr = My.Resources.Resource1.curAgregar.GetHicon
        UserControl11.Cursor = New Cursor(intP)

Y si lo probas, lo podes hacer con cualquier imagen que desees, y lo unico que tenes que hacer es establecer correctamente el tamaño de la imagen para que el icono no te salga my grande como en mi caso, jajaja, te dejo el codigo ejemplo y cualquier duda me avisas.

Creo que esto es lo que no sabias, bueno eso entendi yo de la pregunta. Te dejo el codigo que hic talvez te sirva para ver como funciona: http://rapidshare.com/files/130224933/PruebaCursor.rar.html (http://rapidshare.com/files/130224933/PruebaCursor.rar.html)



Title: Re: vb.Net personalizar Control Personalizado XD
Post by: vlad on July 16, 2008, 03:53:43 pm
 :offtopic:

 :shock:.... no soy el del problema pero te voy a poner K+ por ese empeño que le pones Juancho!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 16, 2008, 04:46:38 pm
:thumbsup:  eres grande ednovi

gracias Juancho.... te has portado 10..... barbaroooooo....

tambien k+

me has sacado una spina que tenia desde ya hace rato.....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 17, 2008, 04:34:14 pm
je je


juancho, cuando use tu código funciono bien.... pero aún así no es lo que quiero, porque, pues tu creas una propiedad en tu control personalizado

Code: [Select]
Public Class UserControl1
    Overrides Property Cursor() As Cursor
        Get
            Return MyBase.Cursor
        End Get
        Set(ByVal value As Cursor)
            MyBase.Cursor = value
            TextBox1.Cursor = value
            TextBox2.Cursor = value
        End Set
    End Property
End Class

y un formulario aparte le pegas el puntero personalizado al control...... pero no es así la pila.... puesto que mi control estará en casi todo mi proyecto.... mi app no tiene un solo frm.... tonces, setear el puntero por cada control pierdo el objetivo.... yo quiero que mi control ya lleve el puntero nuevo... sé que todo fué por como explique las cosas....



ahora bien, si hago el cambio en tu ejemplo, para que el control ya lleve el puntero personalizado, de la siguiente manera...
Code: [Select]
Public Class UserControl1
    Overrides Property Cursor() As Cursor
        Get
            Return MyBase.Cursor
        End Get
        Set(ByVal value As Cursor)
            MyBase.Cursor = value
            TextBox1.Cursor = value
            TextBox2.Cursor = value
        End Set
    End Property

    Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim intP As IntPtr = My.Resources.Resource1.curNuevo.GetHicon
        Me.Cursor = New Cursor(intP)
    End Sub
End Class

claro, ya habiendo agregado el archivo Resource

y fuí al formulario donde esta el control y le dí clic al botón guardar, sabes que paso.....

 

me dió el mismo error..... klasdfñlasdkjfasñlfjksñdjlf XD
(http://img296.imageshack.us/img296/5034/errrut5.jpg)


incluso si pongo el código en el evento New dá el mismo error
Code: [Select]
    Private Sub New()
        InitializeComponent()
        Dim intP As IntPtr = My.Resources.Resource1.curNuevo.GetHicon
        Me.Cursor = New Cursor(intP)
    End Sub

vlad ya probe quitandole el Me. y da el mismo problema..... justo cuando le doy guardar al proyecto y si tengo el formulario con mi control en frente, booom el mensaje shukino
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 17, 2008, 08:46:15 pm
Vaia mira yo lo habia entendido que pusieras el cursor que vs quisieras, entonces por eso lo diseñe asi, y cabal al intentar hacerlo como vs lo hacias daba problemas y todo, cabal cuando lo carga y eso pasa quizas porque todacia el archivo de recursos del control no se a cargado o a saber, por eso es que da ese problema justo la primera vez.

Pero bueno, me puse a pensar otra solucion, y pense que como tiene que ser permanente el cursor, entonces lo podiamos de hacer de otra manera, y seria por medio de los eventos del control.

Vaia el evento que me interesa es el evento del MouseEnter, entonces ese evento se ejecuta cuando el mouse se posicion encima de nuestro control, por tanto vamos a controlar este evento desde nuestro control, pero recorda de que la clase base del que nuestro control heredas las propiedades ya contiene un evento llamado MouseEnter, entonces para no crear otro evento que haga eso para nuestra aplicacion, entonces lo vamos a SOMBREAR y de esa manera vamos a poder utilizar el nombre MouseEnter, sin que el compilador nos de problemas.

Por tanto tenemos que agregar una linea de codigo de la siguiente manera al inicio y declarar el evento MouseEnter en nuestra aplcacion de la siguiente manera:

Code: [Select]
Shadows Event MouseEnter As EventHandler
No se si antes habias utilizado Shadows, pero con shadows hacemos que como que no se tome en cuenta ese evento en nuestra clase base o en otras palabras lo oculta. Bueno si necesitas mas info podes buscar en MSDN.

Despues de haber declarado el evento de esta manera (despues te explico porque lo hacemos asi), agregaremos una nuevas lineas en el contructor de nuestro control y declararemos una variable global de la siguiente manera:

Code: [Select]
    Private intP As IntPtr

    Public Sub New()
        ' Llamada necesaria para el Diseñador de Windows Forms.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        intP = My.Resources.curDefault.GetHicon
    End Sub

Entonces en la instancia de nuestro control, vamos a obtener el valor intPtr de la imagen que deseamos como cursor y por tanto la guardamos en la variable que dimensionamos global a nivel de nuestra clase.

Y ya por ultimo, si corrieras asi no mas, el evento de MouseEnter en tu control no funcionaria, porque nosotros lo hemos ocultado y por tanto el compilador no le haria caso aunq ocurriera, entonces nosotros antes de provocar el evento cuando nuestro control intercepte ese evento, tenemos que cambiar la imagen del mouse y despues provocar el evento de MouseEnter ya para nuestra aplicacion y eso lo hariamos de la siguiente manera agregando la linea de codigo siguiente:

Code: [Select]
    Private Sub UserControl1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
        Me.Cursor = New Cursor(intP)
        RaiseEvent MouseEnter(sender, e)
    End Sub

OJO! Tene cuidado con el Handle, que el Handle que m interesa es el de mi clase base, porque si vs pusieras el de tu control (osea Me.MouseEnter) no te funcionaria, porque como lo estamos sobreescribiendo, nunca ocurriria. Por tanto fijate que diga MyBase, osea interceptar el evento de nuestra clase base.

Una vez lo interceptamos cambiamos el cursor en ese momento de nuestro control, y cuando lo cambiamos, provocamos el evento de MouseEnter para nuestra aplicacion, (digamos queres hacer algo mas con ese evento, lo provocamos para que siempre este disponible en nuestra aplicacion).

Entonces al final resumiendo el nuevo codigo de tu control te quedaria asi:
Code: [Select]
Imports System
Imports System.ComponentModel

Public Class UserControl1

    Shadows Event MouseEnter As EventHandler

    Private intP As IntPtr

    Public Sub New()
        ' Llamada necesaria para el Diseñador de Windows Forms.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        intP = My.Resources.curDefault.GetHicon
    End Sub

    Overrides Property Cursor() As Cursor
        Get
            Return MyBase.Cursor
        End Get
        Set(ByVal value As Cursor)
            MyBase.Cursor = value
            TextBox1.Cursor = value
            TextBox2.Cursor = value
        End Set
    End Property

    Private Sub UserControl1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
        Me.Cursor = New Cursor(intP)
        RaiseEvent MouseEnter(sender, e)
    End Sub
End Class

Entonces ya cuando lo probes, vas a ver que va a funcionar correctamente y ya no te aparecera el mensaje de antes, porque el puntero del moouse lo cambiaria hasta que el mouse entre en tu control.

Espero que te sirva y hoy si era de esta manera, te dejo de nuevo el ejemplo ya modificado por si te sirve: http://rapidshare.com/files/130530367/PruebaCursor.rar.html (http://rapidshare.com/files/130530367/PruebaCursor.rar.html)

Cualquier duda que no te salga me avisas o si no era asi tambien jajajaja !  :big_boss:  :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 18, 2008, 09:24:10 am
gracias por tu tiempo Juancho.....


siento que mi explicación inicial del problema ha creado otros problemas.... quizá si hubiese sido complemante claro desde un inicio tendría otros resultados.... todo ha sido mi culpa... lo siento mucho.....ahora te digo porque!


aqui ta una img de mi control:
(http://img104.imageshack.us/img104/9148/controlmv0.jpg)
son dos controles texBox los que ves ahí....yo quiero que al pasar el puntero por encima de cualquier textBox, es decir sobre mi control, el puntero del mouse cambie a uno completamente diferente a los que tiene windows, uno mio, pero, que yo no diga cual va ha ser.... mi control debe llevar ya su propio puntero.... y respetar cuando debe de aparecer...

mi control es asi tal y como esta en la img.... al control no le sobra espacio a ningún lado....

te podes imaginar cual es mi problema al ejecutar el código que me pusiste tal cual esta mi control?¿?¿?¿


.... el sub:
Code: [Select]
    Private Sub UserControl1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
        Me.Cursor = New Cursor(intP)
        RaiseEvent MouseEnter(sender, e)
    End Sub
jamás se ejecuta..... porque no hay espacio para MyBase.... en mi control no hay espacio.... para explicarte mejor hace lo siguiente en tu ejemplo...

recorta el espacio de tu control, de esta manera...
(http://img503.imageshack.us/img503/1268/control2wy3.th.jpg) (http://img503.imageshack.us/my.php?image=control2wy3.jpg)
y pasa el puntero sobre el textBox de arriba o sobre el boton de abajo...,

que paso?¿, no te cambia el puntero.....

entonces, me vi obligado a escribir los siguientes sub
Code: [Select]
    Private Sub TextBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles textBox1.MouseEnter
        Me.Cursor = New Cursor(intP)
        RaiseEvent MouseEnter(sender, e)
    End Sub

    Private Sub TextBox2_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.MouseEnter
        Me.Cursor = New Cursor(intP)
        RaiseEvent MouseEnter(sender, e)
    End Sub
para que, al pasar el puntero por cualquiera de mis TexBox se cambie el cursor....

ahora pregunto, podré mejorar esto?¿
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 18, 2008, 10:29:10 am
mmm si tenes razon, no m habias dicho que estaba todo pegado entonces vamos a ser una correcion en el codigo, y correctamente lo q has hecho esta bn, solo se te olvido implementar algo de las nuevas cosas en VS 2005 que son los Handles, entonces corrigiendo tu codigo y ocupando los handles me quedaria de la siguiente manera:

Code: [Select]
    Private Sub UserControl1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter, TextBox1.MouseEnter, TextBox2.MouseEnter
        Me.Cursor = Mycur
        RaiseEvent MouseEnter(sender, e)
    End Sub

En vez de crear tanto procedimiento para cada control, todos los pones en el mismo y asi te ahorras repetir codigo para objetos que hagan la misma accion.

Otro punto: Si te fijas modifiq la variable global intPtr y ahora en cambio mejor cree una variable del tipo cursor como global, para evitar de que cada vez que se ejecute el evento me instancie un nuevo tipo cursor, entonces mejor lo instanciamos en el procedimiento New del control y asi lo guardamos ahora en nuestra variable MyCur, te queda de la siguiente manera:

Code: [Select]
    Private Mycur As Cursor

    Public Sub New()
        ' Llamada necesaria para el Diseñador de Windows Forms.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        Dim intP As IntPtr = My.Resources.curDefault.GetHicon
        Mycur = New Cursor(intP)
    End Sub

Entonces asi ya lo tenemos guardado nuestro cursor y solo lo estamos llamando para evitarnos el problema de que cada vez instanciemos una nueva variable, a la larga nos va a ir creando un nuevo espacio en memoria y hasta que cierre el programa se libera recorda o la otra forma es llamar al GarbageCollector, pero no te sale mas facil ocupar de la manera que te deje

Espero que hoy si te sirva, porque entendi que te habia funcionado el anterio con la correccion que vs le hicistes, entonces eso era lo unico! Espero que hoy si!  :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 18, 2008, 02:06:03 pm
no sabía que se podía compartir los handles......  buen dato...

con lo demás esta todo solucionado.... :thx:
Title: vb.Net personalizar Control Personalizado XD, PARTE 2
Post by: tekun on July 23, 2008, 11:23:23 am
ahora vengo con otra preguntita.....

esta vez es sobre otro control personalizado, pero aplica para todos mis controles....

el control que ahora traigo a cuenta es una caja de texto normal... aquí una img.... [daré todos los datos pa agilizar la respuesta XD]
(http://img176.imageshack.us/img176/5669/control3nq6.jpg)
es una caja de texto tal cual la img de arriba, el cuadrito gris de la derecha es parte de mi control....

bueno, resulta que mi caja de texto tiene funciones "públicas", es decir, que cuando pego mi caja de texto a un formulario, puedo escribir lo siguiente,

Code: [Select]
miCajaTexto.DoConsult
que es lo que quiero? je je je

....cuando en un formulario agregue mi caja de texto y cuando escriba el código anterior, me aparezca una descripción de lo que hace mi función.... he aquí una img de lo que quiero

(http://img68.imageshack.us/img68/1654/control3als1.jpg)
la dizque flecha señala lo que quiero lograr....

supongan que en lugar de la función "ToString" sea mi función "DoConsult" tonces, quiero ponerle comentarios a mi función, tal cual esta en el cuadrito rojo de la img de anterior.....

me explico....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 23, 2008, 11:33:48 am
Eso es bien facil, eso e de un aplicacion de VS 2003 pero no me acuerdo el nombre, de alli en VS 2005 ya lo incluyeron y se puede para todas tus clases, propiedades, funciones, metodos y de todo. Lo unico que tenes que hacer es arriba de la funcion poner 3 comillas simples de la siguiente manera:

Code: [Select]
Private sub Prueba ()
end sub

Uno arriba siempre de cada funcion escribre "'''" y automaticamente el compiladr detecta y va agregar el codigo xml necesario te quedaria asi:

Code: [Select]
'''
Private sub Prueba ()
end sub

PD: No te pongo como queda, xq ahorita no estoy en visual pero solo ponele 3 comillas simples y automaticamente VS te pone lo necesario y vs solo rellenas!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 23, 2008, 11:52:06 am
barbaro pajarito.....

ahí ta todo lo que necesito... hasta crea comentarios por cada variable que tenga el procedimiento, etc...

:thx:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: JGuillen™ on July 23, 2008, 11:57:18 am
Eso es bien facil, eso e de un aplicacion de VS 2003 pero no me acuerdo el nombre, de alli en VS 2005 ya lo incluyeron y se puede para todas tus clases, propiedades, funciones, metodos y de todo. Lo unico que tenes que hacer es arriba de la funcion poner 3 comillas simples de la siguiente manera:

Code: [Select]
Private sub Prueba ()
end sub

Uno arriba siempre de cada funcion escribre "'''" y automaticamente el compiladr detecta y va agregar el codigo xml necesario te quedaria asi:

Code: [Select]
'''
Private sub Prueba ()
end sub

PD: No te pongo como queda, xq ahorita no estoy en visual pero solo ponele 3 comillas simples y automaticamente VS te pone lo necesario y vs solo rellenas!

y en C# como seria man?  :unsure:


Ya le haye.. sera  a si ///  que buen tips Juancho!  :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 23, 2008, 12:08:18 pm
.Net es biiiien inteiligente...
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Jonhyrey on July 23, 2008, 03:29:43 pm
Otro Tip!

Quote
<System.ComponentModel.Description("Obtiene o establece el nombre de .....")> _
    Public Property Nombre() as String

Esto le pone una descripcion en la caja de texto de las propiedades. Cuando es un control personalizado.
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 23, 2008, 04:08:05 pm
Otro Tip!
Code: [Select]
<System.ComponentModel.Description("Obtiene o establece el nombre de .....")> _
    Public Property Nombre() as String
Esto le pone una descripcion en la caja de texto de las propiedades. Cuando es un control personalizado.
simon, ese ya lo toy usando..... :)
Title: vb.Net personalizar Control Personalizado XD PARTE 3
Post by: tekun on July 26, 2008, 10:04:57 am
je je je....

ahora lo que quiero hacer es habilitar/deshabilitar los atributos de "mis" propiedades en tiempo de ejecución...

algo asi como esto:

Code: [Select]
Dim instancia As New MiClase()
instancia.Properties.Attributes([ReadOnly]) =True

como se puede hacer, si es que lo permite .Net

todo porque he creado propiedades que dependen de otras.... tonces, quiero hacer que mi control no permita malas configuraciones.... y así me evito estar validando tanto a puro código.... ojala y me explique...
Title: Re: vb.Net personalizar Control Personalizado XD PARTE 3
Post by: Juancho on July 26, 2008, 10:38:38 am
je je je....

ahora lo que quiero hacer es habilitar/deshabilitar los atributos de "mis" propiedades en tiempo de ejecución...

algo asi como esto:

Code: [Select]
Dim instancia As New MiClase()
instancia.Properties.Attributes([ReadOnly]) =True

como se puede hacer, si es que lo permite .Net

todo porque he creado propiedades que dependen de otras.... tonces, quiero hacer que mi control no permita malas configuraciones.... y así me evito estar validando tanto a puro código.... ojala y me explique...

Esto si no te entiendo vs, no entiendo lo queres hacer, noc si lo podes explicar un poquito mejor ya hasta con un ejemplo!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 26, 2008, 11:27:27 am
orale.... aquí explico con un código lo que quiero lograr....

imaginate una clase como la siguiente:

Quote
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í:
Quote
        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
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 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:

Code: [Select]
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!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 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.....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 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
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 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
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 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:

Code: [Select]
    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:
(http://www.codeproject.com/KB/cpp/DropDownPropertyEditor/ListBoxEditor.png)(http://www.codeproject.com/KB/cpp/DropDownPropertyEditor/TreeViewEditor.png)
(http://www.codeproject.com/KB/cpp/DropDownPropertyEditor/UserControlEditor.png)
(http://www.codeproject.com/KB/cpp/DropDownPropertyEditor/FormEditor.png)

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 (http://www.codeproject.com/KB/cpp/DropDownPropertyEditor.aspx)
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 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
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 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!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 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"
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on July 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!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on July 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...
Title: Re: vb.Net personalizar Control Personalizado XD parte III
Post by: tekun on September 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....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on September 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:

Code: [Select]
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!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on September 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...

(http://img179.imageshack.us/img179/5084/dibujocp8.th.png) (http://img179.imageshack.us/my.php?image=dibujocp8.png)(http://img179.imageshack.us/images/thpix.gif) (http://g.imageshack.us/thpix.php)
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...
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on September 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:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on September 22, 2008, 06:07:16 pm
es una funcionabilidad nueva para mi control....

te explico la lógica completa....

por ahí te envié un mp...

vuelvo y repito.... imaginate un frm como el siguiente...

(http://img179.imageshack.us/img179/5084/dibujocp8.th.png) (http://img179.imageshack.us/my.php?image=dibujocp8.png)(http://img179.imageshack.us/images/thpix.gif) (http://g.imageshack.us/thpix.php)

a mis controles CajaTexto, les ingresarán valores de dos tablas diferentes.. una tabla padre y una tabla hijo [hablando de la relacion de la base de datos]... imaginate las tablas comunes "GruposUsuarios" y "Usuarios" en la CajaTexto1, ingresarán el código de Grupo de la tabla GruposUsuario y en la CajaTexto2 ingresarán el Codigo de Usuario de la tabla Usuarios

...
....

que significa.... que la CajaTexto2 dependerá de la información que se ingrese en la CajaTexto1... es decir... que si yo pongo el grupo de usuarios Administradores en la CajaTexto1, solamente puedo poner en la CajaTexto2 los usuarios que estén en el grupo de usuarios de Administradores


que quiero lograr....


en tiempo de Diseño.... en tiempo de Diseño.... En Tiempo De Diseño.....
ponerle a la propiedad CajaPadre en mi control CajaTexto2 el control CajaTexto1.... pero esa propiedad debe listar únicamente mis controles del tipo CajaTexto que estén en mi formulario.... que para este caso sólo son 2


No estoy buscando el código para validar los datos.... NO!
estoy buscando como lograr hacer una "propiedad en mis controles" que me muestre los controles de mi formulario como un arrayList y que pueda manejar ese control a mi discresión....
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on September 23, 2008, 09:06:06 am
Bueno hoy si entendi perfectamente lo que necesitabas hacer y despues de leer un monton (porque m parecio interesante) y buscar encontre 2 formas pero ninguna de las 2 esta completa te las explicare a continuacion:

Primera Forma:
Yo pense q estaba un poco facil, entonces lo q c m ocurrio fue crear una propiedad de la siguiente manera:
Code: [Select]
Property CajaParent() As ArrayList
        Get
            Return BuscarControl
        End Get
        Set(ByVal value As ArrayList)

        End Set
    End Property

Entonces de esta manera va a cargar el Object Collection Editor, que es el editor de columnas o el tipido editor de agregar y eliminar y establecer el orden, te lo carga y todo los controles pero a mi no m gusto xq como q queda abierta la posibilidad de agregar y quitar y hasta cambiar el orden en tu Array.

Siempre q vs enlaces una coleccion como una propiedad te va a cargar el Object Collection Editor, entonces esta no funcionaba mucho x eso.
Nota. No se realmente si habra forma de modificar o no eso q no se pueda agregar ni eliminar elementos de la coleccion eso ya no intente porque m puse a pensar en otra manera.


Segunda Forma:
Vaia despues de eso, m puse a pensar q la forma era utilizar atributos, yo m acordaba q antes (no m acuerdo en q programa  :phew:) habia creado una clase, habia establecido atributos y hacia algo distinto, no era igual pero si parecido.

Entonces despues de buscar y de buscar encontre que tenemos q utilizar el atributo TypeConverter, bueno este en si es una clase la cual se encarga de convertir tipos a otros tipos y de esa manera de viceversa.

Entonces justo en la MSDN aparece un ejemplo de lo q necesitas y te coloco como queda:

MSDN explica que hay q crear una clase aparte y heredar la clase StringConverter y sustituir 4 metodos:

Code: [Select]
Imports System.ComponentModel

Public Class ListaItem
    Inherits TypeConverter

#Region "Metodos remplazados de la clase base"
    Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
        Return True
    End Function

    Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
        ' Pasa o dimensiona los valores internos de la clase
        Dim svc As New StandardValuesCollection(values)

        Return svc
    End Function

    Public Overloads Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then
            Return True
        Else
            Return MyBase.CanConvertFrom(context, sourceType)
        End If
    End Function

    Public Overloads Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        If value.GetType() Is GetType(String) Then
            Dim strTmp As String = value.ToString
            ' Verificamos si el valor ya esta ingresado en la lista de valores
            If Not values.Contains(strTmp) Then
                ' Si no se encuentra en la lista lo agregamos
                values.Add(strTmp)
                values.Sort()
            End If
            ' Returns the integer value to assign to the property.
            Return strTmp
        Else
            Return MyBase.ConvertFrom(context, culture, value)
        End If
    End Function 'ConvertFrom

#End Region

    Private values As ArrayList

    Public Sub New()
        ' Initializes the standard values list with defaults.
        values = New ArrayList(New String {"1", "2", "3", "4", "5"})
    End Sub 'New

En conclusion lo q hace la clase es que cuando llamemos al atributo TypeConverter en nuestra propiedad, va a convertir la coleccion a valores estandares o en este caso String, y como es una coleccion la va a cargar en si como si fuera combobox.

Despues en la clase de tu control tendriamos q escribir la propiedad de la siguiente manera:

Code: [Select]
<TypeConverter(GetType(ListaItem))> _
        Public Property TestInt() As String
        Get
            Return Me.strc
        End Get
        Set(ByVal Value As String)
            If Value.GetType() Is GetType(String) Then
                Me.strc = Value
            End If
        End Set
    End Property
    Private strc As String

Entonces nosotros ibamos a guardar el valor String, de alli para pasarlo tenemos q llamar al metodo de obtener la coleccion de la clase q creamos y nos va a retornar el valor real.

Esta manera seria la mas facil y mas util porque estamos capturando el String y de alli lo convertimos al tipo de datos q hayamos guardado en el arraylist y sin problemas!


Ahora viene el problema:
La segunda forma es exactamente lo q necesitas pero x estar en una clase y mas independiente de nuestro control, no hay forma de pasarle la coleccion de controles del Parent, es alli el problema xq no funciona.

Empeze a inventar y todo, intentandole pasar por el constructor pero da problemas xq al aplicar el atributo TypeConverter no permite pasar algun parametro, porque realmente al aplicar el atributo no se esta instanciando.

Por tanto, no e encontrado una forma de pasarle los controles a la clase y de esa manera q a partir de alli se cree el arraylist.

Te lo dejo el codigo de esa manera por si encontras una forma de pasarle la coleccion de controles a la clase y asi generar la propiedad. Pero realemente invente de todo y no pude nunk pasarlo.

O bueno, despues ahora en la mañana m puse a pensar y creo q llegue a la conclusion de q no c puede hacer de esa manera q una propiedad en tiempo diseño, cargue controles de esa manera como si fuera un ComboBox!.

A veces una comparativa sencilla es ver si hay algun control de VS q implemente eso, o fijarse q maneras utilizaron ellos para realizar algo similar! Y yo q sepa creo q ningun control de VS implementa eso.

Y si t acordas las propiedades AcceptButton y CancelButton, son del Formulario, osea el control q contiene a estos por tanto x eso creo q lo logran listar. En cambio nosotros estamos intentado acceder al padre no a los hijos de un control.


Mi Solucion:
Yo lo q haria seria mejor hacer una propiedad String, y q alli el programador escriba el nombre del control al cual desea la conexion, y ya alli con el nombre en el control creo q ya podes hacer las validaciones.

No es la mejor solucion, pero solucion sencilla y como solo el nombre del control necesitas entonces siento yo q seria la mejor! Al igual podes validar la propiedad q solo aceptes nombres de controles existentes!

Espero q t sirva o si encontrar alguna forma de pasarle la coleccion a la segunda forma que te puse m avisas!!  :thumbsup:  :big_boss:


Aqui te dejo el link de la MSDN donde explica como crear una lista para una propiedad en tiempo diseño: http://msdn.microsoft.com/es-es/library/ayybcxe5(VS.80).aspx (http://msdn.microsoft.com/es-es/library/ayybcxe5(VS.80).aspx)

PD:
Mi segunda solucion quisas seria implementar una Interfaz como hacen con el AcceptButton, pero todavia no se muy bien como se haria, entonces en eso estoy pensando! Te comento si encuentro algo!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on September 23, 2008, 09:24:05 am
mil gracias  Juancho.....

k+


me parece mucho las soluciones que das....
mi primera alternativa era crear una propiedad del tipo string tal como lo planteas vos.... pero me dí cuenta que me estaba quedando corto... busque en internet información y encontre tu segunda solución "Interfaces" pero no le haye como putas implementarlo.... por eso vine y cree este post....

y cuando tu me dijiste desde la primera vez como lo hacen los botones Acept y Cancel de un frm... me supuse que esa sería la respuesta correcta....

pero igual, sigo sin poderlo implementar...

voy a tratar lo que sugeris y hay te aviso....


nuevamente..... mil gracias :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on September 23, 2008, 10:30:26 am
Bueno te publico la solucion como te comente:

La solucion era cabal utilizando una interfaz como en PD anterior. Las interefaz realmente es solo para forma como el cascaron de los metodos y propiedades q queremos implemnetar en nuestras clases como por ejemplo siempre queremos q lleven alguna propiedades y todo entonces es alli donde utilizamos las propiedades. Creo q eso es el encapsulamiento de VS!

Bueno hablando de la solucion, es como los Formulario q las propiedades de AcceptButton y CancelButton son propiedades de tipo Interfaz y eso se puede ver en la ayuda MSDN ellos le ponen as IButtonControl que fue la interfaz q anteriormente te mencion q implementaban.

Bueno entonces de esa manera era solucion para tu problema por tanto tenemos que definir una interfaz, (NOTA: Solo cree los procedimientos basicos para que vieras el funcionamiento)

Entonces mi interfaz me quedo de la siguiente manera:
Code: [Select]
Public Interface ILista
    ReadOnly Property NameCaja() As String
    Function ControlParent() As CajaTXT
End Interface

Unicamente cree la propiedad NameCaja que va a ser la q m va a servir para saber el nombre del control cuando implemente mi interfaz
Y la funcion ControlParent que me va a retorna el objeto o la clase en si de mi control que este enlazado a este, sino esta enlazado con ningun control retornanra una excepcion NullReference

Bueno una vez tenga la interfaz ya echa, en mi control personalizado la tengo que implementar y mi control m queda de la siguiente manera:

Code: [Select]
Imports System.Windows.Forms
Imports System.ComponentModel


Public Class CajaTXT
    Inherits TextBox
    Implements ILista

    Private IFL As ILista = Nothing
    Property li() As ILista
        Get
            Return IFL
        End Get
        Set(ByVal value As ILista)
            If value IsNot Nothing Then
                IFL = value
            End If
        End Set
    End Property

#Region "Propiedades y Metodos implementados por la Interfaz"
    <Browsable(False)> _
    Friend ReadOnly Property NameCaja() As String Implements ILista.NameCaja
        Get
            Return Me.Name
        End Get
    End Property

    ''' <summary>
    ''' Funcion que retornaria el control enlazado o el control padre
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Friend Function ControlParent() As CajaTXT Implements ILista.ControlParent
        Return Me
    End Function
#End Region

#Region "Propiedades de Nuestro Control"
    <Browsable(False)> _
    Public ReadOnly Property NameCajaParent() As String
        Get
            Return IFL.NameCaja
        End Get
    End Property

    Public Function GetParent() As CajaTXT
        If IFL IsNot Nothing Then
            Return IFL.ControlParent
        Else
            Throw New NullReferenceException("No existe ningun objeto enlazado a este control")
        End If
    End Function
#End Region
   
End Class

Separe las propiedades y metodos implementados por mi interfaz y las propiedades de mi control por regiones para que se entienda mejor.

A la hora de implementar una interfaz, tenemos q generar el codigo para la interfaz, porque en la interefaz solo definimos las propiedades y metodos pero hasta q uno la implementa define el codigo.

Si te fijas en NameCaja, retorno el nombre de la clase q este instanciada en ese momento, si yo cree en mi formulario un contorl llamado "Caja1", entonces alli voy a retornar el nombre "Caja1"
Y la segunda CajaParent voy a retonar en si la clase, osea mi control por eso le pongo Me

Despues e publicado la propiedad li que es dond se va a enlazar los controles:

Code: [Select]
    Private IFL As ILista = Nothing
    Property li() As ILista
        Get
            Return IFL
        End Get
        Set(ByVal value As ILista)
            If value IsNot Nothing Then
                IFL = value
            End If
        End Set
    End Property

entonces lo q voy a estar manejando son interfaces, y unicamente voy a poder utilizar los procedimientos q alla implementado en mi interfaz, es por eso q definimos NameCaja que nos serviria para saber el nombre de la caja enlaza y CajaParent para regresar el control completo!

BUeno de alli creo q se explica el solo y por ultimo vemos la implementacion en nuestro formulario. Si yo quisiera saber (cuando mi formulario se esta ejecutando) el nombre de la caja que esta enlazada a mi control lo haria de la siguiente manera:

Code: [Select]
CajaTXT1.NameCajaParent
Aqui regreso el nombre de la caja enlazada a este, si no hay ninguna regreso nothing

Y si quisiera controlar o cmabiar las propiedades del control enlazado tendria q hacer lo siguiente:
Code: [Select]
Dim cajapadre As CajaTexto.CajaTXT = CajaTXT1.GetParent
Y despues manipular cajapadre para los cambios q uno le quisiera hacer!

Por cierto en las propiedades de mi control cree 2 que son las que regresan el nombre de la NameCajaParent y la q vistes GetParent para q regrese el padre no la clase en la q se esta trabajando!

Esas creo q no necesitan mayor explicacion, creo q se explican por si sola!

Bueno eso creo q era lo q querias hacer, alli ya t queda implemnetado, realmente esta facil, solo cree esos metodos porque serian los mas basicos ya de alli te toca implementarlo a tu proyecto y agregarle si es necesario o adaptarlo!

Cualquier duda ya sabes o algo q no entendas m avisas!  :big_boss:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on September 23, 2008, 11:14:21 am
gracias viejo!

lo voy a revisar detalladamente en mi casa... no tengo chance ahorita....

hay te aviso cualquier onda.... :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on October 03, 2008, 12:49:39 pm
ahora tengo otra consultilla....... XD


ya me di verga como no tenés idea y no logro hacer lo que quiero ahora....... XD

necesito crear una propiedad parecida al tipo Matriz de dos dimensiones....

como así.....

quiero una propiedad donde pueda poner dos únicos datos.... "Codigo" y "Descripcion"

primera prueba fallida

ya probe con una propiedad de matriz de "una" dimension, pero, no haye como utas hacer para hacerla de dos dimensiones...

mi propiedad matriz de una dimension
Quote
private Campos_(99) as string
property Campos() as string
        Get
            Return Campos_
        End Get
        Set(ByVal value() As string)
            Campos_ = value
        End Set
end property
pero como dije no haye como hacerla de dos dimensiones.... que podría ser una solución a lo que necesito.....




segunda prueba fallida

probe con una propiedad del tipo List (of ) ..... pero no me guarda la lista...


hise una clase asi
Quote
Imports system.Collections.ObjectModel
Public Class CamposGrid
    Private Codigo_ As String
    Property Codigo() As String
        Get
            Return Codigo_
        End Get
        Set(ByVal value As String)
            Codigo_ = value
        End Set
    End Property

    Private Descripcion_ As String
    Property Descripcion() As String
        Get
            Return Descripcion_
        End Get
        Set(ByVal value As String)
            Descripcion_ = value
        End Set
    End Property
End Class

luego la propiedad la hice así....

Quote
private Campos_ as new List(Of CamposGrid)
    Property Campos() As List(Of CamposGrid)
        Get
            Return Campos_
        End Get
        Set(ByVal value As List(Of CamposGrid))
            Campos_ = value
        End Set
    End Property

y en efecto, aparece la propiedad con el tipo Lista de mi clase.... ya en tiempo diseño, agrego los datos en la propiedad .... pero, pero, cuando ejecuto el proyecto no me aparece la Lista con Valores, valores que yo en tiempo de diseño agregue....



SE QUE ALGO TENGO MALO....

pero en ambos casos es que necesito ayuda....



la solución que mas me urge es la segunda.... Propiedad con List (Of) ...... pero cualquier ayuda  en ambos casos es Bienvenida.... :)
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on October 03, 2008, 08:46:28 pm
Mira ya que queres usar un valor asociado a su codigo, en vez de crear una matriz xq no ocupas un DictionaryEntry o una HasTable, para lo que queres hacer te conviene mejor hacer una hashtable, asi le mandas la clave (en tu caso el codigo) y a lo q esta asociado (descripcion) y podes buscar en tu matriz asi como si fuera diccionario con la clave asociada!

Y con lo de matriz multidimensional no intentastes con:
Dim matriz()() as string

Con poner parentesis seguido alli le decis al compilador q estas creando una matriz de 2 dimensiones!

Avisame si te parece con un HashTable o si te funciona ya directamente lo de la matriz! Asi para ayudarte con cualquiera de las 2!
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on October 04, 2008, 08:50:19 am
Y con lo de matriz multidimensional no intentastes con:
Dim matriz()() as string

ijole..... se me olvido decir que con lo que tengo problema es con la Declaración de La Propiedad, o sea, una variable la puedo dimensionar con dos valores de esta forma.... dim matriz(99,99) as string

pero, el problema esta en decirle a una propiedad que va a recibir valores de una matriz multidimensional....
property ArrayMultimensional()() as string da error.... property ArrayMultimensional(99,99) as string también da error....




me parece lo que decis del HashTable..... pero ojo.... porque debe cumplir con el requisito de poderlo usar en una propiedad, y que le ingrese valores en tiempo de diseño desde la ventana de Propiedades.....

Si cumple eso, dale, decime como usar el HashTable :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: Juancho on October 04, 2008, 11:43:09 pm
Bueno primero probe lo de la matriz y para nada, no se puede! Yo pense q si c podian manejar matrices en las propiedades pero no solo vectores (una dimension).

Bueno entonces la unica solucion q se m ocurrio fue combinar lo q antes habia explicado q es como hacer propiedades expandibles con el Object Collection Editor q tambn ya lo habiamos visto antes! Bueno lo voy a explicar a grandes rasgos xq antes creo q en este tema lo explique y te pongo lo que debes de hacer y crear.

SOLUCION
Vamos a crear el contenido  o los campos que deseamos en nuestra matriz, para hacerlo tipo ExpandableObject que el diseñador en la ventana de propiedades tomaria nuestra clase como un objeto expandible, entonces para crearlo creamos la siguiente clase:

Code: [Select]
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Collections

<TypeConverterAttribute(GetType(ExpandableObjectConverter))> _
Public Class ContentMatriz
    'Esta clase va a ser lo q va a contener la matriz o mi array list
    Private m_Codigo As String = "1"
    Private m_Des As String = "HOLA"

    Sub New()
    End Sub

    ''' <summary>
    ''' El constructor en la clase, la cual se puede pasar automaticamente los parametros que se le van agregar
    ''' </summary>
    ''' <param name="Codigo"></param>
    ''' <param name="Descripcion"></param>
    ''' <remarks></remarks>
    Sub New(ByVal Codigo As String, ByVal Descripcion As String)
        m_Codigo = Codigo
        m_Des = Descripcion
    End Sub

    Public Property Codigo() As String
        Get
            Return m_Codigo
        End Get
        Set(ByVal value As String)
            m_Codigo = value
        End Set
    End Property

    Public Property Descripcion() As String
        Get
            Return m_Des
        End Get
        Set(ByVal value As String)
            m_Des = value
        End Set
    End Property

End Class

Si te fijas a la clase le establecemos el atributo de TypeConverter, que antes en un ejmplo te lo explique para q servia y le ponemos q convierta la clase a ExpandableObject, y de esa manera tendriamos una propiedad que se puede expandir.
OJO: yo solo agregue 2 propiedades y sin validaciones ni nada, pero aqui vs podes meter todas las propiedades que necesites y no vas a tener problema!

Ahora que ya tenemos nuestra clase que seria el contenido, nos vamos a la clase de nuestro UserControl y vamos a crear la propiedad que seria la matriz y hariamos uso del Object Collection Editor por tanto la declaracion de nuestra propiedad nos quedaria:

Code: [Select]
    Private hMat As New List(Of ContentMatriz)
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public Property hIma() As List(Of ContentMatriz)
        Get
            Return hMat
        End Get
        Set(ByVal Value As List(Of ContentMatriz))
            hMat = Value
        End Set
    End Property

Entonces de esa manera, cuando vayamos a llamar a la propiedad en tiempo diseño, nos cargara el Object Collection Editor, pero los campos que vamos a ingresar seria los de nuestra clase que creamos anteriormente, entonces seria un registro por clase y todo esas clases se almacenan en un List.

Yo que me acuerde (y no se donde lo lei) al parecer no tiene soporte para el manejo d multiples dimensiones por eso la solucion se debe d implementar asi como te la e puesto!

Bueno no entre en mucho detalle en ese post, xq anteriormente te explique lo del Object Collection Editor y tambn creo q t explique para ser propiedades expandibles! entonces alli podes revisar x si ya no te acordas!

Espero q esto sea lo q andabas intetando hacer y t sirva! Cualquier duda m avisas!!  :big_boss:  :thumbsup:
Title: Re: vb.Net personalizar Control Personalizado XD
Post by: tekun on October 06, 2008, 08:48:00 am
barbaro colocho..... yo intente hacer lo que tu me dices.... pero no me salió......

GRACIAS COMPADRE..... :thumbsup: