Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error AppHamgB1 (https://www.clubdelphi.com/foros/showthread.php?t=89473)

isracdc 26-11-2015 20:15:06

Error AppHamgB1
 
Hola a todos, tengo una consulta, tengo un Form y una Unit, con este codigo;

Código Delphi [-]
unit uFrmPrueba;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uBase64;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:=Encode64(StrToInt(Edit1.Text));
end;

end.

y en la unit este codigo
Código Delphi [-]
unit uBase64;

interface



  function Encode64(S: Integer): string;

implementation

uses uFrmPrueba;
const
Codes64: array[0..63] of string = ('0','1','2','3','4','5','6','7','8','9','A','B','C',
                                  'D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
                                  'R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
                                    'g','h','i','j','k','l','m','n','o','p','q','r','s','t',
                                    'u','v','w','x','y','z','+','/');

function Encode64(S: Integer): string;

var
  cociente, resto: Integer;
  cadena: string;
begin
  cociente:=1;
  cadena:='';
  while (cociente>0) do begin
    cociente:=S div 64;
    resto:=S mod 64;
    cadena:=cadena+ Codes64[resto];
    S:=cociente;
  end;
  Result:=cadena;
end;
end.

no es nada complejo, pero al querer ejecutar, me sale el error de AppHangB1 y se me cierra el Delphi, trabajo con la version XE, y al ir al administrador de tareas de Windows, hay 3 procesos con el nombre de mi ejecutable y solo puede cerrarse uno, ¿Que puede ser?

AgustinOrtu 26-11-2015 21:25:31

En Delphi 2010 no parece dar problemas

Que valor exactamente genera la excepcion? En que punto exactamente?

PD: Porque tenes una referencia circular innecesaria? (uses UfrmPrueba)?

isracdc 26-11-2015 21:33:18

//A ver...
 
.....pues simplemente no me deja Ejecutar la aplicacion, al querer ejecutar, Delphi deja de funcionar, es una funcion que me codifica el texto del edit1(que lo transformo a entero, ya que la funcion recibe un entero), al presionar el boton, se muestra el texto codificado en el edit2.
....buena observacion Agustin Ortu, creo q deberia quitar el uses (uses UfrmPrueba) de la Unit, verdad?

AgustinOrtu 26-11-2015 21:34:23

Por cierto este es el codigo que use

Código Delphi [-]
const
  Codes64: array [0 .. 63] of string = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c',
    'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    '+', '/');

function Encode64(S: Integer): string;
var
  cociente, resto: Integer;
  cadena: string;
begin
  cociente := 1;
  cadena := '';
  while cociente > 0 do
  begin
    cociente := S div 64;
    resto := S mod 64;
    cadena := cadena + Codes64[resto];
    S := cociente;
  end;
  Result := cadena;
end;

procedure Test(const BigNumber: Integer; Output, Errors: TStrings);
var
  I, LValue: Integer;
  LBase64: string;
begin
  Output.Clear;
  Errors.Clear;

  Output.BeginUpdate;
  Errors.BeginUpdate;
  try
    Randomize;
    for I := 1 to 500 do
    begin
      LValue := Random(BigNumber);
      try
        LBase64 := Encode64(LValue);
        Output.Add(Format('LValue %d ---> Encode64: %s', [LValue, LBase64]));
      except
        on E: Exception do
          Errors.Add(Format('ERROR: LValue %d, Exception %s', [LValue, E.Message]));
      end;
    end;
  finally
    Output.EndUpdate;
    Errors.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test(StrToInt(Edit1.Text), Memo1.Lines, Memo2.Lines);
end;

AgustinOrtu 26-11-2015 21:37:07

Entonces creo que tenes otro problema, compilas y generas el ejecutable pero despues no te deja correrlo??

No creo que tenga mucho que ver el codigo a menos que tengas codigo de inicializacion en algun lado

isracdc 26-11-2015 22:03:03

//Ups
 
Tratare con el codigo que me enviaste.
Pues parece que compila todo bien, ya que me detecto algunos errores en el codigo, pero al corregir todo, cuando supongo q no hay errores y del compilador pase al ejecutable, ahi es donde el Delphi se me cuelga, no se donde podria tener otro codigo de inicializacion como mencionas, pq ese Form y esa Unit son lo unico que tengo en el proyecto, o donde podria estar ese codigo que dices?

AgustinOrtu 26-11-2015 22:54:21

Cita:

Empezado por isracdc (Mensaje 499865)
Tratare con el codigo que me enviaste.
Pues parece que compila todo bien, ya que me detecto algunos errores en el codigo, pero al corregir todo, cuando supongo q no hay errores y del compilador pase al ejecutable, ahi es donde el Delphi se me cuelga, no se donde podria tener otro codigo de inicializacion como mencionas, pq ese Form y esa Unit son lo unico que tengo en el proyecto, o donde podria estar ese codigo que dices?


Por ejemplo, en un FormCreate o algun constructor

Entonces basicamente no podes crear ninguna aplicacion?? Yo creo que los tiros van por otro lado y el codigo no tiene nada que ver

isracdc 26-11-2015 23:42:12

//A ver...
 
Agustin Ortu, mil gracias por tu observacion, esa referencia cirtular era el error q no me dejaba ejecutar, simplemente la quite y el programa corrio con normalidad, muchas gracias por notar ese error, me salvaste

AgustinOrtu 26-11-2015 23:55:38

Que extraño! No deberia generar problemas, fue solamente una observacion..

A mi me funciona:

Código Delphi [-]
unit UMainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, UBase64;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage(Encode64(5));
end;

end.

Por otro lado.. mejor! Las referencias circulares mejor obviarlas

isracdc 27-11-2015 00:05:41

//A ver...
 
En eso tienes razon, no TENDRIA que generar problemas, pero al quitar esa referencia el programa se ejecuto con normalidad, o.......sera la instalacion del Delphi, tal vez?


La franja horaria es GMT +2. Ahora son las 23:03:47.

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