Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Tazmania40

#31
Buenos días, en primer lugar muchas gracias Elektro, eres todo un genio. Si funciona el formato URI en el control WMP. La verdad estoy un poco perdido en tema de ficheros, pero veo que es la solución a los formatos de audio que no son WAV.

Visual Basic 2013 al añadir cualquier formato que no sea WAV toma como fichero como bien dices en My.Resources, pero ya veo una forma de poder utilizarlos y asi compilar un único archivo. Comentarte que lo que estoy realizando no es un Reproductor, sino un juego de naves y globos con dosis educativa (operaciones matemáticas para niños), donde tenía una música de fondo con WMP y utilizaba sonidos WAV con My.Computer.Audio.Play, que solo me dejaba reproducir uno a la vez. De esta forma podía combinar más sonidos puesto que el WMP puedes añadir más (realmente con el sonido de fondo y 2 sonidos más a la vez, disparo de nave y explosión me basta para no saturar, no empleo nada de DirectX y tampoco sé).

Respecto a tu código he añadido una línea para cambiar la extensión, puesto que el archivo temporal que te crea al reproducir te salta un mensaje que es una extensión .TMP y tienes que contestar y naturalmente eso no quiero que salga en el programa cada vez que reproduce el sonido o aunque sea 1 sola vez marcando el Checkbox.

Código (vbnet) [Seleccionar]

Dim filepath As String = Path.GetTempFileName()
filepath = Path.ChangeExtension(filepath, ".mid")
Dim fileUri As New Uri(String.Format("file:///{0}", filepath))
ExtractResourceToDisk(My.Resources.Sonido, filepath, overwrite:=True)

AxWindowsMediaPlayer1.URL = fileUri.AbsoluteUri


He probado con archivo MID (son los que utilizaré puesto que apenas ocupan), MP3 y archivos WAV (hay que quitarles extensión al añadir a My.Resources para que te lo añada como archivo) y funcionan todos perfectamente.

Implementaré esto en el código de mi juego y tan solo sera ver si no demora con el funcionamiento, puesto que antes solo utilizaba estas instrucciones para llamar a los sonidos

Código (vbnet) [Seleccionar]

My.Computer.Audio.Play(My.Resources.Sonido1, AudioPlayMode.Background)
AxWindowsMediaPlayer1.URL = "Sonido.mid"


En el código además de la nave, muevo unos cuantos objetos, Globos, disparos, fondo con un pequeño Scroll horizontal y comprobare que no se pare, aunque hoy día los ordenadores son muy rápidos, pero estoy utilizando Net.Framework 3.5 para que otros ordenadores más lentos y con XP también sea compatible.

Gracias por tu librería y muy currada. Yo soy un simple aficionado que más bien programo por hobby. Los programas y juegos que realizó intento que sean en un único archivo (utilizando las NET que ya tiene los ordeandores instalado). En este proyecto me será imposible porque Windows Media Player trae consigo dos librerías (AxInterop.WMPLib.dll e Interop.WMPLib.dll) aunque apenas ocupan, pero ya por lo menos todos los sonidos los tendré compilados con el ejecutable.

Sino es mucha molestia, pero a modo consulta no hace falta que me pongas código, con Windows Presentation Foundation (WPF) puesto que dicen que es más visual, que incluye animaciones, video, sonidos, 3D; se podría añadir recursos de audio que no sean WAV, en My.Resources o bien lo que tenga. Desconozco completamente WPF y cuando instale VB.net ya adapté el entorno a la programación con Windows Forms, puesto que yo venía de VB6.

Muchas gracias
Saludos

#32
Buenas yo también soy del lenguaje vb.net (en su versión 2013), desde pequeño siempre me gustó la programación y empecé con el Basic en mi ordenador Commodore 64 (que tiempos), luego he ido pasando por distintas versiones como QBasic 4.5, Visual Basic 4.0, 5.0 y 6.0; dejé de programar 10 años por lo menos y volvía a retomar el año pasado la programación y así me actualizaba en mi lenguaje favorito, todo lo hago por hobby, aunque he realizado alguna base de datos con visual para mi empresa pero mi trabajo es a nivel técnico y no de programación.

Otros lenguajes que he programado y que he aprendido mientras estudiaba
----------------------------------------------------------------------------------------

- Pascal
- Delphi
- C / C++
- Java (muy poco)

Saludos
#33
.NET (C#, VB.NET, ASP) / Re: Visual Basic
27 Mayo 2016, 08:11 AM
Buenas me imagino que lo que te están pidiendo es un formulario de entrada a la aplicación con un login y password y que pueda tener algunos perfiles de acceso (usuario, usuario avanzado, administrador...)

Para ello debe agregar un nuevo formulario o bien un modulo que incorpore un procedimiento o función público (lo puedas usar en toda la aplicación), desde el menu Proyecto, Agregar nuevo elemento... (Módulo o Windows Form)

Dependiento del nivel de acceso del usuario podrá realizar o tendrá activadas una serie de caracteristicas o no de tu aplicación. Normalmente la utilidad que yo empleo a esto es en las Bases de Datos.

Saludos
#34
Buenas queria realizar 2 preguntas, con Windows Forms.

1º El Objeto My.Resources permite añadir otro tipo de archivos de audio que no sean WAV, esto es para utilizarlo con el control Windows Media Player en Visual Basic 2013.

2º Hay alguna forma de añadir el sonido, aunque sea WAV sino se puede otro formato en el control Windows Media Player desde los recursos (My.Resources). El código que utilizo es este, pero me gustaría compilar todo sin utilizar archivos externos.

Código (vbnet) [Seleccionar]
AxWindowsMediaPlayer1.URL = "C:\Temp\Sonido1.wav"

Me gustaria utilizar esta forma y he probado de muchas maneras y no lo consigo.

Código (vbnet) [Seleccionar]
My.Computer.Audio.Play(My.Resources.Sonido1, AudioPlayMode.BackgroundLoop)

Muchas gracias
Saludos
#35
Buenas quería saber si se puede desde Visual Basic 2013 cambiar una contraseña de una base de datos Access 2010 (por código con ADO.NET), pongo siguiente código a modo de ejemplo. Como sería el código en el botón BtnPassword.


Public Class Form1
   'Declaración Conexión al origen de datos con proveedor Access
   Public Acceso As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Prueba.accdb;Persist Security Info=True; _
Jet OLEDB:Database Password=sabe1#012345678910lu")
   'Declaración del DataSet
   Public DS As New DataSet
   'Declaración del DataAdapter con la consulta de toda la tabla
   Public DATA As New OleDb.OleDbDataAdapter("SELECT ID, NOMBRE, TELEFONO, CORREO FROM Agenda", Acceso)

Private Sub BtnCargarTabla_Click(sender As Object, e As EventArgs) Handles BtnCargarTabla.Click
       'Conectamos a la BD y cargamos los valores al DataGridView
       Try
           Acceso.Open()
           DS.Tables.Add("Tabla")
           DATA.Fill(DS.Tables("Tabla"))
           DataGridView1.DataSource = DS.Tables("Tabla")

           MsgBox("Se ha conectado a la BD", MsgBoxStyle.Information)
       Catch ex As Exception
           MsgBox("Fallo de conexión" & Chr(13) & ex.ToString, MsgBoxStyle.Critical)
       End Try
       Acceso.Close()
End Sub

Private Sub BtnPassword_Click(sender As Object, e As EventArgs) Handles BtnPassword.Click
'....
'....

End Sub
End Class



Mi segunda pregunta a modo de tema de Seguridad. Las bases de datos con Access 2010 veo que están cifradas y puedes poner una contraseña como el ejemplo que tengo de hasta 20 caracteres. ¿Es posible mediante programas externos aunque sean de pago romper esa seguridad y acceder a la base de datos Access?
Si es así se me ocurre poner la base de Access en un recurso compartido oculto con el $ al final y desde Visual Basic que es el programa que va a los usuarios acceder por programación y así nunca saben donde se esconde la base de Access. Aunque la empresa donde estoy no hay mucho listo que digamos pero siempre es bueno poner la máxima seguridad ante datos personales.

Si alguien sabe como programar por código la primera pregunta se lo agradezco mucho, naturalmente para cambiar una contraseña por Access hay que abrirla en modo exclusivo. En caso contrario lo haría desde Access y luego volviendo a compilar el proyecto, pero ya me gustaría hacerlo todo automático tal y como se hacía en Access97 hace mucho tiempo cuando programaba con VB6 y DAO.

Muchas gracias
Saludos
#36
Muy bueno tu código Lekin, he probado lo del separador, no se me había ocurrido puesto que como te comente el control MenuStrip lo cree en modo diseño y sólo la parte que me hacía falta por código, por eso "MnuRepasoSuma" procede de un nombre del MenuStrip (diseño). Si tuviera que programarlo por código todo sería muy extenso porque cambio propiedades de name, font, checked, pongo imágenes de iconos... y creo que eso sería mejor hacerlo en una clase o un módulo que no se muy bien para hacer una array de controles que se utilice para cuando necesitemos llamarlo como antes se hacía con VB6.

Como mencioné solo faltaría aplicar el método Dispose, he leido algo pero veo que no me hace falta aplicarlo porque los objetos los empleo en el Formulario principal y estos se liberan en el archivo "Form1.Designer.vb" al finalizar el Form. Aunque no se si al salir debería llamar al Objeto.Dispose() para liberar por si acaso el GC (Garbage Collector) no los libera bien los recursos.

Si empleara alguna clase o módulo donde genere los objetos veo que si hay que implementar el método Dispose, que la verdad sería otro tema a tratar y extenso, donde las explicaciones de Microsoft las veo muy complicadas de entender y tendría que ponerme a ello, cosa que de momento para mi programa no necsito.

Excelente tus aportaciones y con el menú contextual. Este Visual Basic se parece cada vez más a Visual C, no tengo nada en contra pero para mi pienso que todo lo que se pueda realizar por diseño te ahorras trabajo y si hay que emplear mucho código es mejor crearte tus clases o módulos para no ser repetitivo por tanto no debería haber desaparecido la forma antigua de llamar a los array de controles y eso debería haberse implementado en Visual Basic 2013.

Muchas gracias por todo y mis nuevas preguntas iran al foro net
#37
Pongo el código que ya he probado y funciona el evento Click, he cambiado algunas cosas puesto que primero el control MenuStrip lo creo en tiempo de diseño, tengo muchos menús ya creados y submenús y ponerlo todo en código es más lioso.

Solo pongo en código los 3 submenus que tienen varias opciones y que desembocan todos en un mismo click donde solo cambio una variable RE.

Código (vbnet) [Seleccionar]

Private Prueba(2) As ToolStripMenuItem             'Declaro Array de elementos

'Pongo los elementos en el submenú correspondiente y los agrego, además del evento Click
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     Prueba(0) = New ToolStripMenuItem("Numero1")
     Prueba(1) = New ToolStripMenuItem("Numero2")
     Prueba(2) = New ToolStripMenuItem("Numero3")
     For I = 0 To 2
          MnuRepasoSuma.DropDownItems.Add(Prueba(I))
          AddHandler Prueba(I).Click, AddressOf EventoMenu
     Next I
End Sub

Private Sub EventoMenu(ByVal sender As System.Object, ByVal e As System.EventArgs)
     Dim Index As Integer = Array.IndexOf(Prueba, sender) 'Obtiene índice control seleccionado
     Form2.Close()
     TAB = "SUMAR" : RE = Index + 1
     Form2.Show()
End Sub


Naturalmente tendre que utilizar for..next para añadir propiedades restantes, como dije seguramente genere una Clase con el procedimiento de declarar array y añadir propiedades y controles.

Una última pregunta, aunque funciona bien hay que utilizar el método Dispose, he leido algo que es como el Unload Me, pero no se muy bien como codificarlo y si al emplear algún Procedimiento hay que liberar objeto y en el código que tengo donde habría que colocarlo o bien al ser un código simple no hace falta y ya se libera todo cuando se cierra el programa?

Gracias y salu2
#38
Gracias Lekim, lo primero desconocía que hubiera un subforo para .net en Programación general, a partir de ahora expongo mis preguntas ahí.

De momento solo programo con Windows Form, lo adapté todo para trabajar con Windows Form, incluso la apariencia porque ya de por sí es difícil pasar de VB6 a Visual Basic 2013, como para ponerse a programar con WPF, más bonito con web, gráficos... pero prefiero lo que ya sabía y adaptarlo, además en los programas utilizo la versión .Net Framework 3.5 para que tenga compatibilidad con XP porque tengo compañeros que utilizan todavía ese SO.

Estoy probando tu código del Label, cambiándolo por un botón y desconocía como agregar eventos a una matriz de controles.

Código (vbnet) [Seleccionar]
AddHandler LabelArray(I).Click, AddressOf LabelArray_Click

y el cómo llamar a ese evento Click o naturalmente el que pongas añadiendo  a AddHandler y comparándolo con una variable como antes se hacía con Index.

Código (vbnet) [Seleccionar]

Private Sub LabelArray_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
   'Obtiene el índice del control seleccionado
   Dim Index As Integer = Array.IndexOf(LabelArray, sender)
    If Index.Equals(0) Then LabelArray(0).Text = "HOLA"
End Sub


A todo esto se me ocurre añadir una clase o módulo, de forma que las matrices de controles no tengan definido el número de array "Dim LabelArray() As Label" y luego dimensionarlas desde el programa principal "LabelArray = New Label (NumTotal  - 1) {}" donde pongamos en la variable "NumTotal" el número de elementos que vayamos a utilizar. Veo que hay que ir haciendo procedimientos para ahorrarnos código que antes con dos pulsaciones podíamos hacer.

Voy a probar para mi programa añadiendo los elementos ToolStripMenuItem por código, seguramente genere un procedimento dentro del Formulario principal y más adelante ya crearé un módulo para ir acoplando distintos Controles de arrays y así intentar en mis programas que la utilización sea parecida como antes con VB6 e index.

MUCHAS GRACIAS, si me surge algún problema contestaré por aqui; pero lo dicho las nuevas preguntas lo haré por el foro NET.
#39
Buenos días, veo que en VB6 teníamos la propiedad Index y cuando creabamos una matriz de controles te preguntaba si ponías el mismo nombre VB "Desea crear una matriz de controles...?", asi cuando empleabas el mismo evento Click solo hacía referencia al pulsado por la propiedad Index.

Eso es lo que preciso en mi programa, tengo un menú bastante extenso y ya cambiado muchas cosas y solo tengo 2 submenus que hacen referencia según lo que pulsas a un mismo código, repito por tanto un total de 20, este código.

Código (vbnet) [Seleccionar]

Private Sub MnuRepasoSuma1_Click(sender As Object, e As EventArgs) Handles MnuRepasoSuma1.Click
       Form2.Close()
       TAB = "SUMAR" : RE = 1
       Form2.Show()
End Sub

Private Sub MnuRepasoSuma2_Click(sender As Object, e As EventArgs) Handles MnuRepasoSuma2.Click
       Form2.Close()
       TAB = "SUMAR" : RE = 2
       Form2.Show()
End Sub

Private Sub MnuRepasoSuma3_Click(sender As Object, e As EventArgs) Handles MnuRepasoSuma3.Click
       Form2.Close()
       TAB = "SUMAR" : RE = 3
       Form2.Show()
End Sub
...
...


Y así 20 veces, requiero por tanto algo parecido a la matriz, pero claro no voy a crear todo el MenuStrip por código porque es muy extenso, con muchas propiedades, colores, checked, font... y tardo mucho más y quería saber si se puede agrupar un mismo evento de pulsaciones de Click, como antes se hacía con Index para aprovechar un mismo codigo y que sólo cambio una variable que es RE que según lo pulsado antes se podía jugar con esa variable Index en VB6.

Requiero hacer lo mismo pero en VB2013, haber si hay alguna forma sin la de crear todo el menú con los submenus porque sino lo dejo asi (copiar y pegar) aunque no lo veo bien. Por eso me imagino que debe existir alguna forma de agrupar eventos y que se sepa cuando pulsas el 1, el 2, el 3 y que todo vaya a un mismo evento Click.

Muchas gracias y como siempre seguiré mirando a ver si veo alguna solución.

#40
Al final utilizaré este código y con el evento Paint, es lo que más se asemeja al print de antes. No utilizo etiquetas, ni label puesto que voy a utilizar Formularios MDI y tendría que estar realizando más código y no por diseño, además de que solo van a ser listas al igual que si imprimes. Si fuera un solo Formulario si lo haría.

Código (vbnet) [Seleccionar]
[code=vbnet]

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        Dim Suma As Integer = 15
        Dim A As Integer
        For A = 0 To 9
            e.Graphics.DrawString("La suma es = " & Suma + A, New Font("Tahoma", 12, _
           FontStyle.Bold), Brushes.Black, New Point(50, 10 + (A * 20)))
        Next A
End Sub
[/code]

Esta es la SOLUCIÓN que veo. Gracias a todos y al foro.