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 10-02-2007
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
Question Abrir varios archivos asociados a la aplicacion

Buenas!

La pregunta es: ¿ Cómo puedo seleccionar en el explorador de Windows varios archivos del mismo tipo y, mediante el menu contextual, abrirlos en una unica instancia de la aplicacion? La idea es editar las etiquetas de varios mp3 a la vez, evidentemente solo las comunes a todos ellos ( album, artista, genero...)

No me sirve ParamStr ni ParamCount ya que Windows lo que hace es intentar abrir una instancia por cada archivo seleccionado, con lo cual ParamStr contendria un solo archivo...diferente para cada instancia

Al evitar que haya dos instancias, mediante un mutex, solo se recibe uno de los archivos, el que corresponda a la primera instancia que se haya abierto

Buscando por internet he encontrado una solucion que consiste en que una vez comprobado que ya hay una instancia anterior, mandarle ,antes de cerrarse, un mensaje con el parametro que haya recibido esta ultima instancia...no se si se entiende o si yo lo entendi bien. Intento explicarme mejor:

1 - Seleccionamos 5 mp3 en el explorador de windows
2 - Mediante el menu contextual elegimos "Editar tag"
3 - Se abre una primera instancia (1) del programa que recibe como parametro uno de los archivos seleccionados (archivo 1)
4 - Una segunda instancia (2) se abre con otro archivo como parametro (archivo 2) pero como comprueba que ya existe una instancia anterior (la 1) le manda un mensaje (Sendmessage) a la instancia 1 con el path del archivo 2 y se cierra la instancia 2.
5- Se abre una tercera instancia....y asi sucesivamente

Espero haberlo dejado algo mas claro

La duda que me surge con este metodo es que si por ejemplo, un dia me "apetece" editar 10000 mp3 a la vez se abririan 10000 instancias del programa, mandarian 9999 mensajes a la primera instancia y se cerrarian...¿ puede suponer eso un problema, tanto de recursos como de proceso de los mensajes? Porque si cada instancia tarda cierto tiempo en abrirse...

Seria mucho mejor algo parecido al multiselect de los open dialogs, que los diferentes archivos se mandaran directamente a una sola instancia del programa...No se si eso sera posible pero supongo que debe haber otra alternativa ya que si selecciono 7 archivos .pas se me abre una sola instancia de Delphi, o eso creo, ya que Delphi tarda bastante en abrirse con lo que para abrir 7 instancias se tomaria su tiempo, cosa que no ocurre

Asi que:

¿Lo entendi bien?
¿Es el mejor metodo?
¿Alguna alternativa?

Un saludo.
JMGR
Responder Con Cita
  #2  
Antiguo 10-02-2007
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
En espera de una alternativa estoy intentando usar el metodo de los mensajes, explicado aqui, pero no hay manera...

El codigo es el siguiente:

Código Delphi [-]
procedure TMP3Tagform.FormCreate(Sender: TObject);
begin
CreateMutex(nil, false, 'mp3editor');
if GetLastError=ERROR_ALREADY_EXISTS then
 begin
  mandamensaje(paramStr(1));
  halt;
 end;
IDtag:=TID3v1.Create;
if ParamStr(1)<>'' then
 begin
   btnfile.enabled:=false;
   IDtag.ReadFromFile(ParamStr(1));
   leedatos;
   edarc.Text:=GetLongFileName(ParamStr(1));
 end;
end;

procedure TMP3Tagform.mandamensaje(mensaje:string);
var
   copyDataStruct : TCopyDataStruct;
begin
   copyDataStruct.dwData := 0
   copyDataStruct.cbData := 1 + Length(mensaje) ;
   copyDataStruct.lpData := PChar(mensaje) ;
   SendData(copyDataStruct)
end;

procedure TMP3Tagform.SendData(copyDataStruct: TCopyDataStruct);
var
   receiverHandle:Thandle;
   res : integer;
begin
   receiverHandle := FindWindow(PChar('TMP3Tagform'),PChar('Mp3 Tag Editor ')) ;
   if receiverHandle = 0 then
   begin
     ShowMessage('No se encuentra una instancia previa de la aplicacion!') ;
     Exit;
   end;
  res:=SendMessage(receiverHandle, WM_COPYDATA, 0, Integer(@copyDataStruct));
end;

procedure TMP3Tagform.WMCopyData(var Msg: TWMCopyData);
var
  s : string;
begin
  s := PChar(Msg.CopyDataStruct.lpData) ;
  memo1.Lines.Add(s);
  msg.result:=2006;
end;

En teoria, al seleccionar varios archivos deberian aparecer en el memo de la primera instancia, pero no aparecen. Creo que el problema esta en la manera de obtener el handle de la primera instancia con Findwindow, ya que todas las instancias tienen el mismo nombre de clase de ventana y el mismo caption por lo que al llamar a Findwindow cada instancia obtiene su propio handle y no el de la primera...

¿alguna idea?
Responder Con Cita
  #3  
Antiguo 11-02-2007
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
Solucionado, simplemente con incluir en el formcreate:
Código Delphi [-]
if GetLastError=ERROR_ALREADY_EXISTS then
 begin
  Caption:='segunda';
  mandamensaje(paramStr(1));
  halt;
 end;

Eso si, sigo queriendo saber si hay otra alternativa...
Un saludo
JMGR
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
abrir outlook desde mi aplicacion y mandar varios correos federiconqn21 Varios 2 20-09-2006 03:56:39
UPLOAD de varios archivos por código HombreSigma .NET 3 04-12-2005 15:23:07
Aplicacion predeterminado para abrir archivos Sotrono Varios 1 19-12-2004 15:22:58
¿Como dividir un archivo en varios archivos? Raisen Varios 3 24-07-2004 03:16:28
Borrar varios archivos mrmanuel Varios 5 27-05-2004 02:03:54


La franja horaria es GMT +2. Ahora son las 02:19: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
Copyright 1996-2007 Club Delphi