Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-12-2011
Avatar de sintecsl
sintecsl sintecsl is offline
Miembro
 
Registrado: jun 2008
Ubicación: Barcelona - Spain
Posts: 40
Poder: 0
sintecsl Va por buen camino
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...
__________________
www.sintecsl.es
Responder Con Cita
  #2  
Antiguo 13-12-2011
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 14-12-2011
Avatar de thecidmx
thecidmx thecidmx is offline
Miembro
NULL
 
Registrado: oct 2011
Posts: 93
Poder: 13
thecidmx Va por buen camino
Thumbs down 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, , 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.
__________________
La mejor forma de aprender es, compartir el conocimiento adquirido.

Última edición por thecidmx fecha: 14-12-2011 a las 14:49:00.
Responder Con Cita
  #4  
Antiguo 15-12-2011
Avatar de sintecsl
sintecsl sintecsl is offline
Miembro
 
Registrado: jun 2008
Ubicación: Barcelona - Spain
Posts: 40
Poder: 0
sintecsl Va por buen camino
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.
__________________
www.sintecsl.es
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evento para saber cuando se fuerza el cierre de una aplicación APO OOP 1 08-12-2011 14:20:56
Como saber mediante hook cuando se abre o cierra una aplicacion JoAnCa API de Windows 2 15-11-2008 20:05:48
Internet Explorar: Saber si ha terminado de cargar WEB. Jose_Pérez Internet 3 11-09-2007 14:18:44
Saber cuando ingresan a tu PC genius Varios 4 11-12-2006 14:47:52
¿Cómo puedo saber desde mi aplicación cuándo se abre por primera vez? nuri Varios 7 21-07-2005 14:07:51


La franja horaria es GMT +2. Ahora son las 04:51:12.


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
Copyright 1996-2007 Club Delphi