Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Febbraio 21, 2013, 02:02:14 pm

Titolo: Windows: aprire file con applicativo di default
Inserito da: bonmario - Febbraio 21, 2013, 02:02:14 pm
Ciao a tutti,
ho sempre usato "LCLIntf.OpenDocument" per aprire un file con l'applicativo associato alla sua estensione.
Oggi, però mi hanno fatto notare che se non ho nessun applicativo associato a quell'estensione, "LCLIntf.OpenDocument" non fa niente, mentre se un utente fa il "doppop click" da esplora risorse su quel file gli esce la finestrella con cui può scegliere con quale applicativo aprire il file.

Al momento ho bypassato il problema creando un file bat che esegue la seguente istruzione:
Codice: [Seleziona]
start <NomeFile>

ma mi piacerebbe sapere se c'è già qualche istruzione che fa la stessa cosa.

Grazie in anticipo, Mario
Titolo: Re:Windows: aprire file con applicativo di default
Inserito da: xinyiman - Febbraio 21, 2013, 05:23:28 pm
Purtroppo io non mi ci sono mai imbattuto, magari qualche altro utente.
Titolo: Re:Windows: aprire file con applicativo di default
Inserito da: Microges2000 - Febbraio 28, 2013, 08:47:01 am
Usa OpenDocument (unit LCLIntf) e passagli il file da aprire, funziona un po' con tutto
L'ho provato con doc, pdf, txt, jpg, html, java ed anche con indirizzi web
Titolo: Re:Windows: aprire file con applicativo di default
Inserito da: bonmario - Febbraio 28, 2013, 10:15:34 am
Grazie,
è proprio quello che uso già (vedi il mio primo post).
Il problema è questo: se io uso OpenDocument per aprire un pdf sul mio PC, su cui ho associato l'estensione pdf ad Acrobat Reader, mi apre il file.
Se lo faccio su un PC su cui non è stata associato nessun programma all'estensione pdf, non succede nulla.
Se invece faccio doppio click sul file pdf, mi esce la finestrella con cui Windows mi chiede con quale applicativo voglio aprire quel file. Questo è il comportament che vorrei avere e che adc oggi ottengo solo col metodo che ho scritto nel primo post.

Ciao, Mario
Titolo: Re:Windows: aprire file con applicativo di default
Inserito da: Stilgar - Febbraio 28, 2013, 11:07:40 am
Mario .. quello che indichi tu come "voluto" è un comportamento di Explorer ... mica del "kernel" ...
Devi aprire anche tu la finestrella delle applicazioni associate.
Codice: [Seleziona]
 if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    ws := UTF8Decode(AURL);
    Result := ShellExecuteW(0, 'open', PWideChar(ws), nil, nil, SW_SHOWNORMAL) > 32;
  end
  else
  begin
    ans := Utf8ToAnsi(AURL); // utf8 must be converted to Windows Ansi-codepage
    Result := ShellExecute(0, 'open', PAnsiChar(ans), nil, nil, SW_SHOWNORMAL) > 32;
  end;   
Questo è il pezzo di codice che apre il documento tramite la shell.
Info sull'api di window.
Codice: [Seleziona]
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx

Stilgar

edit:
Sarebbe da indagare nella direzione:
SE_ERR_ASSOCINCOMPLETE
Titolo: Re:Windows: aprire file con applicativo di default
Inserito da: Microges2000 - Febbraio 28, 2013, 11:18:23 am
Ora ho capito.

Dunque se lavori sotto windows (e solo li) puoi usare una funzione tipo questa:

Codice: [Seleziona]
Procedure TForm1.Apri_File(Const Nome_File : String);
Var
  Proc : TProcess;
begin
  If Not OpenDocument(Nome_File) Then
     Begin
       Proc := TProcess.Create(nil);
       Proc.CommandLine := 'cmd.exe /C start '+Nome_File;
       Proc.Execute;
       Proc.Free;
     end;
end;

praticamente tenta di aprire il documento con l'applicativo standard, se non ci riesce richiama il dialogo "Apri Con...." di sistema utilizzzando la una chiamata a shell dos.
Ovviamente la dicitura "cmd.exe /C start" è valida solamente per windows e significa:

cmd.exe - richiama la shell DOS standard -
/C - il comando sarà un comando standard (come dir, echo, etc...)
start - è è il comando vero e proprio che richiama il sottoservizio di windows