Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema al registrar ubicacion de ventana... (https://www.clubdelphi.com/foros/showthread.php?t=51152)

Greco 06-12-2007 22:35:29

problema al registrar ubicacion de ventana...
 
Hola como estan,

Al programa que estoy haciendo lo quiero dar la posibilidad de recordar la posicion de la ventana principal para que cuando se vuelva a abrir /esta lo haga en la posicion que tenia cuando se cerro el programa anteriormente, para ellos estoy guardando la propiedad Form1.Left y Form1.Top.

Para guardar hago lo siguiente en el evento OnClose del form principal:
Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Reg: TRegistry;
begin
  //Guardamos en el registro de windows la ubicacion de la ventana
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\abcde\', True) then
    begin
      Reg.WriteInteger('Left',Form1.Left);
      Reg.WriteInteger('Top',Form1.Top);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
    inherited;
  end;
end;

y para rescatar esos datos lo hago en el evento OnCreate:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  Reg: TRegistry;
begin
  //Leemos del registro de windows la ubicacion de la ventana
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\abcde\', True) then
    begin
      Form1.Left:=Reg.ReadInteger('Left');
      Form1.Top:=Reg.ReadInteger('Top');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
    inherited;
  end;
end;

Como fui probando de a poco, primero agregando el codigo que guarda los datos en el registro, probar, etc entonces cuando corría la aplicación me funcionaba bien por que los datos de posicion (left y top) ya estaban en el registro entonces solo se iba modificando, el problema ocurre cuando quiero correr la aplicacion por primera vez (por ejemplo en otro pc), al ejecutar el programa éste lee en el registro la posicion LEFT y TOP del Form1 pero como esta informacion aun no se crea me manda un error (FAILED TO GET DATA FOR 'LEFT') ya que no encuentra dichos datos.
Mi pregunta es, cual es la forma de tener algunos valores por defecto en caso de que la aplicacion se ejecute por primera vez, para las veces siguientes ya no ocurriría el problema por que el programa al cerrarse guarda la posicion actual.

Pense que podía ser algo parecido a como se hace con los .INI que se le especifica una valor en caso de que no haya nada pero no me funciona, talvez se hace de otra manera.

Espero algun comentario.

Saludos

egostar 06-12-2007 22:40:15

Hola Greco

Yo haría esto....

Código Delphi [-]
 
try      
  Form1.Left:=Reg.ReadInteger('Left');
  Form1.Top:=Reg.ReadInteger('Top');
except
  Form1.Left := 300;
  Form1.Top := 100;
end;

Salud OS

Greco 06-12-2007 23:56:18

Gracias EGOSTAR, te cuento, agregue el codigo que posteaste y funciona bien, con lo cual se soluciona el problema que tengo pero me ocurre algo extraño, si ejecuto el programa fuera de delphi, osea primero compilo (menu Project>>Compile Ctrl+F9) y luego voy a la carpeta donde queda el .exe, lo ejecuto y su funcionamiento es correcto pero si trato de hacerlo desde el mismo delphi (F9) me un cuadro con error:

Código Delphi [-]
Debugger Exception Notification
Project Player.exe raised exception class ERegistryException message 'Failed to get data for 'Left''. Process stopped. Use Step or Run to continue.

Despues de eso el programa funciona bien, si elimino los datos del registro.

Cosa curiosa, no se que pasará, como te dije antes, si abro el programa ejecutando directamente el .exe me funciona bien y toma los datos que le puse en:

Código Delphi [-]
...
except
  Form1.Left := 300;
  Form1.Top := 100;
end;
...
Bueno, gracias por la ayuda brindada, ahora si me funciona lo que deseaba hacer, ecepto por lo que comente arriba pero para el uso final no hay problemas.

Saludos

egostar 07-12-2007 00:00:19

Hola Greco

Ese error es normal dentro del IDE de Delphi ya que efectivamente existe un error al tratar de obtener datos del registro que no existen, lo cual se genera en el except. Solo que en el ejecutable no te lo muestra.

Algo que me parece muy bueno cuando estas depurando el código.

Salud OS

Greco 07-12-2007 00:12:06

Cita:

Empezado por egostar (Mensaje 251079)
Hola Greco

Ese error es normal dentro del IDE de Delphi ya que efectivamente existe un error al tratar de obtener datos del registro que no existen, lo cual se genera en el except. Solo que en el ejecutable no te lo muestra.

Algo que me parece muy bueno cuando estas depurando el código.

Salud OS


Ok, ahora me queda mas clara la cosa, gracias por tu ayuda. :)


La franja horaria es GMT +2. Ahora son las 00:07:45.

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