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ú

Temas - Tazmania40

#1
Buenas estoy realizando un programa y me veo atascado en un evento por código, de momento no encuentro nada pero sigo buscando, a ver si alguno me da la solución antes.

Pongo el siguiente ejemplo y es lo mismo que deseo que funcione con las matrices de 2 dimensiones en Visual Basic 2013.

Código (vbnet) [Seleccionar]

Private Lista(4) As PictureBox

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       For A = 0 To 4
           Lista(A) = New PictureBox                       ' Creamos una nueva instancia
           Lista(A).Size = New Size(32, 32)                ' Tamaño PictureBox
           Lista(A).BorderStyle = 1                        ' Dibuja borde
           Lista(A).Location = New Point(A * 32 + A, 50)   ' Posicionamos PictureBox
           Me.Controls.Add(Lista(A))                       ' Añadimos al Formulario
           AddHandler Lista(A).Click, AddressOf Evento1    ' Agregamos evento Click
       Next A      
End Sub

Private Sub Evento1(sender As Object, e As EventArgs)
       Dim Index As Integer = Array.IndexOf(Lista, sender) ' Obtenemos el índice seleccionado
       MsgBox("Has pulsado " & Index + 1 & " recuadro.")
End Sub


El código de arriba muestra 5 controles de tipo PictureBox como un array, puesto que en NET no se
podía realizar mediante diseño, al hacer click en cualquiera de ellos obtenemos el índice del
que hemos pulsado y así podemos utilizar las propiedades de cada uno de ellos.

Siguiendo con el ejemplo, me gustaría lo mismo para una matriz de 2 dimensiones que la dibujo
perfectamente, pero cuando asigno el evento Click no se que emplear para obtener el índice
puesto que Array.IndexOf es para matrices unidimensionales ¿Como puedo obtener el índice de
una matriz de 2 dimensiones, (0,0) (0,1) (0,2).. (1,0)..etc, al hacer click sobre cada recuadro
PictureBox ? Muchas GRACIAS y saludos

Código (vbnet) [Seleccionar]

Private Matriz(2, 3) As PictureBox                      ' Matriz de 3x4 elementos
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load      
       
       ' Dibujamos matriz bidimensional de 3 filas y 4 columnas
       For F = 0 To 2                                         ' Recorre las Filas
           For C = 0 To 3                                     ' Recorre las Columnas
               Matriz(F, C) = New PictureBox
               Matriz(F, C).Size = New Size(32, 32)
               Matriz(F, C).BorderStyle = 1
               Matriz(F, C).Location = New Point(C * 32 + C, F * 32 + F + 100)
               Me.Controls.Add(Matriz(F, C))
               AddHandler Matriz(F, C).Click, AddressOf Evento2
           Next C
       Next F
   End Sub

   Private Sub Evento2(sender As Object, e As EventArgs)
       ' Fallo porque Array.IndexOf  es para matrices de 1 sola dimensión
       Dim Index As Integer = Array.IndexOf(Matriz, sender)
       '...
   End Sub

#2
Buenas, estoy con una parte de código que no consigo traducir a VB.net, en C# funciona sin problemas. He utilizado el conversor http://converter.telerik.com pero se ve que ya no funciona, también otros conversores online pero dan problemas o el código escrito no compara correctamente la colisión, ya que se trata de colisiones entre 2 objetos por pixel.

Si podéis echarme una mano tan solo con este código o bien algún conversor que funcione correctamente de C# a VB.NET

Código (csharp) [Seleccionar]

if (((bitsA[(x - texture1Rectangle.X) + (y - texture1Rectangle.Y) * texture1Rectangle.Width] & 0xFF000000) >> 24) > 20 &&
   ((bitsB[(x - texture2Rectangle.X) + (y - texture2Rectangle.Y) * texture2Rectangle.Width] & 0xFF000000) >> 24) > 20)
                    {
                        PorColisionPixel = true;
                        ...
                    }


El fallo se presenta en el operador de desplazamiento o número hexadecimal.
Como nota decir que el código lo estoy realizando con XNA 4.0 en Visual Basic 2013, donde ya realicé el programa en XNA 4.0 con C# funcionando correctamente la colisión por pixel y es ahora donde he traducido todo el programa y solo me falta esta parte de código que no consigo que funcione en VB.net.

Muchas gracias y saludos

#3
Buenas, estoy intentando traducir un ejemplo de C# para XNA donde trata una colisión por píxel entre 2 rectángulos. En C# para XNA me funciona correctamente, pero en VB2013 que también permite la librerias de XNA y ya he realizado varios programas sin problemas, tiene las mismas sentencias solo que cambia la sintaxis. Paso el código y en negrita donde muestra el problema, la línea del error es "Player.GetData(texturaPlayer), me imagino que este método lo que hace es copiar todos los colores de la textura. Estoy probando de muchas formas, inicializando  la instancia de todos los array y no doy con ello.

Mensaje de error al ejecutar: "The size of the data passed in is too large or too small for this resource."

Código (vbnet) [Seleccionar]

Private Player As Texture2D
Private rectPlayer As Rectangle
Private texturaPlayer() As Color

Protected Overrides Sub LoadContent()
' Carga textura Jugador 1 y copia el total número colores
Player = Content.Load(Of Texture2D)("Imagenes\Sprite1")
ReDim texturaPlayer(Player.Width * Player.Height)
Player.GetData(texturaPlayer)
...

End Sub


a la función que llamo luego es:
Código (vbnet) [Seleccionar]

If intersectPixel(rectPlayer, texturaPlayer, rectRoca, texturaRoca) Then
...


El código en C# para XNA donde funciona sin problemas es:
Código (csharp) [Seleccionar]

Texture2D Player;                               // Sprite del Jugador1
Rectangle rectPlayer;                          // Rectángulo Jugador1 (colisión)
Color[] texturaPlayer;                         // Colores Jugador1

protected override void LoadContent()
{
// Carga textura Jugador 1 y copia el total numero colores
Player = Content.Load<Texture2D>("Imagenes/Sprite1");
texturaPlayer = new Color[Player.Width * Player.Height];
Player.GetData(texturaPlayer);
...

}


Muchos pensaréis que porque no lo programo en C# para XNA y aunque lo entiendo, soy de los que le gusta seguir con el mismo lenguaje y el juego que estoy realizando lo quiero hacer en Visual Basic 2013 con XNA.

A ver si hay alguien que me pueda echar una mano y así poder continuar con el juego, suelo empezar por lo que me resulta más difícil e intento resolver mediante pequeños ejemplos todas las posibles dificultades antes de comenzar el proyecto.

Muchas gracias y saludos
#4
Buenas estoy intentando simplificar este código, en concreto lo que aparece entre comentarios. El código me funciona pero deseo reprentar los datos mediante una lista en una sola línea, o tupla como lo llaman... estoy probando con {} tal y como lo hago con los array o matrices, pero no doy con ello, alguna sugerencia. Gracias y salu2

Código (vbnet) [Seleccionar]

Private Structure Cord
   Public X, Y as Integer
End Structure

Private Structure Obj
   Public PosA as Cord
   Public PosR() as Cord
End Structure


Private Obj1 As Obj        ' Declaramos un Objeto de la estructura Obj
ReDim Obj1.PosR(2)       ' Definimos la matriz de la estructura a 3 valores

' -------- Esto funciona, deseo simplificar algo estilo
' Obj1 = { {10, 20}, { {5, 3}, {7, 9}, {1, 4} } }

Obj1.PosA.X = 10 : Obj1.PosA.Y = 20
Obj1.PosR(0).X = 5 : Obj1.PosR(0).Y = 3
Obj1.PosR(1).X = 7 : Obj1.PosR(1).Y = 9
Obj1.PosR(2).X = 1 : Obj1.PosR(2).Y = 4

' ----------------------------------------
' Representar esta parte mediante una línea, tupla o como se haga en
' Visual Basic 2013

Procedimiento(Obj1)      ' Pasar el procedimiento con el Objeto

#5
Buenas esto es a modo de consulta, ya que veo ultimamente que antivirus como Avast tienen una nueva tecnología llamada CyberCapture y claro aquellos programas que publicas que encima son de forma desinteresada y lo haces para compartir pues si ya te ponen impedimentos para que la gente no se los baje porque salte el antivirus, los bloquee, diga que están siendo estudiados por laboratorio...

He tenido que poner comentarios para que desactiven dicha opción, hacer video-tutoriales de canal YouTube para dar más confianza de que los programas que realizas no son maliciosos, en fin que parece que aquellos que tienen esto de la programación como un hobby se tenga que convertir casi como un empresa pero sin facturar...

Quería información si alguien más profesional ha firmado sus proyectos, si ha solicitado un certificado a la casa de la moneda, según tengo entendido tienen que ser con la extensión PFX puesto que lo que quería sería ensamblarlo con el ejecutable y que luego en firmas digitales apareciese el autor y que naturalmente la entidad fuese la casa de la moneda. ¿Esto sería como persona física?, ¿Que pasos exactos habéis seguido si alguien lo ha realizado?, tengo la página

https://www.sede.fnmt.gob.es/certificados

donde me iré informando, pero yo no deseo un certificado para asuntos de trámites de multas, hacienda, etc, sino un certificado para autenticar mis programas con firma digital y saber si eso elimina de los antivirus, por lo menos confian y te permiten elegir si ejecutar, no se, totalmente desconozco esto y lo único que me gusta en programar y compartir, no trabajo en programación, pero parece que cada vez los pequeños programadores se lo ponen difícil para compartir su hobby.

Cree un canal Youtube para dar más confianza con respecto a mis programas. Al final uno va a programar para si mismo y su familia y ya está, así menos quebraderos de cabeza, porque empieza programando y luego tiene que aprender alojar información web, crear canal youtube, diseño de gráficos, sonido, etc

Gracias y saludos
#6
Buenas a todos/as, quería saber si hay alguna manera sencilla de saber el tipo de procesador y velocidad de este para asignar la información a una variable (integer) por ejemplo y así poder aumentar la velocidad o disminuir de un juego que estoy programando.
Busco código o información para Windows Forms. El tema de WMI (Windows Management Instrumentation) no lo entiendo y aparecen errores en ejemplos de Microsoft.

Si puede ser como digo algo sencillo del tipo...

Código (vb.net) [Seleccionar]

MsgBox(My.Computer.Info.OSVersion)
MsgBox(My.Computer.Info.OSPlatform)
...


Naturalmente sin utilizar DirectX. Seguiré buscando por si veo algo que me convenza, si lo encuentro lo pondre aquí el código.

Gracias y saludos
#7
Buenas a todos, estoy intentando mejorar el tema de movimientos de Sprites, puesto que lo utilizado hasta ahora todavia veo reflejo, aún poniendo DoubleBuffered = True en el Formulario y buscando información y probando veo que la mejor forma es utilizando "Protected Overrides Sub OnPaint". Naturalmente con DirectX o OpenGL sería otra cosa, pero no tengo ni idea.
Pongo código y lo explico (programa compilado con .NET Framework 4.0)

Código (vb.net) [Seleccionar]

Imports System.Threading

Public Class Form1

' Tenemos un fondo de pantalla jpg 800x600 y dos imágenes transparentes png 50x50
' DECLARACIONES de los Objetos

Private Grafico As Graphics         ' Declaramos Objeto principal del GDI+
Private BitGrafico As Bitmap        ' Declaramos Bitmap que se copia en Objeto principal
Private Fondo As Bitmap             ' Imagen de fondo que utilizamos
Private Structure DSprite           ' Declaramos el Sprite (imagen y posición)
   Dim Imagen As Bitmap
   Dim Pos As Point
End Structure
Private Bola1, Bola2 As DSprite   ' Objetos de tipo Sprite

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   ' Cargamos los Gráficos
   Fondo = My.Resources.Tierra
   Bola1.Imagen = My.Resources.Bola
   Bola1.Pos = New Point(0, 100)
   Bola2.Imagen = My.Resources.Bola2
   Bola2.Pos = New Point(0, 300)

   ' Inicializamos los Objetos GDI+
   Grafico = Me.CreateGraphics()
   BitGrafico = New Bitmap(800, 600)
   Grafico = Graphics.FromImage(BitGrafico)
End Sub


Hasta aquí todo bien, ahora es cuando utilizo OnPaint y mi primera pregunta (más bien duda y confirmación). ¿Este evento impide que se ejecuten los demás eventos Paint? (sobre todo del Formulario), que para eso tendríamos que llamarlo con MyBase.OnPaint(e), al colocar evento te lo coloca automáticamente, por eso sino hace falta llamarlo ¿se puede eliminar? ¿Es bueno llamar a los eventos Paint de otros controles desde aquí?.
En el juego que realice no voy a llamar a ningún otro evento Paint y tan solo voy a tener gráficos en el Formulario principal, solo por confirmar.

Código (vb.net) [Seleccionar]

Protected Overrides Sub OnPaint(e As PaintEventArgs)
   MyBase.OnPaint(e)                                 ' Esto se prodría omitir ??
   Dim de As Graphics = e.Graphics
   MOVER()
   DIBUJAR(de)
   Thread.Sleep(100)                                  ' Retardo
End Sub

Private Sub MOVER()
   Bola1.Pos.X = Bola1.Pos.X + 5
   Bola2.Pos.X = Bola2.Pos.X + 10

   If Bola1.Pos.X >= 800 Then Bola1.Pos.X = 0
   If Bola2.Pos.X >= 800 Then Bola2.Pos.X = 0
   Invalidate()                                  ' Vuelva a dibujar el control
End Sub

Private Sub DIBUJAR(ByVal d As Graphics)
   d.DrawImage(Fondo, 0, 0)                ' Dibujamos el fondo de pantalla
   d.DrawImage(Bola1.Imagen, Bola1.Pos)    ' Dibujamos Sprite1
   d.DrawImage(Bola2.Imagen, Bola2.Pos)    ' Dibujamos Sprite2
End Sub
 
End Class


El programa va bien y se ve fluido (naturalmente el Formulario utilizo Doble buffer puesto que sino se ve el reflejo), pero al iniciar se ejecuta 2 veces OnPaint y aunque puedes variar el tema de coordenadas, parece que de inicio no informa bien si pongo unos label

Código (vb.net) [Seleccionar]

Label1.Text = "Obj1 PosX = " & Bola1.Pos.X
Label2.Text = "Obj2 PosX = " & Bola2.Pos.X


Estoy con pruebas y con un botón para parar. Veo que esta forma no hay que poner nada en diseño, a no ser por código porque hace cosas extrañas con las coordenadas. En principio estoy probando y mi segunda pregunta es ¿Es la forma correcta para saber el tema de coordenadas de los Sprites que coloque en Formulario? ¿Se puede mejorar algo para saber exactamente el tema de coordeandas x, y de los Sprites?

Colocare una nave y mas objetos y quería saber si me va a dar problemas con las coordenadas, la nave la muevo yo y los objetos como en el ejemplo se mueven automáticamente.
Gracias y saludos

#8
Buenas, ya estoy acabando mi proyecto y me encuentro con este problema

"ReadLines no es miembro de System.IO.File"

Se que son las Net.Framework porque el proyecto lo tengo con 3.5, pero no quiero cambiarlo a 4.0 o 4.5 (ya los próximos utilizaré esas versiones), pero en este proyecto deseo poder utilizar el programa en equipos con Windows XP.

Hay alguna otra forma de leer filas en los archivos, si tengo que utilizar otra importación o cualquier otro comando que lea filas y lo guarde en un array de texto. Tal y como aparece en el siguiente código, que repito funciona a partir de la versión Net Framework 4.0, pero yo lo requiero para la Net Framework 3.5 (en Windows Form).

Gracias y saludos


Código (vb.net) [Seleccionar]

Imports System.IO

Dim Valor(4) As String
For A = 0 To 4
    Valor(A) = File.ReadLines(ARCHIVOC)(A)           'Leer una sola línea
Next A
#9
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
#10
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
#11
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.

#12
Buenas, llevo unos meses aprendiendo Visual Basic 2013 puesto que era de al antigua escuela de Visual Basic 6 y llevaba años sin programar. Prácticamente estoy recopilando conocimientos y pasando al nuevo VB 2013 porque el código cambia mucho y una de las cosas que con más facilidad hacía con Visual Basic 6 era.

Tenía un Formulario y un botón de comando y escribía dentro del botón

Dim Suma As Integer
Suma = 5 + 15
Print ("La suma es = ", Suma)

y en el Formulario aparecía el texto escrito y el resultado de la suma, sin necesidad de usar un Label o un TextBox. Si volvía a escribir otra línea Print pues debajo y es lo que necesito para mi programa, porque quiero mostrar como 10 operaciones una debajo de otra y no quiero poner 10 TextBox, sino realizarlo con un For..Next como antes hacía, ya que van a ser un total de 8 listados de 10, eso me supone 80 TextBox y no creo que sea un programa correcto (estoy utilizando Formularios MDI).

Asi que lo que quiero es simple, al pulsar un botón que me aparezca en el Formulario principal o bien formulario secundario del MDI, el texto que ponga y la operación (variable). He mirado por internet y dicen utilizar método DrawString pero es bastante lioso y no funcionan los ejemplos (me dan error). Si hay alguna manera fácil o bien un ejemplo con DrawString declarándolo y que funcione para Visual Basic 2013 con el Botón y Formulario solamente; si hay que añadir algo más.

Muchas gracias y espero una solución de algo tan sencillo con VB6 ahora tan complicado con VB2013.