Lancer un document

Product :4D - 4D Server
OS : Windows

Bonjour,

J’ai une listbox qui affiche les documents contenus dans un dossier du
disque.
Ces documents peuvent être de différents types : doc, pdf, xls…
Je voudrais que l’utilisateur puisse ouvrir l’un d’entre eux par un
double-clic sur la ligne de ma listbox comme il le ferait dans
l’Explorateur Windows.

J’ai tenté d’utiliser LAUNCH EXTERNAL PROCESS et j’ai consulté la doc
de cette commande, notamment l’exemple :

  1. Pour lancer l’application Microsoft® Word® et ouvrir un document
    spécifique (à noter l’emploi de deux “”) :
    $mondoc:=“C:\Program Files\Microsoft Office\Office10\WINWORD.EXE
    “C:\Documents and
    Settings\JeanMarc\Bureau\MesDocs\Nouveau dossier\essai.xml””
    LAUNCH EXTERNAL PROCESS($mondoc;$tIn;$tOut)

1° on dirait qu’il faut toujours préciser l’adresse de l’exécutable avant celle du dossier à ouvrir ce qui pose 2 problèmes :

  • cela empêche de respecter le choix de l’utilisateur d’ouvrir tel type de fichier avec tel exécutable plutôt qu’un autre (par xemple : le choix de son lecteur de pdf)
  • cela suppose de graver dans le code une adresse fixe pour l’exécutable :
  • sans savoir s’il sera présent sur le disque de l’utiisateur
  • alors que cette adresse risque de varier selon la version de l’OS
    (32/64 bits, Server ou non…)
    N’y-a-t-il pas un moyen de passer uniquement l’adresse du document et que Windows lance l’exécutable correspondant comme il le fait quand on fait un double-clic sur un document dans l’Explorateur. ?

2° j’ai essayé de fabriquer par code l’équivalent de la ligne présentée en exemple :
$doc:=“D:\Nouveautés.pdf”
$app:=“C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe”
$lep:=$app+$char(Space)+Folder separator+char(Double quote)+$doc+Folder separator+char(Double quote)
LAUNCH EXTERNAL PROCESS($lep)

Acrobat Reader se lance bien mais retourne un message d’erreur concernant l’adresse du document
En trace, la variable $lep affiche “C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe \“D:\Nouveautés.pdf\””
Les anti-slash en rouge ont été doublés. J’ignore si c’est la cause de mon problème.

J’imagine que je ne suis pas le seul à vouloir ouvrir un document depuis 4D.
Comment faites-vous ?

Bonjour Bernard

Le plus simple c’est OPEN URL($Path)…
ça ouvrira le doc avec l’application par défaut.

Roland

Essaie https://doc.4d.com/4Dv17R5/4D/17-R5/OUVRIR-URL.301-4127700.fr.htmlOUVRIR URL>($leChemin). Quand tout se passe bien, ça ouvre le document avec l’application par défaut du poste, et, au besoin, on peut préciser l’application à utiliser en second paramètre.

4 minutes dans la vue ; il y a trop de Lucky Luke sur ce forum.

Merci à Luke et Roland,

C’est exactement ce que je cherchais et ça marche au poil.

Dites, monsieur 4D, pourriez-vous ajouter un petit renvoi (ou mieux : un petit paragraphe) sur la page de la commande LAUNCH EXTERNAL PROCESS vers celle d’OPEN URL (et réciproquement) ? Cela m’aurait évité de perdre 2 heures ce matin à bricoler avec des anti-slash pour rien.

Cela dit, cela n’explique pas pourquoi mon code utilisant cette #@$% de commande LAUNCH EXTERNAL PROCESS ne fonctionne pas.

bonjour Bernard.

bonne idée, c’est fait :wink:

Super ! C’est déjà en ligne ?

Je ne le vois pas encore dans la https://livedoc.4d.com/4D-Langage-17-R6/Outils/LANCER-PROCESS-EXTERNE.301-4310854.fr.htmllivedoc>.
Il a dû demander à Cortana, qui va en parler à Alexa, et cœtera :mrgreen:

Bonjour,

Si ça peut servir, j’ai créé cette méthode qui fonctionne bien chez moi sur Mac et Windows.

<code 4D>
// GG_Doc_Ouvrir_ToutePlateforme
// ouvre un doc d’après son chemin et la var de plateforme sur Pc ou Mac
// Michel Troya CREATION 2019-02-06

C_TEXTE($1) // chemin du doc à ouvrir
C_TEXTE($chemin)

Si (Tester chemin acces($1)=Est un document)

Si (Sur Windows)
	FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_HIDE_CONSOLE";"true")
	LANCER PROCESS EXTERNE("cmd /c "+$1+"\\")
	  //_o_AP ShellExecute($1)// si V<16 et que ligne précédente ne fonctionne pas
Sinon   // Sur Mac
	$chemin:=Convertir chemin système vers POSIX($1)
	LANCER PROCESS EXTERNE("open \""+$chemin+"\"")
	  //_o_AP ShellExecute($1)// si V<16 et que ligne précédente ne fonctionne pas
Fin de si 

Sinon
ALERTE(Nom méthode courante+" : ceci n’est pas un document ouvrable\r\r"+$1)
Fin de si

</code 4D>

Merci Michel.

Mais persiste-t-il un avantage à utiliser LANCER PROCESS EXTERNE plutôt que OUVRIR URL ?
(prosélytisme du converti ;-))

N’y a-t-il pas un risque au contraire (par exemple : autorisation de l’utilisateur à accéder aux lignes de commande ?

tout à fait d’accord dans 95% des cas, OUVRIR URL est vraiment simple et efficace.

De ma mauvaise mémoire, il me semble que c’était dans un réseau d’entreprise très protégé en V13, et que OUVRIR URL WEB ne fonctionnait pas de façon aussi transparente que dans une configuration classique.

Mais en général, je suis d’accord qu’OUVRIR URL est beaucoup plus simple et permet en plus de ne pas lancer l’application par défaut mais une autre si on le souhaite !

Bon, alors je garde ta méthode sous le coude pour les 5% restant :-?