Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber Cuando ha Terminado De Cargarse La Aplicación (https://www.clubdelphi.com/foros/showthread.php?t=76958)

sintecsl 08-12-2011 14:05:42

Saber Cuando ha Terminado De Cargarse La Aplicación
 
Bueno, expondré mi duda o consulta :

Tengo un programa que puede abrir multiples ficheros marcados desde el ecplorer de win.

Cuando el programa está cargado en memoria no hay problema, ya que no da ningún tipo de error.

El problema surge cuando marco varios ficheros (estan asociados a mi aplicación en el Reg. de win) y no hay ninguna aplicación iniciada.

Dicho de otro modo, me gustaría saber cuando a terminado mi aplicación de cargarse del todo (Ventanas - forms).

Explico algo mas para dar mas entendimiento a la cuestión :


Cuando inicio mi aplicación creo un señalizador para que no se recarge varias veces, creo un área de memoria compartida (4kbytes) para enviar el fichero. Mapeo esa memoria de manera ke el primero en abrir se convierte en receptor y el resto en emisor (se en Handle del receptor gracias a esa modalidad).

Los emisores envian como parámetro (tengo en el receptor habilitado la captura de evento) un fichero a abrir y el receptor los abre. Pero como no está totalmente cargada la aplicación produce errores de indexación a datos de listas (TStrins - TSTringList)..... Kon lo ke se produce un error Bound.....

Mi duda es solo cuando puedo saber ke tengo la aplicación activa totalmente cargada para evitar esos desbordamientos o direccionamiento a datos inexistentes (por no estar cargados)....


Sencillo no? (pues jode ke te kagas ) He mirado el objeto APPLICATION y tiene una variable interna FRunning ke kreo es la ke me interesa pero me obligaría a cambiar los ficheros base de delphi (V.7) ... no se ke hacer si kargarme ese fichero remodelandola variable y creando una pública o no se ke.....


Esa variable se avtiva cuando ejecuta RUN la aplicación y es cuando creo ke está activa......

Si alguien konoce una manera de solucionarlo de una forma mas elegante se lo agradecería

Salu2 a tod@s y gracias de ante mano...

Ñuño Martínez 13-12-2011 15:06:28

Pues parece que mi memoria falla porque hace (mucho) tiempo estuve en tu misma situación, y cuando desde el Explorer marcaba varios archivos y le decía que los abriera mi aplicación, lo que pasaba era que dicho Explorer arrancaba mi programa y le pasaba todos los archivos vía parámetros (funciones ParamCount y ParamStr), y nunca me tuve que preocupar de si abría o no una instancia por archivo. ¿Ha cambiado esto con los Windows más modernos? ¿O quizá es algo relacionado con la configuración? Mencionas el registro: ¿no habrá una opción relacionada con esto?

De todas formas seguro que el objeto Application puede usarse para esto, o no.

thecidmx 14-12-2011 14:43:53

quebradero de cabesa.
 
facil, ya tienes un objeto q dices q es para evitar multiples instancias, y si no entiendo mal, los archivos q tiens q abrir vienen registrados en el registro de windows, puedes hacerlo de cargando un fichero a la ves, calculandolo de su tamaño y con una splash screen dinamica para q el usuario sepa q se esta cargando la aplicacion, le podrias pasar el nombre del archivo q se esta abriendo., y para saber si tu aplicacion ya cargo totalmente, al ejecutarse el parametro run, y se muestra la primera ventana q tengas asignada aosea la forma principal de la aplicacion, ya esta lista, jejejeje, ;):D:D, pero una manera decente si los vas a cargar desde la linea de parametros usa primero las splash screen para q el usuario sepa q esta trabajando, y si lo va a hacer con la aplicacion abierta crea un form de tiempo de espera, hago haci como cuando copeas un archivo en windows, ademas haci como lo menciona el compañero nuño, las funciones (ParamCount y ParamStr), sirven para pasarle multiples archivos a una aplicacion.

sintecsl 15-12-2011 06:06:32

Antes de nada agradeceros las respuestas y vuestro interés. Os comento, que en el arranque de (Create) la form realizo la creación del semáforo y verifico si existe (Last Errror).

Como de momento no tenia solución simplemente silenciaba el problema capturando el error con try except (Cuestión de estética).

Y si creo que la solución debe estar en la forma de parametrizar la línea de comandos al registrar la extenxión asociada a la aplicación.
En este caso tengo este objeto que utilizo siempre que se crea la form :

Código Delphi [-]
........

//Registramos nuestro ejecutable para asociarlo a las extensiones .PRESUPUESTO
     RegistraExtension1.RegistraExt('.PRESUPUESTO',
                       'Fichero PRESUPUESTO','PRESUPUESTOS',Application.ExeName,0);
..........

El código de la misma es el siguiente (Unidad completa) :

Código Delphi [-]

{
 Referencia rápìda :

    Extension : Extensión del fichero a asociar con el ejecutable
    Descripcion : Lo que aparece en el explorador de windos al lado como descripción
    Tipo : Identificador dentro del registro (no se debe repetir pues machaca el existente)
    Ejecutable : El fichero que ejecutara a la extensión asociada y el path completo
    IndiceIcono : El icono que se mostrará para la extensión buscando desde
                  el ejecutable (0 -> es el que tiene por defecto)
    }

unit RegistraAplicacion;
//{$R RegistraAplicacion.dcr}

interface
Uses classes, Forms;

Type

TRegistraExtension = class(TComponent)
  private
  protected
  public
     procedure RegistraExt(Extension,
                           Descripcion,
                           Tipo,
                           Ejecutable : string;
                           IndiceIcono: integer);
     procedure EliminaExt(Extension,
                          Tipo : String);
  published
end;

procedure Register;

implementation

Uses Registry, Windows, ShlObj, SysUtils;

{ TRegistraExtension }

procedure Register;
begin
  RegisterComponents('UTIL', [TRegistraExtension]);
end;

procedure TRegistraExtension.EliminaExt(Extension, Tipo: String);
Var
  Reg :TRegistry;
Begin
    Reg := TRegistry.Create;
    try
      Extension:=AnsiUpperCase(Extension); //Mayusculas
      If Pos('.',Extension)<>1 Then Extension:='.'+Extension; //Aseguramos
     If (Extension='.EXE') Or (Extension='.COM') Or
        (Pos('?',Extension)>0) Or (Pos('*',Extension)>0)
        Then Extension:=''; //Borramos prohibidos
     If (Extension='') Or (Tipo='') Then Exit; //No hay nada
     with Reg do
      Begin
     (*   RootKey := HKEY_CLASSES_ROOT;
        OpenKey(Extension, True);
        DeleteKey(Extension);
        CloseKey;
        OpenKey(Tipo, True);
        DeleteKey(Tipo);
        CloseKey;   *) //De momento no funciona
      End;
    finally
      Reg.Free;
    End
end;

procedure TRegistraExtension.RegistraExt(Extension,
                                         Descripcion,
                                         Tipo,
                                         Ejecutable : string;
                                         IndiceIcono: integer);
Var
  Reg :TRegistry;
Begin
  Reg := TRegistry.Create;
    try
      Extension:=AnsiUpperCase(Extension); //Mayusculas
      If Pos('.',Extension)<>1 Then Extension:='.'+Extension; //Aseguramos
     If (Extension='.EXE') Or (Extension='.COM') Or
        (Pos('?',Extension)>0) Or (Pos('*',Extension)>0)
        Then Extension:=''; //Borramos prohibidos
     If Extension='' Then Exit; //No hay nada
     If Descripcion='' Then //Si no hay descripción la creamos en base el EXE
        Descripcion:=ChangeFileExt(ExtractFileName(Application.ExeName),'');
     If (Ejecutable='') Or Not FileExists(Ejecutable) Then
        Ejecutable:=Application.ExeName;
     If Tipo='' Then Tipo:=Descripcion;
      with Reg do
      Begin
        RootKey := HKEY_CLASSES_ROOT;
        OpenKey(Extension, True);
        WriteString('', Tipo);  //TIPO es la llave para acceder al resto del arbol
        CloseKey;
        OpenKey(Tipo, True);
        WriteString('', Descripcion);
        CloseKey;
        OpenKey(Tipo+'\DefaultIcon', True);
        WriteString('', Ejecutable + ',' + IntToStr(IndiceIcono));
        CloseKey;
        OpenKey(Tipo+'\Shell\Open', True);
        WriteString('', '&Abrir');
        CloseKey;
        OpenKey(Tipo+'\Shell\Open\Command', True);
        WriteString('', '"' + Ejecutable + '" "%1"'); --> CREO KE AKÍ ES DONDE ESTA MAL PARAMETRIZADO
        CloseKey;
      End;
     //Nos permite actualizar las ventanas
 (*     SHChangeNotify( SHCNE_ASSOCCHANGED,
                      SHCNF_IDLIST,
                      nil, nil);         *)
    finally
      Reg.Free;
    End
End;

(*  EJEMPLO DE USO :

 Registramos nuestro ejecutable para asociarlo a las extensiones .PRESUPUESTO
     RegistraExtension('.PRESUPUESTO',
                       'Fichero PRESUPUESTO',
                       'PRESUPUESTOS',
                       Application.ExeName,
                       0);
     RegistraExtension('.PRESUPUESTO',
                       'Fichero PRESUPUESTO',
                       '',
                       '',
                       0);
*)

end.

Editaré el registro de alguna aplicación (como un editor de textos) y miraré como resuelve el tema paramétrico en Open. Seguro que ahí tendré la respuesta.

Gracias a tod@s.:)


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

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