elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Leer una clase en un formulario Windows de Visual C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Leer una clase en un formulario Windows de Visual C#  (Leído 12,680 veces)
Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Leer una clase en un formulario Windows de Visual C#
« en: 10 Junio 2015, 04:59 am »

Buenas:

Voy a empezar desde el principio. El código lo he sacado de esta Web.

https://github.com/Zeokat/SNES-ROM-Header-Dumper-CSharp/blob/master/snes_dumper.cs

El archivo se llama snes_dumper.cs.

Creo un proyecto nuevo. Se que lo expliqué pero haré lo mismo por si acaso no me haya expresado bien o no he entendido bien. Uso Visual C# Express 2013. Hay gente que me recomienda el VS Comunity, ni sabía su existencia, no se de que va ni ventajas que tiene y no se si es gratuito como el Express, esto es otra historia.

Archivo-->Nuevo Proyecto...


A crear una clase nueva en, PROYECTO-->Agregar clase...


Le pongo el nombre de la clase llamado snes_dumper.cs, como indica abajo, luego pulso el botón Agregar.


Seañade la calse snes_dumper.cs como muestra abajo. El código generado a borrarlo.


He copiado el código que descargué en la Web de origen dentro del archivo snes_dumper.cs en el formulario como puedes ver abajo.


¿Qué es lo que quiero?

1) Con un botón leer el archivo *.smc, es una ROM, un archivo binario.
2) Lo que lea la clase snes_dumper.cs lo tiene que mostrar en sus textBox correspondiente en el Form1.

La mayoría de los datos que quiero visualizar en el TextBox son estas variables.
Código
  1.       // Los diferentes datos que obtenemos de la ROM
  2.        public string Name;
  3.        public byte Layout;
  4.        public byte CartridgeType;
  5.        public byte RomSize;
  6.        public byte RamSize;
  7.        public byte CountryCode;
  8.        public byte LicenseCode;
  9.        public byte VersionNumber;
  10.        ushort Checksum;
  11.        ushort ChecksumCompliment;
  12.        public BankTypeEnum BankType;

Hay 11 variables en el primer Cuadro en verde. Esas 11 variables es lo que tengo que leer en el textBox. La lectura lo hace a la hora de pulsar un botón, seleccionar el archivo binario a leer y lo leído, lo muestra en el formulario. Les dejo el formulario hecho estilo colores y nombrado por Cuadros 1 al 4. El que me interesa mucho es el Cuadro 1 y el Cuadro 4 para cargar el archivo binario.


Los nombres de cada textBox están identificado por el nombre de sus variables así no te perderás. Digamos que esto es una plantilla con la clase snes_dumper.cs sin hacer nada, solo a la espera de ser programado.

Les dejo aquí para descargar esta plantilla por llamarlo de alguna manera, bueno, lo llamaremos proyecto vacío.

Descarga

Espero ayuda para leer esta clase. En resumen, quiero leer las variables que indiqué arriba y lo muestre en el Formulario que he hecho arriba de colorines.

Saludos.


« Última modificación: 10 Junio 2015, 14:14 pm por kub0x » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #1 en: 10 Junio 2015, 07:39 am »

¿Y cual es el problema?, si ya tienes una Class que lo hace todo.

¿Y si en lugar de perdir que te lo hagan, mejor preguntas por lo que no entiendas de esa Class, para poder hacerlo por tus propios medios?.

Solo debes leer el archivo.smc de principio a fin para generar un array de Bytes, y pasarle esos bytes cómo argumento al constructor de la Class RomDump, el cual automaticamente llama al método ReadHeader y se asignan los valores a las propiedades de esa Class.

Es muy sencillo de realizar (en apenas 2 lineas de código), pero si no has entendido algo, especifica el que.

Te sugiero leer la documentación de los métodos de lectura de la Class System.IO.File, y la documentación de la Class System.IO.FileStream.

PD: Deja los copy/paste, ¡intenta aprender!.

Saludos!


« Última modificación: 10 Junio 2015, 07:44 am por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #2 en: 10 Junio 2015, 08:22 am »

Buenas campeón:

Buscando el IO.Stream encontré códigos de ejemplo como este.

Me interesa leer, no modificar, al menos por ahora. Supuestamente es este por lo que veo.
Código
  1.        //Open the stream and read it back.
  2.        using (FileStream fs = File.OpenRead(path))
  3.        {
  4.            byte[] b = new byte[1024];
  5.            UTF8Encoding temp = new UTF8Encoding(true);
  6.            while (fs.Read(b,0,b.Length) > 0)
  7.            {
  8.                Console.WriteLine(temp.GetString(b));
  9.            }
  10.        }

Viendo File.ReadAllBytes. En el Form1 hice este código.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.        }
  21.  
  22.        private void button1_Click(object sender, EventArgs e)
  23.        {
  24.  
  25.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  26.            {
  27.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(textBox_Nombre_de_archivo.Text.ToString()));
  28.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  29.            }
  30.        }
  31.    }
  32. }

Lo ejecuta efectivamente, si pulso el botón abrir, muestra este error.
Citar
Excepción no controlada del tipo 'System.ArgumentException' en mscorlib.dll

Información adicional: No se puede dejar vacío el nombre de la ruta de acceso.

Encontré lo que dice del System.ArgumentException. Ahí no entiendo nada.

Estoy haciendo pruebas por si acaso. :)

Dejo lo que hice en este enlace.

Descarga Proyecto alfa v0.3. (incluye una rom de 4 MB).

Saludos.
« Última modificación: 10 Junio 2015, 08:28 am por Meta » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #3 en: 10 Junio 2015, 09:27 am »

Con el mensaje de error puedes deducir que la propiedad 'Text' del control 'textBox_Nombre_de_archivo' está vacía, ya que le estás pasando un argumento vacío a la función 'Readallbytes', y esto significa que estás intentando utilizar dicha propiedad antes de haberle asignado ninguna ruta de archivo.

Utiliza la propiedad 'FileName' de la instancia de ese diálogo 'OpenFileDialog'.

Saludos!
« Última modificación: 10 Junio 2015, 09:32 am por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #4 en: 10 Junio 2015, 11:04 am »

Hola Señor:

Lo he hecho así, me ejecuta, no da problemas, no se si realmente así funciona. Ahora te toca hacer algo como esto a ver que tal.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.        }
  21.  
  22.        private void button1_Click(object sender, EventArgs e)
  23.        {
  24.  
  25.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  26.            {
  27.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
  28.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  29.            }
  30.        }
  31.    }
  32. }
  33.  

Ahora estoy bien perdido para leer la variable Name del archivo Snes_dumper.cs.
Usando este otro código, no logro de ninguna manera leer algo de la ROM, al menos el nombre.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.            Mostar_Datos();
  21.        }
  22.  
  23.            public void Mostar_Datos()
  24.    {
  25.         this.textBox_Name.Text  = RomDump.Name;
  26.    }
  27.  
  28.        private void button1_Click(object sender, EventArgs e)
  29.        {
  30.  
  31.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  32.            {
  33.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
  34.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  35.            }
  36.        }
  37.    }
  38. }

Error   1   El nombre 'RomDump' no existe en el contexto actual   C:\Users\Usuario\Documents\Visual Studio 2013\Projects\ROM_SNES\ROM_SNES\Form1.cs   25   36   ROM_SNES

Da igual lo que haga, aquí si estoy perdido. Intento leer la classe pero no lo capto.

Saludos.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #5 en: 10 Junio 2015, 11:26 am »

Meta, fíjate bien en lo que estás haciendo ...leches xD.

La Class "RomDump" la estás declarando e instanciando en el bloque del event-handler "button1_Click", ahí es donde empieza y donde también termina la vida de ese objeto;
luego, tú estás haciendo un (mal) intento de leer esa instancia en otro método distinto, en el bloque del método "Mostar_Datos", no puedes leer una referencia que no existe.

1. Declara una variable 'snesRom' hacia una referencia vacía de la Class 'RomDump', fuera de cualquier método.
Código
  1. SnesKit.RomDump snesRom

2. Crea una instancia la Class 'RomDump' a la variable 'snesRom', dentro del handler "button1_Click" o dentro del método que prefieras.
Código
  1. this.snesRom = new SnesKit.RomDump(bytes);

3. Ya puedes leer la referencia de la propiedad 'snesRom.Name' donde quieras:
Código
  1. MessageBox.Show(snesRom.Name);

Saludos
« Última modificación: 10 Junio 2015, 11:42 am por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #6 en: 10 Junio 2015, 12:56 pm »

Buenas honorable Elektro:

Para arriba y para abajo me salió esto.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.        }
  21.  
  22.        private void button1_Click(object sender, EventArgs e)
  23.        {
  24.  
  25.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  26.            {
  27.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
  28.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  29.  
  30.                textBox_RomSize.Text = VARIABLE.RomSize.ToString();
  31.            }
  32.        }
  33.    }
  34. }



Auí hay una Web perfecta para convertir códigos.
https://www.easycalculation.com/hex-converter.php

O verlo directamenta la tabla ASCII.
http://www.elcodigoascii.com.ar/codigo-americano-estandar-intercambio-informacion/codigo-ascii.gif

El 12 que presenta es decimal, quiero se se vea hexadecimal, que es 0C. (En C# se presenta así 0x0C).

Busqué aquí.
https://msdn.microsoft.com/es-es/library/bb311038.aspx?f=255&MSPPError=-2147217396

Este es el código que hice.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.        }
  21.  
  22.        private void button1_Click(object sender, EventArgs e)
  23.        {
  24.  
  25.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  26.            {
  27.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
  28.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  29.  
  30.                textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
  31.            }
  32.        }
  33.    }
  34. }
  35.  

Me sale la C. Quiero que salga 0C.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #7 en: 10 Junio 2015, 13:37 pm »

Auí hay una Web perfecta para convertir códigos.
https://www.easycalculation.com/hex-converter.php

O verlo directamenta la tabla ASCII.
http://www.elcodigoascii.com.ar/codigo-americano-estandar-intercambio-informacion/codigo-ascii.gif

El 12 que presenta es decimal, quiero se se vea hexadecimal, que es 0C. (En C# se presenta así 0x0C).

No necesitas recurrir a ningún servicio online ni tabla de caracteres, la librería de clases de .Net Framework tiene varias funciones built-in para llevar a cabo ese tipo de conversiones.

Convert.ToInt32 Method - MSDN
Convert.ToString Method - MSDN
Convert.ToChar Method - MSDN
y:
String.Format Method - MSDN

PD: Fíjate en el parámetro 'fromBase' de los overloads de la función Convert.ToInt32, y el parámetro 'toBase' de los overloads de la función Convert.ToString.

Ejemplo:
Código
  1. String.Format("0x{0}", Convert.ToString(255, toBase:=16))

Saludos!
« Última modificación: 10 Junio 2015, 13:47 pm por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #8 en: 10 Junio 2015, 13:44 pm »

Entendido buen hombre:

Hice este código.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO; // No olvidar.
  12.  
  13. namespace ROM_SNES
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        public Form1()
  18.        {
  19.            InitializeComponent();
  20.        }
  21.  
  22.        private void button1_Click(object sender, EventArgs e)
  23.        {
  24.  
  25.            if (openFileDialog1.ShowDialog() == DialogResult.OK)
  26.            {
  27.                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
  28.                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
  29.  
  30.                textBox_Name.Text = VARIABLE.Name;
  31.                textBox_Layout.Text = string.Format("{0:X}", VARIABLE.Layout);
  32.                textBox_CartridgeType.Text = string.Format("{0:X}", VARIABLE.CartridgeType);
  33.                textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
  34.                textBox_RamSize.Text = string.Format("{0:X}", VARIABLE.RamSize);
  35.                textBox_CountryCode.Text = string.Format("{0:X}", VARIABLE.CountryCode);
  36.                textBox_LicenseCode.Text = string.Format("{0:X}", VARIABLE.LicenseCode);
  37.                textBox_VersionNumber.Text = string.Format("{0:X}", VARIABLE.VersionNumber);
  38.                textBox_BankType.Text = VARIABLE.BankType.ToString();
  39.            }
  40.        }
  41.    }
  42. }
  43.  

Me salió este resultado. En los demás txtBox vacíos, no tengo la menor idea de como lograrlo, me machaqué las neuronas un poco por esta tontería.


El Cuadro 3 Azul si me sale, estaba haciendo pruebas, los demás no.

Saludo.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Leer una clase en un formulario Widnows de Visual C#
« Respuesta #9 en: 10 Junio 2015, 13:51 pm »

El formato que le das al string es incorrecto, lee el ejemplo que he añadido en mi última respuesta.

Saludos!
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer Texto de un archivo TXT y pasarlo a un Formulario
Programación Visual Basic
washandwear 6 9,453 Último mensaje 1 Octubre 2006, 13:25 pm
por _Sergi_
Como acceder a controles de un formulario desde otra clase?
.NET (C#, VB.NET, ASP)
Rakzo-Fimbres 5 16,231 Último mensaje 22 Julio 2008, 21:13 pm
por Rakzo-Fimbres
comunicacion entre clase y formulario
PHP
mag55 6 6,200 Último mensaje 10 Noviembre 2009, 22:28 pm
por Kasi
Posible leer un archivo en kiloBytes con la clase RandomAccessFile
Java
cyberserver 0 2,378 Último mensaje 5 Diciembre 2009, 09:23 am
por cyberserver
Enviar datos de un formulario de una pagina JSP a una clase.
Java
h3ct0r 3 8,145 Último mensaje 22 Febrero 2011, 20:07 pm
por h3ct0r
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines