PDA

Ver la Versión Completa : problema al registrar ubicacion de ventana...


Greco
06-12-2007, 22:35:29
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:
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:
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....


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:

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:


...
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
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. :)