Jump to content

susodicho

Warianos
  • Posts

    128
  • Joined

  • Last visited

  • Days Won

    4

Everything posted by susodicho

  1. :mmm: No sé si entendí bien, pero parece que no tienes claro cómo guardar los valores que se pasan como parámetros al constructor de una clase. Si es eso, tienes que usar una variable privada para guardar el valor que te interesa. O sea: public class Rectangulo { private int ancho, alto; private String color; public Rectangulo(int Ancho, int Alto, String Color) { ancho = Ancho; alto = Alto; color = Color; } public int getAncho() { return ancho; } }
  2. :mmm: Parece que te enredaste un poco...Lo que yo propuse era en caso que no fueras a cambiar el tipo de VARCHAR a DATE. Si lo cambiaste a DATE, no hay necesidad de acomodar cosas o hacer algún truco...simplemente usas el formato de fecha de MySQL. No es lo mismo "20120614" que "2012-06-14" ó "2012/06/14". La primera forma sólo usa dígitos, las otras 2 usan dígitos y caracteres separadores ("-" ó "/"). Cuando usas campos de tipo DATE, lo más probable es que el conector o las herramientas con interfaz gráfica que usan la base de datos, muestren las fechas de acuerdo a la configuración regional del sistema. Es decir, para Chile, las fechas en formato corto creo que se muestran como "14-06-2012", pero en equipos gringos quizás se muestren como "6/14/2012". Pero el formato que usa MySQL para sus consultas es "2012-06-14". Lo de usar DATE_FORMAT es sólo para comodidad, así puedes escribir las fechas en formato chileno (DD-MM-YYYY) y no tener que usar el formato de MySQL (YYYY-MM-DD) que podría ser poco cómodo o podría inducir a errores. OJO: El método DateTime.ToShortDateString() usa la configuración regional del sistema para expresar la fecha, así que los resultados no necesariamente serán los mismos dependiendo del idioma y/o el país del equipo en el que se ejecute. Por ejemplo, este método puede dar cadenas distintas si se ejecuta en un equipo configurado para España y uno configurado para Chile. Así que mejor sería usar una conversión directa a formato de fecha MySQL (y no confiar en que ToShortDateString devolverá siempre el mismo tipo de cadena). Así que creo que las Label que estás usando, las mantienes, pero sólo para mostrar las fechas al usuario. Para realizar las consultas SQL (SELECT, INSERT, UPDATE) usa el formato de fecha de MySQL. Este método te puede servir: Public Shared Function ToMySQLDate(fecha As Date) As String ToMySQLDate = String.Format("{0:D4}-{1:D2}-{2:D2}", fecha.Year, fecha.Month, fecha.Day) End Function Si cambiaste el o los campos a DATE, tendrías que hacer la consulta más o menos así: SELECT campo1,campo2 FROM alumcertiemitido WHERE fechaemitido BETWEEN '" & ToMySQLDate(fecha1) & "' AND '" & ToMySQLDate(fecha2) & "'" ...se supone que en las variables fecha1 y fecha2 tienes las fechas inicial y final que calculaste a partir del DateTimePicker.
  3. :mmm: Si quieres dejar tu base de datos tal cual y no tener que cambiar el tipo de dato de VARCHAR a DATE, se debería poder hacer una consulta como la que quieres, sólo tienes que guardar la fecha de forma conveniente. O sea, si guardas las fechas como VARCHAR de la forma "YYYYMMDD", se pueden comparar fechas y verificar rangos de fechas. Por ejemplo, mira las siguientes cadenas: "20031225" > "20030918" ...que, en palabras, sería "La navidad del 2003 es mayor que las fiesta patrias del 2003", y que en rigor debería interpretarse como "La navidad del 2003 es posterior a las fiestas patrias del 2003" :tonto: Obviamente, es aun más conveniente guardar las fechas de la forma "YYYYMMDD" en un tipo de dato entero (es más eficiente). Es decir, podrías haber declarado el campo como INT4 (o como sea que se llame en MySQL) y expresar la fecha de hoy (14 de junio del 2012) como el número entero 20120614 (20 y tantos millones). Ojo, debes tener en cuenta que el formato "YYYYMMDD" debe ser con ceros a la izquierda en caso de ser necesario, o sea, la fecha de hoy no se puede expresar como "2012614" :no: (falta un cero a la izquierda del 6).
  4. El largo del arreglo A es mayor o igual al largo de M; por lo tanto, el ciclo for se pasa de largo, porque estás usando la longitud de A para recorrer el arreglo M :tonto: Además tienes que usar if...else (tú estás usando 2 if), o sea: if (m[i] != 10){ // copiar valor desde arreglo M } else{ // En caso contrario (m[i] es igual a 10) // insertar un 1 // copiar valor desde arreglo M // insertar un 0 } Lo otro, tienes que usar un índice para cada arreglo, es decir, el índice del ciclo for te sirve para recorrer el arreglo M, y necesitas otro índice para ir asignándole valores al arreglo A. Además recuerda que el arreglo A está "vacío", así que sólo debes asignarle valores dentro del ciclo for, no consultar si algún elemento tiene determinado valor (ya que no han sido asignados todavía).
  5. :mmm: Si entendí bien, estás recién comenzando a ver arreglos en Java. Si es así, entonces no creo que tengas que utilizar la clase ArrayList, sino sólo arreglos comunes. Así que, según yo, deberías hacerlo en 2 pasos: Recorrer el arreglo M y contar cuántos valores iguales a 10 hay. Sabiendo cuántos valores son iguales a 10, puedes declarar el nuevo arreglo A (sabes cuántos elementos tendrá). y ahora puedes empezar a asignarle los valores al nuevo arreglo A, o sea, le vas copiando los valores desde el arreglo M. Porsiaca, el largo del arreglo A será: LARGO(A) = LARGO(M) + (OCURRENCIAS * 2) donde OCURRENCIAS es cuántos valores iguales a 10 encontraste en el arreglo M.
  6. Este código hace algo parecido a lo que necesitas, así que no deberías tener problemas para modificarlo: Public Class Form1 Private dias() As String = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"} Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim fecha As Date Dim cont As Integer = 0 If DateTimePicker1.Value < DateTimePicker2.Value Then fecha = DateTimePicker1.Value While fecha < DateTimePicker2.Value ListBox1.Items.Add(fecha.ToShortDateString()) fecha = fecha.AddDays(7) cont = cont + 1 End While MessageBox.Show(String.Format("Hay {0} días que caen {1}", cont, dias(fecha.DayOfWeek))) End If End Sub End Class El ejemplo toma la fecha inicial y le va sumando una semana hasta llegar a la fecha más próxima a la final.
  7. :mmm: Veo varios detalles: En los métodos meter y mostrarpos recorres la matriz completa. No hay necesidad de hacer eso; de hecho, es muy ineficiente. Es conveniente especificar explícitamente la visibilidad de los atributos de una clase, o sea, a la variable matriz deberías anteponerle la palabra clave private. Deberías agregar 2 métodos: leer y modificar. De hecho, son los 2 primeros métodos que te piden en el enunciado :tonto: . Estarían definidos así: public int leer(int x, int y) { // etc. } public void modificar(int x, int y, int valor) { // etc. } El método que suma 2 matrices debería ser static, o sea, debería estar definido así: public static Matriz sumar(Matriz mat1, Matriz mat2) { // etc. } Al definirlo de esta forma, tendrías que usar los métodos leer y modificar para realizar la suma, ya que desde un método estático no vas a poder acceder a la variable matriz (que es una variable de instancia). Además la variable local que usas, nuevaMatriz, sería de tipo Matriz. Por si acaso, cuando pides el ingreso de datos al usuario, queda mejor usar Console.Write. O sea: Console.Write("Ingrese número: "); valor = Convert.ToInt32(Console.ReadLine()); Así el cursor queda justo a la derecha (y no al comienzo de la siguiente línea). A los métodos meter y mostrarpos deberías quitarle la parte donde recorres la matriz completa y dejarle las partes donde pides el ingreso de datos al usuario; una vez que tienes los datos, llamas a leer o modificar (o sea, llamas a estos métodos desde meter ó mostrarpos).
  8. ¿y qué pasa si el usuario ingresa puros números negativos? :tonto: Es mejor asumir que el mayor/menor es el primer elemento ingresado. O sea, dentro del ciclo for hay que poner un if...else, en éste se pregunta si es la primera iteración (i es 0), si es así se inicializa la variable que guarda el valor mayor/menor (se le asigna el valor que el usuario acaba de ingresar), en caso contrario se hace la comparación.
  9. Intenta con esto: body{background-image:url(../images/fondo.jpg); background-position:top center; background-repeat:no-repeat; background-attachment:fixed;} :mmm: aunque si quieres que cubra todo el fondo, necesariamente tendrías que cambiar la propiedad background-repeat por repeat-x ó repeat.
  10. A ver, ANSI C no permite arreglos con largo desconocido en tiempo de compilación :no: (eso lo enseñan en el jardín infantil :tonto: ). Si alguien se acostumbró a que el IDE o compilador que usa no tire error, es simplemente porque el compilador no cumple con el estándar ó no está usando las opciones de compilación adecuadas ó lo está compilando como C++ ó el compilador se rige por el estándar pero le agrega algunas "extensiones" (o sea, cumple con el estándar, pero se da algunas licencias). En este caso es por lo último, es decir, al usar la opción -ansi en GCC, el compilador de todas formas agrega algunas extensiones al lenguaje (que no son compatibles con ANSI C), así que técnicamente no está cumpliendo con el estándar. La explicación está aquí. La parte importante es esta: Si alguien no tiene claro por qué hablan indistintamente de ANSI e ISO, lea la sección 2.1 aquí. Así que para lograr que el compilador, por fin, mande el tan anhelado error o advertencia :tonto: habría que agregar la opción -pedantic. Por si acaso, en vez de -pedantic, se puede usar -pedantic-errors para que tire errores (y no sólo advertencias). Hasta donde recuerdo, el Turbo C++ no aceptaba programas C con largos de arreglo variables al compilar usando la opción ANSI C (también había otras opciones como K&R).
  11. Si estás usando este código para mostrar el formulario... Form Muestra; Muestra = new Form(); Muestra.Show(); ...entonces obtienes un formulario vacío, porque eso es lo que hace el contructor de la clase Form. Si agregaste el formulario de forma correcta a tu proyecto, entonces tienes que crear una instancia usando el nombre de la clase de tu formulario. Los formularios que creas en .NET derivan de la clase Form, o sea, heredan los miembros de la clase Form, pero son de otra clase. Cada formulario que agregas es una clase nueva derivada de la clase Form. Si dejas los nombres por defecto que asigna Visual Studio, entonces el formulario principal de tu proyecto pertenece a la clase Form1 y el otro formulario que agregaste sería de la clase Form2. Por lo tanto, para mostrar el otro formulario tendrías que usar: Form2 muestra = new Form2(); muestra.ShowDialog(); muestra.Dispose(); ó Form2 muestra = new Form2(); muestra.Show(); muestra.Close(); Obviamente, si le cambiaste el nombre al formulario, tienes que cambiar el nombre de la clase. Cuando agregas un formulario a un proyecto en Visual Studio, el formulario se guarda en un archivo con el nombre que le asignaste en el cuadro de diálogo correspondiente, y dentro de este archivo se define una clase pública con el mismo nombre del archivo. Es decir, si mantuviste los nombres por defecto: El formulario principal estaría en un archivo llamado Form1.cs y en él se define una clase Form1 que deriva de Form. El formulario que agregaste después estaría en un archivo llamado Form2.cs y en él se define una clase Form2 que deriva de Form. O sea, normalmente vas a ver algo como esto en el código fuente de tus formularios: public partial class Form1 : Form { public Form1() { InitializeComponent(); } // etc. } Así que usando el constructor del formulario (y no el de la clase Form :no: ) se incluirán todos los controles que tú agregaste con el diseñador de Visual Studio.
  12. En esta página encontré este código: using System.Collections.Generic; using Word = Microsoft.Office.Interop.Word; namespace WordExample { class WordExample { public WordExample() { WordApp = new Microsoft.Office.Interop.Word.Application(); } private Word.Application WordApp; private object missing = System.Reflection.Missing.Value; private object yes = true; private object no = false; private Word.Document d; private object filename = @"C:\FullPathToFile\example.doc"; public void UpdateDoc() { d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing); List<word.range> ranges = new List<microsoft.office.interop.word.range>(); foreach (Word.InlineShape s in d.InlineShapes) { if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture && s.Title == "LogoEmpresa") { ranges.Add(s.Range); s.Delete(); } } foreach (Word.Range r in ranges) { r.InlineShapes.AddPicture(@"C:\PathToNewImage\Image.jpg", ref missing, ref missing, ref missing); } WordApp.Quit(ref yes, ref missing, ref missing); } } } sí, está en C#, pero supongo que no deberías tener problemas para pasarlo a VB.NET ;) (yo no lo pasé a VB.NET porque no tengo instalado ni el Visual Studio ni el Office 2010 y no me manejo tanto en VB :tonto: ). Por si acaso, la interoperabilidad COM en C# no es tan cómoda como en VB.NET y hay que poner todos esos ref missing, pero en VB.NET simplemente los omites. Otra cosa, yo le agregué la condición && s.Title == "LogoEmpresa", que se supone es lo que a ti te serviría. O sea, el código recorre la lista de todos los objetos incrustados en el documento (InlineShapes) y revisa si es una imagen (wdInlineShapePicture) y si tiene el marcador que buscas (en este caso, "LogoEmpresa"); si encuentra una coincidencia, la agrega a la lista ranges; después, en el segundo ciclo foreach, reemplaza todas las coincidencias que encontró en la búsqueda anterior con la imagen correspondiente (en este caso, "C:\PathToNewImage\Image.jpg"). Obviamente, tú reemplazas el título de la imagen por el que corresponda (yo le puse "LogoEmpresa") y eso vendría siendo el "marcador" de la imagen. Porsiaca, la línea List<word.range> ranges = new List<microsoft.office.interop.word.range>(); en VB.NET creo que sería: Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range) EDITADO: Aquí dejo el código en VB.NET...obviamente no tengo idea si compila Imports System.Collections.Generic Imports Microsoft.Office.Interop.Word '...etc... Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range) For Each s As Microsoft.Office.Interop.Word.InlineShape In oDoc.InlineShapes If (s.Type = Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture) And (s.Title = "LogoEmpresa") Then ranges.Add(s.Range) s.Delete() End If Next For Each r As Microsoft.Office.Interop.Word.Range In ranges r.InlineShapes.AddPicture(FileName:=openFileDialog1.FileName, LinkToFile:=False, SaveWithDocument:=True) Next NOTA: Lo que hace el código es reemplazar una o más imágenes que tengan un determinado título, o sea, el documento debe tener una imagen en la ubicación en donde tú quieres que vaya el logo de la empresa. Así que puedes poner alguna imagen "genérica" en el documento Word.
  13. :mmm: Creo que deberías aprovechar que la imagen la abres a través de OpenFileDialog, así te evitas tener que abrir el archivo, guardarlo en memoria e insertarlo en Word como lo has tratado de resolver hasta ahora. Entonces simplemente tendrías que usar el nombre completo del archivo que te devuelve OpenFileDialog y usarlo para insertar directamente la imagen (sin guardar el archivo en memoria). Así que podrías intentar hacerlo así: oDoc.Selection.InlineShapes.AddPicture("C:\Windows\Web\Wallpaper\Windows\img0.jpg") el código inserta una imagen en la posición actual del cursor. échale una mirada al método AddPicture. También puedes probar sin Selection y/o poniendo los parámetros opcionales: oDoc.InlineShapes.AddPicture(FileName:="C:\Logotipo.png", LinkToFile:=False, SaveWithDocument:=True) Sobre lo de intentar pegar la imagen a través del portapapeles, creo que podría tener un problema: ¿qué pasa si el usuario u otro programa copia algo al portapapeles mientras tú lo estás usando?
  14. La mayoría de los ensamblados que aperecen en las referencias son parte de .NET, así que no tienes que preocuparte de distribuirlos. Tu aplicación requiere que el usuario tenga instalado: .NET Framework (la versión que corresponda, no especificas qué versión usas...parece que es la 3.5 ) Office 2010 Además creo que requiere, Windows Installer 3.1 o posterior O sea, eso es lo que el usuario final debe preocuparse de tener en su computador para poder instalar y usar tu aplicación. El primer requerimiento casi no es problema hoy en día, pero debes especificar cuál es la versión que requiere tu aplicación (2.0, 3.0, 3.5 ó 4.0). El hecho de tener Office instalado, no garantiza que tenga instalado los componentes necesarios para interactuar con .NET, es decir, creo que la instalación típica de Office instala por defecto los controles ActiveX de Office, pero no necesariamente los PIA (Primary Interop Assembly), que son la interfaz que necesitas para que una aplicación .NET se entienda con controles ActiveX. Además, es necesario que esté instalada la aplicación de Office que tu aplicación requiere, o sea, puede que el usuario haya instalado sólo Excel y PowerPoint, pero no Word :tonto: (que parece es la que tu aplicación usa)...igual sería raro que alguien no tenga instalado el Word. Aquí hay unos enlaces que te pueden servir: Instalación de requisitos previos para soluciones Office PIA de Office 2010 para instaladores Explicación sobre PIAs de Office Bajar paquete redistribuible de PIA para Office 2010 (tendrías que averiguar cómo agregarlo a tu instalador , mejor usa el segundo enlace) Visual Studio 2010 Tools para Office Runtime (creo que también necesitas instalar esto en el equipo del usuario final) Por lo que entiendo, el segundo enlace sería el que necesitarías para hacer un instalador que verifique automáticamente si está instalado o no el PIA de Office 2010, y en caso de que no lo esté, descargarlo de forma automática antes de comenzar la instalación de tu aplicación. Básicamente, lo que necesitas es agregar los PIAs a tu instalador, esto lo puedes hacer de 2 formas: bajándolos durante la instalación (segundo enlace) ó incluyéndolo en tu instalador (cuarto enlace). Creo que la primera opción es la más fácil, pero requiere que el usuario tenga conexión a internet al momento de realizar la instalación. Al parecer, si al instalar Office se detecta que está instalado .NET Framework, entonces el instalador de Office automáticamente instala los PIAs. En otras palabras, en computadores con Windows Vista, Windows Server 2008 y Windows 7 que tengan Office instalado, los PIAs deberían estar ya instalados; en computadores con XP eso va a depender si tenían o no .NET Framework al momento de instalar Office. Por si acaso, creo que en las 2 últimas versiones de Office, se le llama .NET Programmability Support a los PIAs, o sea, ese es el nombre con el que aparece en el instalador de Office la opción de instalar o no los PIAs en el equipo. Ahora, puede que el usuario final de todas formas no los tenga instalados o no logras incluirlos en tu instalador. En ese caso podrías: Incluir el instalador redistribuible junto con tu aplicación. Poner un enlace con la URL del instalador redistribuible en la documentación. Explicar al usuario final cómo verificar si tiene instalados los PIAs y cómo instalarlos a través del instalador de Office 2010 (Reparar > Agregar o quitar componentes > etc.) La verdad no sé de qué forma tradujeron .NET Programmability Support en las versiones en español de Office NOTA: Un PIA es un ensamblado (binario .NET) que sirve como "intermediario" entre un determinado control ActiveX (componente COM) y una aplicación .NET que necesita usar dicho control. Así que es responsabilidad de la empresa que desarrolla un control ActiveX, hacer su respectivo PIA. Es decir, un PIA es específico para un determinado control ActiveX; entonces no puedes usar el PIA de FlashPlayer para usar un control ActiveX de Office :tonto: .
  15. :mmm: En el archivo MailHandler.ashx, creo que la línea string owner_email = context.Request.Form.Get("[email protected]"); debería ser: string owner_email = context.Request.Form.Get("owner_email");
  16. :mmm: Dos cosas: Esto tendría que ir en Aplicaciones de Escritorio Se supone que tienes que postear lo que llevas hecho De todas formas, para llenar un vector con 0 y 1 aleatorios puedes hacerlo con alguna de estas formas: Random rnd = new Random(); int[] vector = new int[50]; // Método 1 for(i = 0;i < vector.length;i++) vector[i] = rnd.nextInt(2); // Método 2 for(i = 0;i < vector.length;i++) vector[i] = rnd.nextInt() % 2; // Método 3 for(i = 0;i < vector.length;i++) if(rnd.nextInt(30) < 15) vector[i] = 1; else vector[i] = 0; o también puedes hacerlo usando directamente Math.random (no requiere crear un objecto): int[] vector = new int[50]; for(i = 0;i < vector.length;i++) vector[i] = (int)(Math.random() * 2); NOTA: El Método 3 consiste básicamente en elegir un número al azar dentro de un determinado rango (en el ejemplo, es un rango de 30 valores, que van del 0 al 29), y dependiendo si sale un valor que se encuentra en la mitad inferior (0 al 14) o superior (15 al 29) del rango, se le asigna un 0 ó 1. Obviamente, puedes cambiar el rango si así lo prefieres (también habría que cambiar "el valor medio" del rango :tonto: ). En tu caso, para llenar la matriz con 0 y 1, tienes que asignarle valores aleatorios sólo a las posiciones de la segunda fila en adelante y siempre que la columna sea mayor a cero. Yo cacho que en el constructor inicializas la matriz, asignándole los valores a la primera fila y a la primera columna: int[][] recorridos = new int[10][10]; //...etc... for(i = 1;i < 10;i++) recorridos[0][i] = i * 10 + 500; for(i = 1;i < 10;i++) recorridos[i][0] = i * 100; // asignar valores aleatorios y todo eso... Nótese que la posición (0,0) de la matriz no se ocupa, o sea, se podría decir que está "indefinida". En todo caso, mejor asígnale un valor "cualquiera"...porsiaca. Sobre los métodos que reciben como parámetros sectores y/o líneas, tienes que recorrer la primera fila/columna y ver si existe dicho sector/línea, entonces usas la coordenada correspondiente. Por ejemplo, si llamas al método PASA(700,530): Recorres la primera fila buscando el valor 530, lo encuentras en el índice 3 Recorres la primera columna buscando el valor 700, lo encuentras en el índice 7 Verificas el valor que hay en recorridos[7][3] y devuelves true o false según corresponda Recuerda, siempre empieza buscando desde el índice 1 (sea fila o columna), ya que el índice 0 está "reservado". Una aclaración, yo creo que hay que buscar las coordenadas de las líneas/sectores, aunque se podría pensar que está de más, ya que es bastante obvio que la línea 700 está en la fila 7 y no hay necesidad de buscarla, simplemente habría que dividir por 100. Creo que por eso la matriz incluye información en la primera fila y primera columna, porque podría ser cualquier valor y no necesariamente multiplos de 100 o alguna secuencia fácilmente predecible, como en este caso. Eso es lo que se me ocurre por ahora. Cualquier optimización o arreglo al código que posteé (no, no es "postié" :no: ) corre por tu cuenta :tonto:
  17. :mmm: Porsiaca, el formato WAV es un formato contenedor (igual que el AVI), así que guarda el audio usando códecs. Comúnmente el WAV se usa para guardar el audio en PCM, o sea, tal cual (sin compresión). Pero es perfectamente factible guardar audio en un archivo WAV usando compresión MP3, WMA, μLaw, etc. De hecho, el formato AIFF también permite guardar el audio en PCM (sin compresión). La gracia del FLAC, es que comprime la secuencia de audio en PCM usando un algoritmo de compresión sin pérdida. Así que se podría decir que un FLAC es un archivo WAV comprimido con el WinZIP :tonto: . Igual es raro que nadie se haya acordado del AAC y sus variantes, como su nombre lo indica es una forma avanzada de compresión de audio, y tiene una muy buena calidad de sonido (mejor que el MP3). De todas formas si se quiere guardar en MP3 es siempre mejor guardar usando una tasa de bits variable (VBR ó ABR). Ya que si el bitrate es constante, la calidad es variable; y si el bitrate es variable, la calidad es constante. Lo recomendable sería: Si buscas almacenar más archivos: ABR @160 kbps (Mínimo: 128 kbps), Joint-stereo Si buscas mejor calidad de sonido (pero menos archivos): ABR @288 kbps (Mínimo: 256 kbps), Estéreo Nótese que es recomendable no especificar el bitrate máximo. Otra cosa, como el WAV es un formato contenedor, el hecho de tener un programa o dispositivo que lea archivos WAV, no necesariamente significa que va a poder leer cualquier archivo WAV; si está comprimido con un códec poco conocido, no lo va a poder reproducir (ya que no sabría como descomprimir el audio). Lo mismo pasa con los archivos de video AVI.
  18. Una rectificación, creo que no tendría mucha utilidad transformar dígito a dígito el ISBN (de char a int), así que quizás te sirva más transformar de cadena a __int64 (o long long): #include <stdio.h> #include <stdlib.h> int main() { char ISBN[20]; long long cod_libro; // Si no funciona con "long long" cámbialo por "__int64" printf("Ingrese el ISBN: "); gets(ISBN); cod_libro = atoll(ISBN); // Si no funciona con "atoll" cámbialo por "_atoi64" printf("El ISBN era: %I64d\n",cod_libro); return 0; } La función atoll (ó _atoi64) está declarada en "stdlib.h". Si falta algún #include lo agregas tú. Si te diste cuenta, para usar el tipo __int64 (ó long long) en un printf, scanf o cualquiera de sus derivados, tienes que usar "%I64d" o "%I64i", así que para leerlo directamente como un entero de 64 bits lo haces así: long long cod_libro; printf("Ingrese el ISBN: "); scanf("%I64i",&cod_libro);
  19. :mmm: Para empezar te diría que no uses el Dev-C++ (es malo e inestable), mejor usa el Code::Blocks. Puedes usar el tipo de datos __int64 ó long long (también está su respectiva versión sin signo, anteponiéndole unsigned), con dicho tipo puedes almacenar unos cuantos trillones...creo que es suficiente con eso :tonto: Si prefieres pasar a entero dígito por dígito, entonces puedes hacer esto: int i, digito; char ISBN[20]; printf("El ISBN es: "); for(i = 0;i < LARGO_ISBN;i++) { digito = ISBN[i] - '0'; printf("%d",digito); } printf("\n"); Si el compilador no te reconoce el tipo __int64 ó long long, entonces definitivamente vas a tener que cambiarte a Code::Blocks (trae una versión más reciente del MinGW). También puedes bajarte la versión más reciente del MinGW por separado...si así lo prefieres.
  20. Para empezar, tienes que implementar la interfaz ItemListener, así que agrégala a tu clase jframeparaprobar (o sea, tienes que agregarla después de implements). Y como el addItemListener está en la misma clase que el manejador del evento itemStateChanged simplemente le pones this como parámetro del addListener. :mmm: ¿Cuál es la idea de poner esta línea en el constructor? jframeparaprobar objeto = new jframeparaprobar(); :mmm: supongo que debería ser el constructor del JComboBox...y también la estás usando en el manejador del evento :blink: Bueno, aquí hay ejemplo simple que encontré por ahí, para que tengas una idea: import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Icon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; public class MainClass extends JPanel implements ItemListener { public MainClass() { JComboBox jc = new JComboBox(); jc.addItem("Tongoy"); jc.addItem("Arica"); jc.addItem("Punta Arenas"); jc.addItem("Los Vilos"); jc.addItemListener(this); add(jc); } public void itemStateChanged(ItemEvent ie) { String s = (String)ie.getItem(); System.out.println(s); } public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new MainClass()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.setVisible(true); } } Sobre el ciclo while: No es infinito, sólo que está mal hecho. O sea, es como escribir un ciclo for de esta manera: i = 0; for(;;) { if(i >= 10) break; printf("voy en el %i\n",i); i++; } eso funciona, pero es sacrílego... :tonto:
  21. Porsiaca también están: __int64 ó long long ó signed long long: –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 unsigned __int64 ó unsigned long long: 0 a 18.446.744.073.709.551.615 Nótese que estos tipos son reconocidos tanto por Visual C++ como MinGW.
  22. :mmm: Creo que ya estoy cachando el algo, por lo que entiendo, la interfaz ActionListener es la interfaz padre y hay otras varias especializadas que sirven para manejar eventos más específicos. Ahí es donde estaría el problema, ActionListener es muy general y tú necesitas un manejador de eventos específico para un JComboBox. Creo que la interfaz que te serviría sería ItemListener, entonces, en vez de implementar un actionPerformed, tendrías que implementar un itemStateChanged y revisar los campos SELECTED y DESELECTED de la clase ItemEvent. Para agregar el manejador del evento, necesitarías usar addItemListener. Pero de todas formas creo que tienes que poner el addItemListener en el constructor... Y creo que el método private void btnUsuarioFidaActionPerformed(java.awt.event.ActionEvent evt) no está siendo llamado en ninguna parte...
  23. :mmm: Lo que todavía no logro entender es cómo sabes cuál es el evento que se está produciendo. O sea, un control puede reaccionar a varios eventos (cuando el mouse pasa por encima, cuando le hacen clic, cuando se actualiza, etc.). Esa parte no la veo en ningún lado, y puede ser que el manejador del evento (actionPerformed) se esté ejecutando por varios eventos distintos al que tú quieres manejar ¿no debería haber algo por ahí que indique que sólo se ejecute al hacer clic, y no con otros eventos? O quizás deberías verificar el parámetro "ActionEvent e"... Además no sé desde dónde se llama a private void btnUsuarioFidaActionPerformed(java.awt.event.ActionEvent evt)
  24. Por lo que entendí de tu código, creo que debes eliminar esto: private void btnUsuarioFidaActionPerformed(java.awt.event.ActionEvent evt) { btnUsuarioFida.addActionListener(this); } y cualquier referencia a él (al parecer lo estás usando como manejador de evento). Si no quieres borrarlo, simplemente enciérralo como comentario. Y deberías poner en alguna parte (cuando se inicia el formulario que tiene el botón) la línea: btnUsuarioFida.addActionListener(this); así que creo que iría en el constructor ReservarBoleto, o sea, quedaría así: public ReservarBoleto() { initComponents(); btnUsuarioFida.addItem("seleccione item de la lista"); btnUsuarioHida.addItem("Seleccione item de la lista"); btnUsuarioFida.addActionListener(this); } Otra cosa, arregla la forma en que lees las líneas desde el archivo. Y tienes que poner una condición en el ciclo while, creo que es obvio cuál es...
  25. Primero, la lista se crea una vez, después sólo se le agregan nodos. Tú estás creando la lista varias veces. Así que elimina las instrucciones: lista *l; l=create(); de las funciones ingresa y MenuPrincipal. Lo otro, cambiaste la función buscar (poniendo la lista como parámetro), pero tienes que hacer lo mismo con las funciones ingresa y MenuPrincipal (es la misma idea). Así que mejor crea la lista en la función main: int main() { lista *l; l=create(); // el resto del programa... return 0; } Otras cosas: Los system("cls"); no deberías ponerlos después de los break Es incorrecto que la función buscar muestre el error "La lista está vacía" cuando aux==NULL. Esa condición se cumple siempre que se sale del ciclo while. Deberías validar ciertos datos ingresados por el usuario: la edad no puede ser negativa ni un valor "muy alto", sexo sólo debería ser 'M' ó 'F',... O sea, deberían seguir pidiendo que se ingrese el valor hasta que sea válido. Deberías pedir al usuario que conteste 'S' (Sí) ó 'N' (No) cuando le preguntas si quiere seguir ingresando datos, en vez de pedirle que ingrese '0' ó '1'. Este punto y el anterior lo puedes solucionar usando _getch Cualquier función que reciba la lista como parámetro debería verificar primero que no sea NULL antes de empezar a usarla. Si es NULL, simplemente debería salir sin hacer nada. Creo que sería más lógico que el ciclo de la función ingresa sea un do...while en vez de un while.
×
×
  • Create New...