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 02-04-2014
jplj jplj is offline
Miembro
 
Registrado: oct 2003
Posts: 189
Poder: 21
jplj Va por buen camino
Muchas gracias por vuestra ayuda ...

Voy a trabajar con las ideas que me habéis proporcionado, y comentaré la solución si la hayo o los problemas que me encuentre.

De todas formas un par de apuntes rápidos:
  • Cuando decía
    Cita:
    ... aplicación que muestra un digamos "listado de documentos" que ...
    Era un simplificación, realmente se muestra una información de los documentos de una forma bastante más compleja.

  • La idea propuesta por nlsgarcia:
    Cita:
    WindowName := FileName[ListBox1.ItemIndex] + FilePrg[ListBox1.ItemIndex];
    WindowHandle := FindWindow(nil,PChar(WindowName));
    Es lo que he intentado pero me encontre que no fuí capaz de averiguar el nombre de la ventana.
    • ¿El standar de título de una ventana es NombreFichero + ' - ' + NombreAplicación?
    • Se presupone que conocemos por anticipado el nombre de la aplicación que abrirá el documento, y en mi caso no es así. ¿Sería posible conocer en tiempo de ejecución cuál es la aplicación predeterminada para abrir un tipo determinado de archivo?, creo que conseguirlo sería la mejor forma solucionar el problema.

Lo dicho, muchas gracias
__________________
Sonríe. Mañana puede ser peor.
Responder Con Cita
  #2  
Antiguo 02-04-2014
jplj jplj is offline
Miembro
 
Registrado: oct 2003
Posts: 189
Poder: 21
jplj Va por buen camino
Repecto a ...

Cita:
◦ ... ¿Sería posible conocer en tiempo de ejecución cuál es la aplicación predeterminada para abrir un tipo determinado de archivo? ...
La solución puede ser FindExecutable function
__________________
Sonríe. Mañana puede ser peor.
Responder Con Cita
  #3  
Antiguo 02-04-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
jplj

Cita:
Empezado por jplj
¿El standard de título de una ventana es NombreFichero + ' - ' + NombreAplicación?
Si es correcto

Cita:
Empezado por jplj
¿Sería posible conocer en tiempo de ejecución cuál es la aplicación predeterminada para abrir un tipo determinado de archivo?
Si es posible, sin embargo lo que se requiere en tu caso es el nombre de la ventana en el formato NombreFichero + ' - ' + NombreAplicación, por lo cual el nombre de la aplicación por default (Ejecutable en Disco), no corresponderá necesariamente con el nombre de la aplicación en la ventana de la misma en el formato anteriormente mencionado.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ComCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
   FileName : Array[0..3] of String = ('Nelson.txt', 'Nelson.xlsx', 'Nelson.pdf', 'Nelson.jpg');

var
   Form1: TForm1;

implementation

{$R *.dfm}

// Obtiene la lista de Ventanas Activas
function EnumWndProc(Handle: HWND; LP: TStrings): BOOL; stdcall;
var
   WindowName: array[0..128] of Char;
   AuxStr: string;

begin

   Result := True;

   SendMessage(Handle, WM_GETTEXT, Sizeof(WindowName), integer(@WindowName));

   SetString(AuxStr ,PChar(@WindowName[0]), Length(WindowName));

   AuxStr := LowerCase(AuxStr);

   if (AnsiPos('.txt', AuxStr) > 0)
   or (AnsiPos('.xlsx', AuxStr) > 0)
   or (AnsiPos('.pdf', AuxStr) > 0)
   or (AnsiPos('.jpg', AuxStr) > 0)
   then
      LP.Add(WindowName);

end;

// Inicializa un TListBox con archivos de Windows
procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;
begin
   for i  := Low(FileName) to High(FileName) do
      ListBox1.Items.Add(FileName[i]);
end;

// Abre una sola ventana de un archivo con su aplicación por default en Windows
procedure TForm1.Button1Click(Sender: TObject);
var
   WindowHandle : THandle;
   WindowName : String;
   ListPrg : TStringList;
   i : Integer;

begin

   ListPrg := TStringList.Create;

   EnumWindows(@EnumWndProc, LPARAM(ListPrg));

   WindowName := EmptyStr;

   for i := 0 to ListPrg.Count - 1 do
      if AnsiPos(FileName[ListBox1.ItemIndex],ListPrg.Strings[i]) > 0 then
      begin
         WindowName := ListPrg[i];
         Break;
      end;

   if WindowName = EmptyStr then
      ShellExecute(0, nil, PChar(FileName[ListBox1.ItemIndex]),'', '',SW_SHOWNORMAL)
   else
   begin
      WindowHandle := FindWindow(nil,PChar(WindowName));

      if SetForegroundWindow(WindowHandle) then
         ShowWindow(WindowHandle, SW_SHOWNORMAL);
   end;

   ListPrg.Free

end;

end.
El código anterior (Versión 2 del código del Msg #5) en Delphi 7 bajo Windows 7 Professional x32, permite abrir de forma automática los archivos contenidos en el TListBox con su aplicación por default en Windows por medio de ShellExecute y en caso de ser seleccionados nuevamente, colocar la ventana de la aplicación en el tope del Z-Order si esta activa por medio de las APIs EnumWindows, FindWindow y SetForegroundWindow o abrirla nuevamente si esta fue previamente cerrada, en resumen: Se abre una sola ventana por archivo seleccionado.

Nota: El nombre de la ventana (Segundo parámetro de la funcion FinWindow), debe estar en el formato "DocumentName - ApplicationName" el cual es obtenido de forma automática por medio de la función EnumWindows.

Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 02-04-2014 a las 15:49:27.
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
Volver a Mostrar los registros de un Dbgrid despues de haber echo una consulta verde_esmeralda PHP 0 20-05-2011 19:03:38
TThread y cerrar una ventana previamente abierta gluglu OOP 1 14-05-2007 19:19:54
Enviar texto a la ventana abierta Mr.Vaka Varios 4 28-11-2005 18:57:31
Volver a mostrar un formulario creado dinámicamente. jplj Varios 2 10-02-2005 13:19:27
abrir .htm en una nueva ventana con shellexecute ruina API de Windows 5 24-06-2004 19:47:54


La franja horaria es GMT +2. Ahora son las 02:21:08.


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