Ver Mensaje Individual
  #5  
Antiguo 02-04-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
jplj,

Cita:
Empezado por jplj
...Volver a mostrar una ventana abierta con ShellExecute..."traer al frente" el documento abierto, y no tener que "abrir" una nueva copia...En principio cualquier tipo de archivo que suela ser empleado para almacenar información...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

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');
   FilePrg : Array[0..3] of String = (' - NotePad',
                                      ' - Microsoft Excel',
                                      ' - Adobe Reader',
                                      ' - Windows Photo Viewer');

var
   Form1: TForm1;

implementation

{$R *.dfm}

// 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;

begin

  WindowName := FileName[ListBox1.ItemIndex] + FilePrg[ListBox1.ItemIndex];

  WindowHandle := FindWindow(nil,PChar(WindowName));

  if SetForegroundWindow(WindowHandle) then
     ShowWindow(WindowHandle, SW_SHOWNORMAL)
  else
     ShellExecute(0, nil, PChar(FileName[ListBox1.ItemIndex]),'', '',SW_SHOWNORMAL);

end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite abrir 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) o abrirla nuevamente si esta fue previamente cerrada, en resumen: Se abre una sola ventana por archivo seleccionado.

Nota: Es fundamental que se coloque el nombre correcto de la aplicación (Como aparece en la ventana de la misma), en el formato: " - ApplicationName", si lo anterior no es correcto la aplicación se abrirá tantas veces como sea llamada.

Revisa esta información:
Espero sea útil

Nelson.
Responder Con Cita