Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Un mensaje de error (https://www.clubdelphi.com/foros/showthread.php?t=36366)

FGarcia 10-10-2006 03:08:26

Un mensaje de error
 
Hola! Nuevamente molestando por aqui, resulta que añadi una linea a un archivo ini donde guardo unos datos de configuracion y al salvar esos cambio me aparece este mensaje de error:

---------------------------
Debugger Exception Notification
---------------------------
Project WinTrapp.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Este mensaje no me aparecia anteriormente, esto fue solo al añadirle la linea

WriteString('Seguridad', 'Clave', newPass);

al procedimiento de guardar el archivo ini. Lo interesante del asunto es que si me realiza los cambios solicitados, solo es ese mensaje de error el que me trae de cabeza. Agradesco su atencion.

dec 10-10-2006 04:52:34

Hola,

Pues es extraño, porque la instrucción que añades no parece acceder a ningún objeto (salvo a propio "TIni", puesto que "WriteString" es un método de esta clase) y, por otro lado, la excepción que se produce está relacionada con eso: se accede a un objeto sin instanciar o ya liberado.

Tal vez si pusieras algo más de código, un poco de antes y poco de después... ;)

En todo caso,... es extraño que sóla añadir esa instrucción cause ningún problema... algo más tiene que haber por ahí... ;)

Neftali [Germán.Estévez] 10-10-2006 10:09:09

Intenta poner un trozo más grande de código, con esa línea no da muchas pistas. Normalmente ese error es debido a que estás utilizando un objeto que no se ha creado/inicializado correctamente o que ya se ha liberado.

jachguate 10-10-2006 16:13:20

También te invito a poner un título mas adecuado a tus hilos. Podes imaginarte que sucedería si el 50% de los hilos de estos foros se titularan "Un mensaje de error"... esto sería un caos, y creo que aproximadamente el 50% de los hilos tratan sobre errores o problemas diversos.

Para una proxima oportunidad, un título como "Access violation al escribir en archivo ini" o "TIniFile.WriteString lanza Access violation" resultará mucho mas descriptivo.

No olvides que todos los hilos pasan a formar parte de la base de conocimiento del clubdelphi, y cuando se realizan búsquedas, los títulos adquieren mucha mayor importancia, como bien señala la guia de estilo.

Hasta luego.

;)

FGarcia 11-10-2006 01:47:14

Hola! Gracias por responder, con respecto al titulo del mensaje mil disculpas pero no se me ocurrio otro :D (por cierto ¿se pueden editar los titulos?)

//EDITADO: Al parecer ya corregi el error aun estoy en pruebas.

Con respecto al problema pues si, me enfoque solo al hecho de haber insertado esa linea y de que ahi provenia el error. En realidad es una continuacion de este otro hilo .

Como menciono en el hilo anterior desde un elemento de menu creo un formulario que me pide una clave antes de acceder al formulario de configuracion. Eso pues ya lo resolvi y no me genera ningun problema.

Código Delphi [-]
procedure TForm1.Ajustes1Click(Sender: TObject);
var
Respuesta : integer;
begin
  modoPass := 1;
  frmCfg := TfrmCfg.Create(nil); //Formulario que pide clave de ingreso a
                                 //la configuracion
  Respuesta := frmCfg.ShowModal;
  if Respuesta = mrOK then //Si la clave de ingreso es correcta
    begin
    frmConfigura := TfrmConfigura.Create(nil); //Formulario de configuracion
      try
        frmConfigura.ShowModal;
      finally
        frmConfigura.Free;
      end;
    end;
  frmCFG.Close;
  frmCFG.Free;    //SI AQUI LIBERO EL FORMULARIO frmCFG no necesito liberarlo en ningun otro lado!!!!!
end;

Código Delphi [-]
procedure TfrmCfg.BitBtn1Click(Sender: TObject);
var
  K: string;
begin
  case modoPass of
    1: K := DatetoStr(Date) + 'CFG';  // dd/mm/yyyyCFG
                                      //Clave de acceso a Config.
    2: K := DateToStr(Date) + 'GLAF'; // dd/mm/yyyyGLAF
                                      //Clave de acceso tipo Backdoor o sea si
                                      //la pierden.
  end;
  if edit1.Text <> '' then
    begin
      if (Edit1.Text = K) or (edit1.text = Password) then
        begin
          frmCfg.ModalResult := mrOk;
          K := '';
        end
      else
        begin
          showmessage('¡Clave de acceso invalida!');
          Edit1.Text := '';
          Edit1.SetFocus ;
        end;
    end
  else
    begin
      ShowMessage('Debe ingresar una clave valida');
      Edit1.setfocus;
    end;
end;


De ahi decidi colocar otra contraseña a otro formulario para mantenimiento de la BD, no encontre razon para crear otro formulario de "login" y decidi usar el que ya habia probado, desde el mismo formulario de configuracion inserte tres CheckBox :

a) uno para crear la contraseña por primera vez. Este crea un nuevo formulario donde se ingresa la contraseña y se le asigna a una variable, la cual no se guarda hasta que se le hace click en el boton de ok del formulario de configuracion. Este paso funciona bien, no me genera ningun error.

Código Delphi [-]
//Establece la contraseña por primera vez
procedure TfrmConfigura.CheckBox19Click(Sender: TObject);
begin
  frmPass := TfrmPass.Create(nil);   //Este es el formulario para crear
                                     //la contraseña de mantenimiento
  try
    frmPass.ShowModal;
  finally
    frmPass.Free;
  end;
end;


Código Delphi [-]
procedure TfrmPass.BitBtn1Click(Sender: TObject);
var
  oldPass: string;
begin
  oldPass := Password;
  if Edit1.Text <> '' then
    begin
      if (Edit1.Text = Edit2.Text) or
                              (Edit1.Text = DateToStr(Date) + 'GLAF') then
        begin
          newPass := Edit1.Text ;
          Close;
        end
      else
        begin
          showmessage('No hay coincidencia. Verifique nuevamente');
          Edit1.SelLength ;
          Edit1.SetFocus ;
        end;
    end
  else
    begin
      showmessage('Ingrese al menos un caracter');
      Edit1.SetFocus;
    end;
end;


b) otro (checkbox) para cambiar la contraseña; desde aqui se vuelve a llamar al formulario de ingreso de la contraseña y se ejecuta el mismo procedimiento. Aqui si cuando cierro el formulario de configuracion me da el error ya mencionado.

Código Delphi [-]
//Cambia la contraseña. Primero se le pide que ingrese la contraseña de
//mantenimiento actual
procedure TfrmConfigura.CheckBox20Click(Sender: TObject);
var
  respuesta: integer;
begin
  modoPass := 2;
  frmCfg := TfrmCfg.Create(nil); //Este es el formulario de ingreso de
                                 //contraseña de mantenimiento QUE ES EL MISMO
                                 //que pide la clave de ingreso a configuracion
  Respuesta := frmCfg.ShowModal;
  if Respuesta = mrOK then   //Si la contraseña es correcta
    begin
    frmPass := TfrmPass.Create(nil); //Este es el formulario para crear
                                     //la contraseña de mantenimiento
      try
        frmPass.ShowModal;
      finally
        frmPass.Free;
      end;
    end;
  frmCFG.Close ;
  frmCFG.Free ;  //¡¡¡¡ESTO ESTA DE MAS!!!!!
end;


c) un checkbox mas para eliminar la contraseña;desde aqui se vuelve a llamar al formulario de ingreso de la contraseña si la contraseña es correcta solo coloca una variable tipo string en vacio. Aqui tambien me da problema.

Código Delphi [-]
//Borra la contraseña. Primero se le pide que ingrese la contraseña actual
procedure TfrmConfigura.CheckBox21Click(Sender: TObject);
var
  respuesta: integer;
begin
  modoPass := 2;
  frmCFG := TfrmCFG.Create(nil); //Este es el formulario de ingreso de
                                 //contraseña de mantenimiento QUE ES EL MISMO
                                 //que pide la clave de ingreso a configuracion
  Respuesta := frmCfg.ShowModal;
  if respuesta = mrOK then  //Si la contraseña es correcta
    newPass := '';
  frmCFG.Close ;
  frmCFG.Free ;   ///ESTO TAMBIEN
end;

Y para terminar cuando hago click en el boton de aceptar del formulario de configuracion se salvan los cambios en el archivo .ini

Código Delphi [-]
procedure TMDatos.SalvarConfig;
begin
  ConfigTCP := TIniFile.Create(RutaAPP + 'ordenCfg.ini');
  with ConfigTCP do
    begin
      try
       //son muchas cosas mas que se guardan hasta llegar a esta nueva linea
        WriteString('Seguridad', 'Clave', newPass);
      finally
        Free ;
      end;
    end;
end;

Mientras escribo esto una idea me da vueltas pero no logro aterrizarla aun. Se que fue mucho "rollo", "choro", "verbo", y como se diga en diversas latitudes donde se hable Español o Castellano (Cual es la correcta:) ). Se agradece su ayuda

/// Bueno por fin aterrizo la idea y parece que funciono. El codigo supongo que se puede hacer mas elegante lo seguire revisando. Se aceptan sugerencias


La franja horaria es GMT +2. Ahora son las 05:49:03.

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