Leer una clase en un formulario Windows de Visual C#

Iniciado por Meta, 10 Junio 2015, 04:59 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

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 (csharp) [Seleccionar]
      // Los diferentes datos que obtenemos de la ROM
       public string Name;
       public byte Layout;
       public byte CartridgeType;
       public byte RomSize;
       public byte RamSize;
       public byte CountryCode;
       public byte LicenseCode;
       public byte VersionNumber;
       ushort Checksum;
       ushort ChecksumCompliment;
       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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#1
¿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!








Meta

#2
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 (csharp) [Seleccionar]
       //Open the stream and read it back.
       using (FileStream fs = File.OpenRead(path))
       {
           byte[] b = new byte[1024];
           UTF8Encoding temp = new UTF8Encoding(true);
           while (fs.Read(b,0,b.Length) > 0)
           {
               Console.WriteLine(temp.GetString(b));
           }
       }


Viendo File.ReadAllBytes. En el Form1 hice este código.
Código (csharp,27) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {

           if (openFileDialog1.ShowDialog() == DialogResult.OK)
           {
               SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(textBox_Nombre_de_archivo.Text.ToString()));
               textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
           }
       }
   }
}


Lo ejecuta efectivamente, si pulso el botón abrir, muestra este error.
CitarExcepció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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#3
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!








Meta

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 (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
            }
        }
    }
}


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 (csharp,25) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Mostar_Datos();
        }

            public void Mostar_Datos()
    {
         this.textBox_Name.Text  = RomDump.Name;
    }

        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
            }
        }
    }
}


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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#5
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 (csharp) [Seleccionar]
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 (csharp) [Seleccionar]
this.snesRom = new SnesKit.RomDump(bytes);

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

Saludos








Meta

Buenas honorable Elektro:

Para arriba y para abajo me salió esto.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.

                textBox_RomSize.Text = VARIABLE.RomSize.ToString();
            }
        }
    }
}




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 (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.

                textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
            }
        }
    }
}


Me sale la C. Quiero que salga 0C.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#7
Cita de: Meta en 10 Junio 2015, 12:56 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 (vbnet) [Seleccionar]
String.Format("0x{0}", Convert.ToString(255, toBase:=16))

Saludos!








Meta

Entendido buen hombre:

Hice este código.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar.

namespace ROM_SNES
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.

                textBox_Name.Text = VARIABLE.Name;
                textBox_Layout.Text = string.Format("{0:X}", VARIABLE.Layout);
                textBox_CartridgeType.Text = string.Format("{0:X}", VARIABLE.CartridgeType);
                textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
                textBox_RamSize.Text = string.Format("{0:X}", VARIABLE.RamSize);
                textBox_CountryCode.Text = string.Format("{0:X}", VARIABLE.CountryCode);
                textBox_LicenseCode.Text = string.Format("{0:X}", VARIABLE.LicenseCode);
                textBox_VersionNumber.Text = string.Format("{0:X}", VARIABLE.VersionNumber);
                textBox_BankType.Text = VARIABLE.BankType.ToString();
            }
        }
    }
}


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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

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

Saludos!