Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Expert éminent sénior
    Changement de manière d'ouvrir un dossier, maintenant ça ne fonctionne plus.
    Bonjour,

    In the good old time Dans le bon vieux temps, je cliquais sur un bouton et la procédure OpenDocument(dossier); m'ouvrait l'explorateur à l"adresse demandée dans mon arborescence de dossiers.
    Ça s'appuyait sur ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function FpAccess (pathname : AnsiString; aMode : cInt): cInt; {$ifdef VER2_0}inline;{$endif}
    Begin
      FpAccess:=FpAccess(pchar(pathname),amode);
    End;

    que je ne sais pas lire, que je ne comprends pas, mais qui fonctionne.

    À notre époque moderne, avec FPC 3.2 et Laz 2.0.10 ça ne fonctionne plus, on passe par FileExists qui fait une vérification et sort sans rien ouvrir s'il s'agit d'un dossier. Or il s'agit bien d'un dossier et moi je veux le voir ouvert.

    Comment faire, maintenant ?
    J'ai un peu regardé dans FileUtil.pas sans rien trouver d'intéressant. J'ai aussi un peu googlé mais là c'est l'océan qui s'ouvre, sans qu'il n'en sorte rien de bon,

    Vous faites comment, vous ? Merci,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert confirmé
    hello,
    il y a des choses que tu ne nous as pas dites :

    1 - Sous quel O.S ? il me semble que fpaccess c'est plutôt du côté linux.
    2 - Qu'entends-tu par explorateur ? l'explorateur de fichiers ? l'explorateur graphique ? sous quel toolkit alors ?

    Ami calmant, J.P (santé)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert éminent sénior
    Citation Envoyé par jurassic pork Voir le message
    hello,
    il y a des choses que tu ne nous as pas dites :

    1 - Sous quel O.S ? il me semble que fpaccess c'est plutôt du côté linux.
    2 - Qu'entends-tu par explorateur ? l'explorateur de fichiers ? l'explorateur graphique ? sous quel toolkit alors ?

    Ami calmant, J.P (santé)
    Ah oui, la journée m'a épuisé, désolé.

    1- Oui, Linux Debian Buster 10.6
    2- Explorateur de fichiers (pcmanfm, si ça te parle), sous gtk.

    Merci,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Expert confirmé
    hello,
    sous centos8, j'ai le même souci rien ne s'ouvre quand j'appelle la fonction opendocument avec un nom de répertoire :
    [CODE]
    // uses lclintf,
    OpenDocument('/home/jurassic'); [ [/CODE]

    j'ai retrouvé le code de OpenDocument que voici :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    function OpenDocument(APath: String): Boolean;var
      lApp: string;
    begin
      // Android uses this
      if Assigned(OpenDocumentWidgetsetImplementation) then
      begin
        Result := OpenDocumentWidgetsetImplementation(APath);
        Exit;
      end;
     
     
      Result := True;
      if not FileExistsUTF8(APath) then exit(false);
     
      lApp:=FindFilenameOfCmd('xdg-open'); // Portland OSDL/FreeDesktop standard on Linux
      if lApp='' then
        lApp:=FindFilenameOfCmd('kfmclient'); // KDE command
      if lApp='' then
        lApp:=FindFilenameOfCmd('gnome-open'); // GNOME command
      if lApp='' then
        Exit(False);
     
     
      if (APath<>'') and (APath[1]<>'"') then
        APath:=QuotedStr(APath);
      RunCmdFromPath(lApp,APath);
    end;


    Pour déboguer , j'ai recréé dans mon projet la fonction pour voir où cela coinçait. Et bien c'est tout simple c'est le if not FileExistsUTF8(APath) qui fait sortir de la fonction avant la fin. Si je le mets en commentaire j'ai bien l'explorateur de fichier qui s'ouvre.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //  uses lclintf,UTF8Process, LazFileUtils,
    function OpenDocumentJP(APath: String): Boolean;
    var
      lApp: string;
    begin
      // Android uses this
      if Assigned(OpenDocumentWidgetsetImplementation) then
      begin
        Result := OpenDocumentWidgetsetImplementation(APath);
        Exit;
      end;
     
     
      Result := True;
    //  if not FileExistsUTF8(APath) then exit(false);
     
     
      lApp:=FindFilenameOfCmd('xdg-open'); // Portland OSDL/FreeDesktop standard on Linux
      if lApp='' then
        lApp:=FindFilenameOfCmd('kfmclient'); // KDE command
      if lApp='' then
        lApp:=FindFilenameOfCmd('gnome-open'); // GNOME command
      if lApp='' then
        Exit(False);
     
     
      if (APath<>'') and (APath[1]<>'"') then
        APath:=QuotedStr(APath);
      RunCmdFromPath(lApp,APath);
    end;
     
     
    { TForm1 }
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenDocumentJP('/home/jurassic');
    end;


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Rédacteur/Modérateur

    Bonjour ! Beau travail JP.

    Est-ce un bug ou est-ce tout simplement que la fonction n'est pas faite pour ça (et qu'au bon vieux temps ça ne marchait que par miracle) ? Pour ma part, quand j'entends "document" je ne pense pas à un dossier.

    Sinon (je ne vais rien vous apprendre) mais on pourrait faire comme ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses 
      SysUtils, Process;
     
    function ExploreDirectory(const ADir: string): boolean;
    var 
      s: string;
    begin
      result := RunCommand('xdg-open', [ADir], s);
    end;
     
    begin
      WriteLn(ExploreDirectory('/home/roland/Documents'));
    end.


    À adapter bien sûr, en remplaçant éventuellement 'xdg-open'.

    Bon dimanche (et même bonne fête) !

  6. #6
    Membre expert
    Salut à tous OpenDocument n'est pas fait pour ouvrir un dossier mais comme son nom l'indique un document donc un fichier FileExistsUTF8 vérifie si un fichier existe et pas un dossier. Par contre là ou je vous rejoins c'est que les devs auraient pu renommer le paramètre APath qui est contradictoire avec la fonction. Ou la remanier et la renommer du genre (à l'arrache, et non testé) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Uses
      LazFileUtils;
     
    function OpenDocumentOrDirectory(APath: String): Boolean;
    var 
      lApp: string;
      lpath, lFileName : String;
    begin
      // Android uses this
      if Assigned(OpenDocumentWidgetsetImplementation) then
      begin
        Result := OpenDocumentWidgetsetImplementation(APath);
        Exit;
      end;
     
      Result := True;
     
      if pos('.', APath) > 0 then  // vérifie, si il y a une extension.Si oui,  le paramètre contient un nom de fichier
        lPath := ExtractFilePath(APath)
      else 
        lPath := ExtractFilePath(IncludeTrailingPathDelimiter(APath)) // Sinon on s'assure qui il y le délimiteur à la fin "/" ou "\"
     
      lFileName := ExtractFileName(APath);  
     
      if lFIleName <> '' then
      begin
        if not FileExistsUTF8(APath) then exit(false);
      end
      else
      begin
         if lPath = '' then exit(false);
         if not DirPathExists(APath) then exit(false); // ou utiliser la fonction DirectoryExist
         APath := IncludeTrailingPathDelimiter(APath); // Pas sur si c'est obligé
      end;
     
      lApp:=FindFilenameOfCmd('xdg-open'); // Portland OSDL/FreeDesktop standard on Linux
      if lApp='' then lApp:=FindFilenameOfCmd('kfmclient'); // KDE command
      if lApp='' then lApp:=FindFilenameOfCmd('gnome-open'); // GNOME command
      if lApp='' then Exit(False);
     
     
      if (APath<>'') and (APath[1]<>'"') then  APath:=QuotedStr(APath);
      RunCmdFromPath(lApp,APath);
     
    end;


    Bon Dimanche à tous

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert éminent sénior
    Citation Envoyé par jurassic pork Voir le message
    Et bien c'est tout simple c'est le if not FileExistsUTF8(APath) qui fait sortir de la fonction avant la fin. Si je le mets en commentaire j'ai bien l'explorateur de fichier qui s'ouvre.
    Bien joué mais c'est pas glop : si la fonction est utilisée ailleurs et que le fichier n'existe pas, c'est une erreur qui va être générée, non ?

    Citation Envoyé par BeanzMaster Voir le message
    OpenDocument n'est pas fait pour ouvrir un dossier mais comme son nom l'indique un document
    Sans doute, mais c'est très certainement une recherche internet qui m'a suggéré cette manière de faire. Après tout, un document c'est un fichier avec un certain format (.doc, .xml, .bmp, etc.) et un dossier c'est pareil, il n'y a que le format des données qui change.

    Sinon, elle sort d'où ta procédure ? Il me semble l'avoir croisée lors de mon débug en pas-à-pas, et je lui trouve un épouvantable défaut :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if pos('.', APath) > 0 then  // vérifie s'il y a une extension. Si oui, le paramètre contient un nom de fichier
        lPath := ExtractFilePath(APath)
      else 
        lPath := ExtractFilePath(IncludeTrailingPathDelimiter(APath)) // Si non, on s'assure qu'il y a le délimiteur à la fin "/" ou "\"

    c'est quoi ce test chelou sous Linux : un fichier (même sous Windows, au fait) peut ne pas avoir d'extension,
    et a contrario un dossier peut avoir un nom avec extension, donc là c'est source d'ennuis...

    Et le vainqueur est
    Citation Envoyé par Roland Chastain Voir le message
    (et qu'au bon vieux temps ça ne marchait que par miracle) ?
    Non, c'était écrit autrement, sans doute.

    J'ai donc copié/collé sans vergogne ta ligne de code en remplaçant xdg-open qui ne fonctionne pas chez moi sur un dossier par l'appel à l'explorateur par défaut du système :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      EXPLORATEUR : string = '/usr/bin/pcmanfm'; // à mettre dans l'ini à terme, pour pouvoir changer de binaire sans tout recompiler
     
    //  SysUtils, Process;
    function ExploreDirectory(const aDir: string): boolean;
    var
      s: string;
    begin  // https://www.developpez.net/forums/d2094653/autres-langages/pascal/lazarus/changement-maniere-d-ouvrir-dossier-ca-ne-fonctionne-plus/#post11638971
    //  result := RunCommand('xdg-open', [aDir], s);   // Roland Chastain.
      result := RunCommand(EXPLORATEUR, [aDir], s);
    end;


    Merci à tous et ,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

###raw>template_hook.ano_emploi###