none
Consulta sobre los archivos de recursos RRS feed

  • Pregunta

  • En VB6 existe solo un archivo de recursos por programa pero se puede crear una especie de carpetas y clasificar distintos tipos de imagenes por ejemplo.

    Veo que en VB Net aparte del archivo de recursos principal en cada formulario se crea automáticamente un archivo de recursos.

    La duda que tengo es: Los gráficos solo se añaden manualmente al archivo de recursos del programa, o sea al principal o tambien se pueden añadir en los archivos de recursos del formulario?

    Y la otra duda que tengo es: Se puede crear subcarpetas dentro de los archivos de recursos o cómo se hace para clasificar determinados archivos por grupos?


    • Editado James-2016 sábado, 5 de marzo de 2016 6:55
    sábado, 5 de marzo de 2016 6:54

Respuestas

  • "James-2016" preguntó:

    > Los gráficos solo se añaden manualmente al archivo de recursos del programa,
    > o sea al principal o tambien se pueden añadir en los archivos de recursos del
    > formulario?

    Depende del contexto del recurso que selecciones en el cuadro de diálogo Seleccionar recurso:


    Si seleccionas Recurso local y la imagen se la vas a asignar a un elemento cualquiera existente en un formulario (el propio Form, un control PictureBox, etc.), entonces el recurso se añadirá al archivo de recursos (*.resx) de ese formulario, añadiéndose solamente al archivo de recursos del proyecto si seleccionas éste contexto en el cuadro de diálogo comentado.

    Seleccionar recurso (Cuadro de diálogo)

    Administrar los recursos de la aplicación

    > Se puede crear subcarpetas dentro de los archivos de recursos o cómo
    > se hace para clasificar determinados archivos por grupos?

    Desde la ventana Explorador de soluciones del IDE de Visual Studio, puedes crear las carpetas que estimes conveniente, e incluir en ellas los archivos que igualmente consideres. Pero no esperes que Visual Studio te haga una clasificación de los mismos agrupándolos en "bonitos", "feos" o "medio pasables"; digamos que cada nombre que le asignes a la carpeta creada actuará de categoría para la clasificación que desees realizar. ;-)

    Pero si solamente te limitas a crear las carpetas dentro de tu proyecto y a depositar en ellas los archivos de imagen de acuerdo a su clasificación, en principio esos archivos NO estarán disponibles como recursos de la aplicación. Tienes que añadirlos al Archivo de recursos del proyecto (no al del formulario) mediante el cuadro de diálogo Seleccionar recurso. Una vez abierto, harías clic sobre el botón Importar, y harías la búsqueda del archivo en la carpeta correspondiente que has creado anteriormente. Conforme vayas añadiendo imágenes al archivo de recursos del proyecto, tanto la carpeta como el archivo se irán incorporando al proyecto, de igual manera que si importaras a tu proyecto cualquier archivo de código fuente de Visual Basic (una clase o módulo existente en un archivo con extensión *.vb).

    Esta sería la manera fácil y sencilla para trabajar con archivos de recursos, ya que esto te permitirá utilizar el objeto My.Resources para referenciar cualquier archivo de recursos que hayas importado al mismo:

            ' Asignamos la propiedad Image a un control PictureBox
            ' con la imagen existente en el recurso del proyecto
            ' llamado Imagen1.
            '
            PictureBox1.Image = My.Resources.Imagen1

    Después estaría la manera más "complicada", que pasaría por olvidarte de añadir los archivos mediante el cuadro de diálogo Seleccionar recurso, y añadirlos manualmente al proyecto como recursos incrustados. Una vez añadido el archivo al proyecto, selecciónalo en el Explorador de soluciones y pulsa la tecla F4 para mostrar sus Propiedades, dejando los valores de estas como aparecen en la siguiente imagen:

    Y mostrarías la imagen existente en un archivo incrustado ejecutando el siguiente código:

    Imports System.Reflection
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim asm As Assembly = Assembly.GetExecutingAssembly()
            Dim resourceName As String = String.Concat(asm.GetName().Name, ".", "Imagen2.png")
    
            Using st As IO.Stream = asm.GetManifestResourceStream(resourceName)
                PictureBox2.Image = Image.FromStream(st)
            End Using
    
        End Sub

    ¡Tu verás con qué código te encuentras más cómodo trabajando! ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 5 de marzo de 2016 9:26
    Moderador
  • "James-2016" preguntó:

    > encuentro la segunda opción más práctica para un conjunto de nombres en común
    > porque se puede construir una cadena para un grupo de nombres a menos que se
    > pueda hacer lo mismo con lo primero.
    >
    > Le consulto por si acaso:
    >
    > Suponiendo que tenga una Imagen1, Imagen2, Imagen3... ImagenN
    >
    > Usando esta sintaxis:
    >    PictureBox1.Image = My.Resources.Imagen1
    >
    > ¿Hay forma de hacer algo parecido a esto?:
    > For K=1 to N
    >     PictureBox1.Image = My.Resources.ImagenK  'Osea que la última parte haga referencia a un índice
    > Next

    Eso no está permitido porque el objeto My.Resources no dispone de una propiedad llamada ImagenK, de hecho, si has intentado compilar ese código, el propio compilador se habrá negado a compilar el proyecto, obteniendo la oportuna excepción en tiempo de diseño.

    La segunda opción que te indiqué, en ciertas situaciones es más práctica que utilizar que el propio objeto My.Resources, aunque yo la tildara de "complicada" (nótense las comillas dobles), porque te permite construir dinámicamente el nombre del recurso en tiempo de ejecución:

        ' El valor de la siguiente variable la puedes obtener de donde estimes conveniente,
        ' en el ejemplo se supone que la obtienes de una función que tienes implementada
        ' en tu proyecto para trabajar con los archivos de recursos.
        '
        Dim nombreArchivo As String = ObtenerNombreArchivoRecursos()
    
        Dim asm As Assembly = Assembly.GetExecutingAssembly()
    
        ' Especificamos dinámicamente el nombre del archivo de recursos que vamos a recuperar.
        '
        Dim resourceName As String = String.Concat(asm.GetName().Name, ".", nombreArchivo)
    
        Using st As IO.Stream = asm.GetManifestResourceStream(resourceName)
            PictureBox2.Image = Image.FromStream(st)
        End Using
    


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:49
    domingo, 6 de marzo de 2016 18:35
    Moderador

Todas las respuestas

  • "James-2016" preguntó:

    > Los gráficos solo se añaden manualmente al archivo de recursos del programa,
    > o sea al principal o tambien se pueden añadir en los archivos de recursos del
    > formulario?

    Depende del contexto del recurso que selecciones en el cuadro de diálogo Seleccionar recurso:


    Si seleccionas Recurso local y la imagen se la vas a asignar a un elemento cualquiera existente en un formulario (el propio Form, un control PictureBox, etc.), entonces el recurso se añadirá al archivo de recursos (*.resx) de ese formulario, añadiéndose solamente al archivo de recursos del proyecto si seleccionas éste contexto en el cuadro de diálogo comentado.

    Seleccionar recurso (Cuadro de diálogo)

    Administrar los recursos de la aplicación

    > Se puede crear subcarpetas dentro de los archivos de recursos o cómo
    > se hace para clasificar determinados archivos por grupos?

    Desde la ventana Explorador de soluciones del IDE de Visual Studio, puedes crear las carpetas que estimes conveniente, e incluir en ellas los archivos que igualmente consideres. Pero no esperes que Visual Studio te haga una clasificación de los mismos agrupándolos en "bonitos", "feos" o "medio pasables"; digamos que cada nombre que le asignes a la carpeta creada actuará de categoría para la clasificación que desees realizar. ;-)

    Pero si solamente te limitas a crear las carpetas dentro de tu proyecto y a depositar en ellas los archivos de imagen de acuerdo a su clasificación, en principio esos archivos NO estarán disponibles como recursos de la aplicación. Tienes que añadirlos al Archivo de recursos del proyecto (no al del formulario) mediante el cuadro de diálogo Seleccionar recurso. Una vez abierto, harías clic sobre el botón Importar, y harías la búsqueda del archivo en la carpeta correspondiente que has creado anteriormente. Conforme vayas añadiendo imágenes al archivo de recursos del proyecto, tanto la carpeta como el archivo se irán incorporando al proyecto, de igual manera que si importaras a tu proyecto cualquier archivo de código fuente de Visual Basic (una clase o módulo existente en un archivo con extensión *.vb).

    Esta sería la manera fácil y sencilla para trabajar con archivos de recursos, ya que esto te permitirá utilizar el objeto My.Resources para referenciar cualquier archivo de recursos que hayas importado al mismo:

            ' Asignamos la propiedad Image a un control PictureBox
            ' con la imagen existente en el recurso del proyecto
            ' llamado Imagen1.
            '
            PictureBox1.Image = My.Resources.Imagen1

    Después estaría la manera más "complicada", que pasaría por olvidarte de añadir los archivos mediante el cuadro de diálogo Seleccionar recurso, y añadirlos manualmente al proyecto como recursos incrustados. Una vez añadido el archivo al proyecto, selecciónalo en el Explorador de soluciones y pulsa la tecla F4 para mostrar sus Propiedades, dejando los valores de estas como aparecen en la siguiente imagen:

    Y mostrarías la imagen existente en un archivo incrustado ejecutando el siguiente código:

    Imports System.Reflection
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim asm As Assembly = Assembly.GetExecutingAssembly()
            Dim resourceName As String = String.Concat(asm.GetName().Name, ".", "Imagen2.png")
    
            Using st As IO.Stream = asm.GetManifestResourceStream(resourceName)
                PictureBox2.Image = Image.FromStream(st)
            End Using
    
        End Sub

    ¡Tu verás con qué código te encuentras más cómodo trabajando! ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 5 de marzo de 2016 9:26
    Moderador
  • Listo lo anterior ya quedó resuelto.

    Sobre los archivos de recursos encuentro la segunda opción más práctica para un conjunto de nombres en común porque se puede construir una cadena para un grupo de nombres a menos que se pueda hacer lo mismo con lo primero.

    ------------------------------

    Le consulto por si acaso:

    Suponiendo que tenga una Imagen1, Imagen2, Imagen3... ImagenN

    Usando esta sintaxis:

     PictureBox1.Image = My.Resources.Imagen1

    ¿Hay forma de hacer algo parecido a esto?:

    For K=1 to N

    PictureBox1.Image = My.Resources.ImagenK 'Osea que la última parte haga referencia a un índice

    Next



    • Editado James-2016 domingo, 6 de marzo de 2016 18:16
    • Marcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:48
    • Desmarcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:48
    • Marcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:49
    • Desmarcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:49
    domingo, 6 de marzo de 2016 17:32
  • "James-2016" preguntó:

    > encuentro la segunda opción más práctica para un conjunto de nombres en común
    > porque se puede construir una cadena para un grupo de nombres a menos que se
    > pueda hacer lo mismo con lo primero.
    >
    > Le consulto por si acaso:
    >
    > Suponiendo que tenga una Imagen1, Imagen2, Imagen3... ImagenN
    >
    > Usando esta sintaxis:
    >    PictureBox1.Image = My.Resources.Imagen1
    >
    > ¿Hay forma de hacer algo parecido a esto?:
    > For K=1 to N
    >     PictureBox1.Image = My.Resources.ImagenK  'Osea que la última parte haga referencia a un índice
    > Next

    Eso no está permitido porque el objeto My.Resources no dispone de una propiedad llamada ImagenK, de hecho, si has intentado compilar ese código, el propio compilador se habrá negado a compilar el proyecto, obteniendo la oportuna excepción en tiempo de diseño.

    La segunda opción que te indiqué, en ciertas situaciones es más práctica que utilizar que el propio objeto My.Resources, aunque yo la tildara de "complicada" (nótense las comillas dobles), porque te permite construir dinámicamente el nombre del recurso en tiempo de ejecución:

        ' El valor de la siguiente variable la puedes obtener de donde estimes conveniente,
        ' en el ejemplo se supone que la obtienes de una función que tienes implementada
        ' en tu proyecto para trabajar con los archivos de recursos.
        '
        Dim nombreArchivo As String = ObtenerNombreArchivoRecursos()
    
        Dim asm As Assembly = Assembly.GetExecutingAssembly()
    
        ' Especificamos dinámicamente el nombre del archivo de recursos que vamos a recuperar.
        '
        Dim resourceName As String = String.Concat(asm.GetName().Name, ".", nombreArchivo)
    
        Using st As IO.Stream = asm.GetManifestResourceStream(resourceName)
            PictureBox2.Image = Image.FromStream(st)
        End Using
    


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta James-2016 domingo, 6 de marzo de 2016 18:49
    domingo, 6 de marzo de 2016 18:35
    Moderador
  • Ok, gracias.
    domingo, 6 de marzo de 2016 18:46