Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crash en programa, o Bucle Infinito? (https://www.clubdelphi.com/foros/showthread.php?t=79108)

martini002 08-06-2012 00:47:44

Crash en programa, o Bucle Infinito?
 
Salud amigos donde quiera que se encuentren ;)

Hoy les traigo un pequeño inconveniente que presenta mi codigo
aun no lo he podido descubrir aunque continuo buscando a ver
donde estara ese nudo...
el problema es que cuando lo ejecuto
y le doy al boton REPARTIR, se queda colgado.

Ademas no cambia la imagen en los procedimientos:

Código Delphi [-]
procedure TForm2.BotRepartirMouseEnter(Sender: TObject);

Código Delphi [-]
procedure TForm2.BotRepartirMouseLeave(Sender: TObject);

lo que es completamente extraño, ya que este Form2
es llamado desde un Form1, en el cual el boton efectivamente
funciona con el mismo procedimiento.

ese es un problemita que me paso en un programa anterior,
ahora el problema del bucle o crash creo que esta en el procedimiento:

Código Delphi [-]
Procedure Barajar();

o en su defecto:

Código Delphi [-]
Procedure Repartir();

Agradeceria mucho de su parte si lograran conseguir el error
continuare buscando, en caso de encontrarlo, como siempre colocare la respuesta aqui.

Anexo el codigo

Saludos
Best,
Martin


Código Delphi [-]
unit Versus;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Math, pngimage;

type
  TForm2 = class(TForm)
    Tablero: TImage;
    BotRepartir: TImage;
    ImagenCentral: TImage;
    procedure BotRepartirClick(Sender: TObject);
    procedure BotRepartirMouseEnter(Sender: TObject);
    procedure BotRepartirMouseLeave(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  VCartas:      Array[1..40]of Integer;           //Vector para el mazo
  VEl:          Array[1..20]of Integer;            //Vector para las cartas de EL
  VYo:          Array[1..20]of Integer;            //Vector para las cartas de YO

implementation
{$R *.dfm}


Procedure InicializarVectores();
Var
   I:Integer;
Begin
//Inicializamos los 3 Vectores en 0
  For I:=1 to 40 do
    VCartas[i]:=0;
  For I:=1 to 20 do
    VEl[i]:=0;
    VYo[i]:=0;
End;

Procedure Barajar();
Var
  i, NumRandom, Aux, j:integer;
Begin
  InicializarVectores();
  i:=1;
  while i<=40 do
    begin
      NumRandom:=RandomRange(1,40)+1;
      Aux:=0;
      for j:=1 to 40 do
        begin
          if VCartas[j]=NumRandom then
          begin
            Aux:=1;
          end;
        end;
      if Aux=0 then
        begin
          VCartas[i]:=NumRandom;
        end;
      if VCartas[i]>0 then
        begin
          i:=i+1;
        end;
   end;
End;

Procedure Repartir();
Var
   I, Par, Impar:Integer;
Begin
     Par:=2;
     Impar:=1;
     for I:=1 to 20 do
       VEl[i]:=VCartas[Impar];
       VYo[i]:=VCartas[Par];
       Impar:=Impar+2;
       Par:=Par+2;
End;

procedure TForm2.BotRepartirMouseEnter(Sender: TObject);
begin
   Form2.BotRepartir.Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Controles\BotRepartirPres.bmp');
end;

procedure TForm2.BotRepartirMouseLeave(Sender: TObject);
begin
   Form2.BotRepartir.Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Controles\BotRepartirNoPres.bmp');
end;

procedure TForm2.BotRepartirClick(Sender: TObject);

Begin
     Barajar();
     Sleep (1000);
     Form2.ImagenCentral.Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Etiquetas\Barajando.bmp');
     Sleep (2000);
     Form2.ImagenCentral.Picture.LoadFromFile('');
     Repartir();

End;

end.

Casimiro Notevi 08-06-2012 01:08:46

No sé qué problema tendrá, pero sí que veo algo poco práctico: vas cargando unas imágenes del disco, constantemente.
¿Por qué no las cargas en el programa y te ahorras de estar cargando una y otra vez, otra vez, y otra vez...?

martini002 08-06-2012 01:10:51

Cita:

Empezado por Casimiro Notevi (Mensaje 434610)
No sé qué problema tendrá, pero sí que veo algo poco práctico: vas cargando unas imágenes del disco, constantemente.
¿Por qué no las cargas en el programa y te ahorras de estar cargando una y otra vez, otra vez, y otra vez...?

Porque no se como hacerlo
Si compartieras tu sabiduria conmigo :D

Casimiro Notevi 08-06-2012 01:29:21

Sin son pequeñas puedes cargalas en un TImageList, por ejemplo.
O usa un Timage para cada una, y lo pones visible o invisible, según te haga falta.

martini002 08-06-2012 01:29:39

Nota:
Cuando corro el programa y le doy click al boton Repartir,
el programa se cuelga por un par de segundos,
y luego me pide continuar o interrumpir el proceso
le doy a continuar y me aparece un mensaje con lo siguiente:

Uknown picture file extension (.)

a lo que asumo que el problema es con alguna de las imagenes...
ya realmente que no se que hacer con esto, buscare sobre
como almacenar las imagenes como en una base de datos
y usarla desde alli como dice Casimiro

martini002 08-06-2012 01:35:08

Cita:

Empezado por Casimiro Notevi (Mensaje 434614)
Sin son pequeñas puedes cargalas en un TImageList, por ejemplo.
O usa un Timage para cada una, y lo pones visible o invisible, según te haga falta.

Por ejemplo:
las dos imagenes del boton repartir, son del mismo tamaño
140x40, y la del mensaje Barajando es de 339x115

y todavia faltan las 40 cartas que son de 55x82
hay un problema en el boton repartir, no hace el cambio
de imagen cuando paso el mouse por el.

pero en el Form1 funciona correctamente con otro boton
buscare sobre TImageList

Casimiro Notevi 08-06-2012 10:13:27

Cita:

Empezado por martini002 (Mensaje 434615)
Cuando corro el programa y le doy click al boton Repartir,
el programa se cuelga por un par de segundos,

Supongo que "se cuelga un par de segundos" es simplemente porque tienes un sleep de retraso ;)
Código Delphi [-]
Barajar();
Sleep (1000);  //  1 segundo
Form2.ImagenCentral.Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Etiquetas\Barajando.bmp');
Sleep (2000);  // 2 segundos
Form2.ImagenCentral.Picture.LoadFromFile('');
Repartir();
Si piensas que alguna imagen está mal, prueba el programa sin imágenes, a ver qué hace.
Pon en comentario las líneas donde cargas imágenes... y prueba.

Código Delphi [-]
Barajar();
Sleep (1000);  //  1 segundo
// Form2.ImagenCentral.Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Etiquetas\Barajando.bmp');
Sleep (2000);  // 2 segundos
// Form2.ImagenCentral.Picture.LoadFromFile('');  // por cierto, aquí no cargas nada, puede ser ese el error
Repartir();

martini002 08-06-2012 13:11:49

Este es el mensaje de error que me muestra la consola

Código Delphi [-]
First chance exception at $75719617. Exception class EInvalidGraphic with message 'Unknown picture file extension (.)'. Process Proyecto40Base.exe (5608)


Edito:
No habia visto tu comentario en el codigo.
"// por cierto, aquí no cargas nada, puede ser ese el error"

Excelente
ese es el problema, no lo reconoce, lo que yo queria hacer alli era
que la imagen fuera removida, y que quedara en vacio
el Timage, ahora el problema es hacer que funcione el boton
cuando le paso el mouse no cambia la imagen,
esto ya me paso en otro programita,
cual sera la forma de solucionarlo?

Problema del crash Resuelto :D

martini002 08-06-2012 13:53:08

Disculpen por el doble post,
pero no pude editar el anterior
ya resolvi lo de la imagen, fue sencillo
pero si alguien con mas experiencia lo puede explicar
seria muy conveniente, lo que hice fue lo siguiente,

El Form2 es llamado desde un boton en el Form1
Las imagenes del Form2 no se cargaban correctamente
porque el modo de llamado desde el Form1 era el siguiente:

Código Delphi [-]
procedure TForm1.BotVersusClick(Sender: TObject);
begin
  with TForm2.Create(Self) do
  try
    Show
  finally
    Free
  end
end;

En mi ignorancia nunca supe realmente que esto influyera
hasta que se me ocurrio; esa forma la encontre en alguna web
donde explicaban como mostrar un Form llamado desde otro,
y realmente asi es como he aprendido lo poco que se,
simplemente buscando lo que necesito, bien ahora la forma
en que pude solucionarlo:

Código Delphi [-]
procedure TForm1.BotVersusClick(Sender: TObject);
begin
  Form2.Show; // -.-'
end;

Saludos, gracias Casimiro por tu ayuda :)

Chris 08-06-2012 16:57:14

Hola Martín!

El siguiente código está malo:
Código Delphi [-]
procedure TForm1.BotVersusClick(Sender: TObject);
begin
    with TForm2.Create(Self) do
    try
        Show;
    finally
        Free;
    end
end;

Estás liberando el formulario inmediatamente después que lo creas. Intenta con este código:
Código Delphi [-]
procedure TForm1.BotVersusClick(Sender: TObject);
begin
    TForm2.Create(Self).show;
end;

En el evento "OnQueryClose" del Form2, agrega el siguiente código:
procedure TForm2.OnQueryClose(...);
begin
action := caFree;
end;


A cómo te ha dicho Casimiro, las imágenes estaban muy mal administradas. Pero no te preocupes, así es cómo uno aprende :)

Si ahora vas a utilizar imágenes almacenas en objetos TImage, puedes adaptar tu viejo código de la siguiente manera:
Código Delphi [-]
procedure TForm2.BotRepartirMouseEnter(Sender: TObject);
begin
    Self.BotRepartir.Picture := Image1.Picture;
end;

procedure TForm2.BotRepartirMouseLeave(Sender: TObject);
begin
   Self.BotRepartir.Picture := Image2.Picture;
end;
Fíjate que en código no utilizo la variable "Form2". En su lugar utilizo una variable especial llamada Self. Utilizar esta variable es la forma más segura para manipular el formulario/clase con código dentro de la misma clase.

Saludos!

martini002 08-06-2012 19:06:10

Hola Chris.

Hermano la cuestion es que no se utilizar los objetos TImage,
estuve buscando info pero no encontre algo que me explicara bien
por el momento las he seguido usando como hasta ahora habia hecho
llamandolas de un arhivo externo; en un par de horas avance bastante
en este proyecto, ya reparte las cartas aleatoriamente con las imagenes y todo
los botones funcionan perfectamente; el siguiente codigo quedo asi:

Código Delphi [-]
procedure TForm1.BotVersusClick(Sender: TObject);
begin
  Form2.Show; 
end;

Lo que hace que funcionen los botones y las imagenes

ahora lo que no entiendo es lo siguiente:

Código Delphi [-]
//En el evento "OnQueryClose" del Form2, agrega el siguiente código:
procedure TForm2.OnQueryClose(...);
begin
action := caFree;
end;

Nunca he sabido que quiere decir Query,
para que funciona este codigo?

y supongo que el siguiente es para llamar las imagenes de
la lista de imagenes en el objeto TImage?

Código Delphi [-]
procedure TForm2.BotRepartirMouseEnter(Sender: TObject);
begin
    Self.BotRepartir.Picture := Image1.Picture;
end;

procedure TForm2.BotRepartirMouseLeave(Sender: TObject);
begin
   Self.BotRepartir.Picture := Image2.Picture;
end;

La cuestion es que no se trabajar con TImage aun!
Excelente intervencion
gracias Chris

Delphius 08-06-2012 19:31:50

Yo que tu a los fors de Repartir() e InicializarVectores() les coloco su begin-end porque dudo que se ejecute más allá de la primera instrucción dentro del ciclo :rolleyes:
Adivino... ¿vienes desde Visual Boshit :D ?

Por cierto, que es eso de sumar +2 a una variable par e impar. ¡Que ganas de complicarse! Y en inicialiarvectores para que 2 fors si con uno puedes hacer todo el trabajo.

Saludos,


La franja horaria es GMT +2. Ahora son las 09:19:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi