IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Composants VCL Delphi Discussion :

Ouvrir des fichiers de différents formats


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut Ouvrir des fichiers de différents formats
    Bonjour,
    Je voudrais pouvoir ouvrir des fichiers word, pdf ou excel par double clic sur une ligne du DBGrid.
    Le DBGrid contient les informations qui referencent les fichiers physiques.
    Par double clic sur une ligne du DBGrid on doit pouvoir ouvrir le fichier dont le chemin est connu.

    Merci bien de m'aider!

  2. #2
    Fxg
    Fxg est déconnecté
    Membre émérite
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 513
    Par défaut
    Bonsoir

    Une petite recherche et tu trouveras je pense ton bonheur Ici

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Plus 'simple' que OLE, l'utilisation de l'application associée

    voici une fonction , trouvée dans le forum mais je ne sais plus où, c'est pour cela que je la remet (toutes mes excuses à l'auteur)


    Ne pas oublier shlobj dans la liste des unités

    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
     
    function OpenFile(const Filename: string): boolean;
    { Tente d'ouvrir le fichier dont le nom est passé en argument avec
      l'application associée à son extension. Si aucune application n'est
      associée à celle-ci, le dialogue "Ouvrir avec..." est appelé. }
     var
      errCode: Cardinal;
      filePath: string;
     begin
      { On stocke le chemin pour éviter de le décoder 2 fois }
      filePath:= ExtractFilePath(Filename);
     
      { Tentative d'ouverture de l'application associée }
      errCode:= ShellExecute(0, 'Open', PChar(Filename), '',
        PChar(filePath), SW_SHOWNORMAL);
     
      { Si la tentative a échoué avec le code SE_ERR_NOASSOC, c'est que l'extension
        n'est associée à aucune application }
      if errCode = SE_ERR_NOASSOC then
        { Dans ce cas, on appelle le dialogue }
        errCode:= ShellExecute(0, 'open', 'rundll32.exe',
          PChar('shell32.dll,OpenAs_RunDLL ' + Filename),
          PChar(filePath), SW_SHOWNORMAL);
     
      { Si le code retourné par ShellExecute est supérieur à 32, alors l'opération
        a réussi, sinon c'est un code d'erreur }
      result:= errCode > 32;
    end;
    Code utilisation : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     OpenFile(chemin+nom du fichier)

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Ne pas oublier shlobj dans la liste des unités
    C'est pas plutôt ShellAPI ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut
    merci à vous pour vos reponses.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Lung Voir le message
    C'est pas plutôt ShellAPI ?
    oui , boulette , j'étais perdu dans un autre truc

  7. #7
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut
    Bonjour,
    J'ai utilisé la fonction envoyé par SergioMaster.
    j'ai mis la fonction dans l'unité de ma DataModule et je l'ai appelé ailleurs pour la tester.
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TF_courrier_arrive.Button1Click(Sender: TObject);
    var filePaths, files : string;
    begin
      filePaths := 'D:\';
      files := 'Rapport';
    OpenFile(filepaths+files);
    end;
    A la compilation il me dit ceci: types incompatibles "String" et "PAinsichar"

    Merci bien de m'aider!

  8. #8
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Tu dois certainement faire appel à la fonction OpenFile déclarée dans l'unité Windows et non celle écrite dans ton DataModule.

    @+ Claudius

  9. #9
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut
    Bonjour,
    Tu dois certainement faire appel à la fonction OpenFile déclarée l'unitée dans Windows et non celle écrite dans ton DataModule.
    Cl@udius , j'ai lu votre reponse à maintes fois mais je n'ai pas vraiment compris.

    Merci bien de m'eclaircir!

  10. #10
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Abou Zar Voir le message
    Bonjour,

    Cl@udius , j'ai lu votre reponse à maintes fois mais je n'ai pas vraiment compris.

    Merci bien de m'eclaircir!
    Préfixe l'appel à ta fonction CopyFile du nom de l'unité dans laquelle elle se trouve.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  11. #11
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut
    ok, merci bien ça marche.

    Maintenant je veux à partir de mon application Delphi pouvoir créer un document Word. Par exemple le clic d'un bouton doit me permettre d'ouvrir un document vierge sous word.

    J'ai deja jeté un coup d'oeil sur les elements OLE mais si ya d'autres solutions ça serait la bienvenue.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Là , on se rejoint
    je pense que un OpenFileName(Dir+'Nouveau Document.doc') peu faire l'affaire (quoique je n'ai pas encore essayer)
    obtenir le nom exact pour nouveau document dans ces conditions revient alors à aller rechercher dans la base de registre le nom par défaut et c'est là que cela se complique

  13. #13
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je pense que un OpenFileName(Dir+'Nouveau Document.doc') peu faire l'affaire (quoique je n'ai pas encore essayer)
    Ca m'étonnerait que ça marche, tu vas plutôt te récupérer une erreur de type fichier non trouvé.

    Il faudrait plutôt remplacer le verb "open" du ShellExecute par un autre indiquant à l'application appelée qu'elle doit créer un nouveau document.
    Peut-être "NEW" ou "CREATE" ? Les verb ne sont pas vraiment standardisés.
    Les plus courants sont EDIT, EXPLORE, OPEN, FIND et PRINT mais chaque appli peut faire ce qu'elle veut (et souvent le verb n'est pas géré et l'appli fait un OPEN dans tous les cas).

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Yop !
    Citation Envoyé par Franck SORIANO Voir le message
    Ca m'étonnerait que ça marche, tu vas plutôt te récupérer une erreur de type fichier non trouvé.
    + 1 !

    Et pourquoi pas tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      errCode:= ShellExecute(0, 'Open', PChar('winword.exe'), '',
        '', SW_SHOWNORMAL);
    Bon, code non testé j'ai pas de Delphi sous la main.

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Ca m'étonnerait que ça marche, tu vas plutôt te récupérer une erreur de type fichier non trouvé.
    Ah , oui , mais mon astuce est de créer le fichier vide avant (à la manière de Windows d'ailleurs) d'où ma recherche du nom du nouveau document .

    Vous avez peut être pu remarquer que lorsqu'on veut créer un nouveau fichier via le menu popup de windows (que j'aurais aimé pouvoir appeler d'ailleurs , cela m'aurais simplifier la tâche) c'est exactement ce qui se passe

    [edit] apres test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var nouveaufichier : String;
    begin
    Nouveaufichier:=ClientsGED.asString+'\'+'Nouveau document texte.txt';
    with TFileStream.Create(NouveauFichier, fmCreate or fmShareExclusive) do Free;
    ShellExecute(0, 'Open', PChar(NouveauFichier), '',
                 PChar(ClientsGED.asString), SW_SHOWNORMAL);
    ceci m'ouvre bien le bloc note dans mon cas

    un essai avec 'Nouveau Texte OpenDocument.odt' ouvre bien Open office et lors de la cloture il faut bien enregistrer le document sous un nouveau nom , un bémol à l'ouverture le type d'encodage est demandé

    [fin Edit]

    Donc pour généraliser la question reste bien de trouver ces 'fameux Nouveau quelque chose' dans la base de registre
    Maintenant si quelqu'un connait la solution pour le popup du menu 'nouveau' , je suis preneur . J'allais d'ailleurs poster une question dans ce sens sous la rubrique API

    [re Edit]
    pour info , la liste des extensions des nouveaux documents du popup menu se trouve ici :
    'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew'

  16. #16
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Yop !
    Citation Envoyé par SergioMaster Voir le message
    Ah, oui, mais mon astuce est de créer le fichier vide avant (à la manière de Windows d'ailleurs) d'où ma recherche du nom du nouveau document.
    Vi, mais à la manière de Word ça fonctionne aussi tip-top ! La preuve :
    Démarrer / Exécuter et saisir winword.exe et hop !, ça lance Word avec un document vierge, y a plus qu'à taper du texte dedans,

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    exact , je veux simplement aller plus loin . Soit plusieurs types de fichiers

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut Voilà , je suis aller plus loin
    les associations de programme dépendant de chaque machines , voici les résultats de mes cogitations

    j'ai utilisé l'API 'AssocQueryStringA' fonctionnant à partir de XP
    pour obtenir toutes les informations nécessaires à l'ouverture d'un fichier selon son extension .
    J'ai beaucoup cherché dans les codes DELPHI , et celle-ci n'a pas l'air d'avoir été beaucoup utilisée / montrée à la communauté .

    voici donc le source d'un petit programme , listant les documents possible à créer sur un poste (dans un stringlist) en dblcliquant sur un élément on obtient un certain nombre d'informations sur : le programme associé , la commande pour créer un nouveau fichier (si existante) et différentes infos
    trouver ces 'fameux Nouveau quelque chose' dans la base de registre
    (testé avec D3/Vista , oui , j'utilise encore)


    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
     
    unit Assoc1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Registry,
      StdCtrls ;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1DblClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
    // récupéré dans shlwapi.pas
    const
    // ASSOCF enumerated values mapped to integer constants
    ASSOCF_INIT_NOREMAPCLSID = $00000001;
    ASSOCF_INIT_BYEXENAME = $00000002;
    ASSOCF_OPEN_BYEXENAME = $00000002;
    ASSOCF_INIT_DEFAULTTOSTAR = $00000004;
    ASSOCF_INIT_DEFAULTTOFOLDER = $00000008;
    ASSOCF_NOUSERSETTINGS = $00000010;
    ASSOCF_NOTRUNCATE = $00000020;
    ASSOCF_VERIFY = $00000040;
    ASSOCF_REMAPRUNDLL = $00000080;
    ASSOCF_NOFIXUPS = $00000100;
    ASSOCF_IGNOREBASECLASS = $00000200;
     
    {$MINENUMSIZE 4}
    type
    TAssocStr = (ASSOCSTR_NONE,
    ASSOCSTR_COMMAND,
    ASSOCSTR_EXECUTABLE,
    ASSOCSTR_FRIENDLYDOCNAME,
    ASSOCSTR_FRIENDLYAPPNAME,
    ASSOCSTR_NOOPEN,
    ASSOCSTR_SHELLNEWVALUE,
    ASSOCSTR_DDECOMMAND,
    ASSOCSTR_DDEIFEXEC,
    ASSOCSTR_DDEAPPLICATION,
    ASSOCSTR_DDETOPIC );
     
     
    // uniquement utile pour lisibilité résultat
    const
    AssocStrDisplaystrings : array [ASSOCSTR_COMMAND..ASSOCSTR_DDETOPIC]
    of string = (
    'ASSOCSTR_COMMAND',
    'ASSOCSTR_EXECUTABLE',
    'ASSOCSTR_FRIENDLYDOCNAME',
    'ASSOCSTR_FRIENDLYAPPNAME',
    'ASSOCSTR_NOOPEN',
    'ASSOCSTR_SHELLNEWVALUE',
    'ASSOCSTR_DDECOMMAND',
    'ASSOCSTR_DDEIFEXEC',
    'ASSOCSTR_DDEAPPLICATION',
    'ASSOCSTR_DDETOPIC' );
     
    function AssocQueryString( Flags: Integer; StrType: TAssocStr;
    pszAssoc, pszExtra: PChar; pszOut:
    PChar; Var pcchPut: DWORD): HRESULT; stdcall;
    external 'shlwapi.dll' name 'AssocQueryStringA';
     
    // lecture valeur registre REG_MULTI_SZ
    procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;
      Strings: TStrings);
    var
      valueType: DWORD;
      valueLen: DWORD;
      p, buffer: PChar;
      key: HKEY;
    begin
      // Clear TStrings
      Strings.Clear;
      // open the specified key
      if RegOpenKeyEx(CurrentKey,
                      PChar(Subkey),
                      0, KEY_READ, key) = ERROR_SUCCESS then
      begin
        // retrieve the type and data for a specified value name
        SetLastError(RegQueryValueEx(key,
                     PChar(ValueName),
                     nil,
                     @valueType,
                     nil,
                     @valueLen));
        if GetLastError = ERROR_SUCCESS then
          if valueType = REG_MULTI_SZ then
          begin
            GetMem(buffer, valueLen);
            try
              // receive the value's data (in an array).
              RegQueryValueEx(key,
                              PChar(ValueName),
                              nil,
                              nil,
                              PBYTE(buffer),
                              @valueLen);
              // Add values to stringlist
              p := buffer;
              while p^ <> #0 do
              begin
                Strings.Add(p);
                Inc(p, lstrlen(p) + 1)
              end
            finally
              FreeMem(buffer)
            end
          end
          else
            raise ERegistryException.Create('Stringlist attendue')
        else
          raise ERegistryException.Create('Impossible de lire la valeur MULTI_SZ');
      end;
    end;
     
    // remplissage de la liste , nouveaux possibles selon poste
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew','Classes', ListBox1.Items);
    end;
     
    // affichage des commandes selon choix 
    procedure TForm1.ListBox1DblClick(Sender: TObject);
    var i : Word;
        Bufsize : DWORD;
        buffer : array [0..1024] of Char;
    begin
    BufSize := Sizeof(Buffer);
    Buffer[0] := #0;
    for i:=0 to listbox1.Items.Count-1 do
      begin
        if Listbox1.Selected[i] then
         begin
           memo1.lines.Clear;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,Pchar(listbox1.Items[i]),'open',Buffer,BufSize );
           memo1.lines.Add(Format('Value for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_EXECUTABLE], Buffer]));
           BufSize := Sizeof(Buffer);
           Buffer[0] := #0;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_COMMAND,Pchar(listbox1.Items[i]),'new',Buffer,BufSize );
           memo1.lines.Add(Format('Value A for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_COMMAND], Buffer]));
           BufSize := Sizeof(Buffer);
           Buffer[0] := #0;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_FRIENDLYDOCNAME,Pchar(listbox1.Items[i]),'',Buffer,BufSize );
           memo1.lines.Add(Format('Value for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_FRIENDLYDOCNAME], Buffer]));
           BufSize := Sizeof(Buffer);
           Buffer[0] := #0;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_FRIENDLYAPPNAME,Pchar(listbox1.Items[i]),'',Buffer,BufSize );
           memo1.lines.Add(Format('Value for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_FRIENDLYAPPNAME], Buffer]));
           BufSize := Sizeof(Buffer);
           Buffer[0] := #0;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_NOOPEN,Pchar(listbox1.Items[i]),'',Buffer,BufSize);
           memo1.lines.Add(Format('Value for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_NOOPEN], Buffer]));
           BufSize := Sizeof(Buffer);
           Buffer[0] := #0;
           AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_SHELLNEWVALUE,Pchar(listbox1.Items[i]),'new',Buffer,BufSize);
           memo1.lines.Add(Format('Value for %s: %s',[AssocStrDisplaystrings[ASSOCSTR_SHELLNEWVALUE], Buffer]));
         end;
      end;
    end;
    end.

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Salut, Serge,

    J'ai testé ton unité sous w2k-D7, et ça ne passe pas, je gagne le raise ERegistryException.Create('Impossible de lire la valeur MULTI_SZ');

    Suis allé voir dans ma BdR, normal il n'y en a pas, de REG_MULTI_SZ...
    J'ai une REG_SZ (par défaut) (valeur non définie),
    plusieurs REG_BINARY et
    une seule REG_DWORD.
    Voilà...
    Sous Vista tout est en REG_MULTI_SZ ?

    Bon, c'est pas bien grave, j'ai testé par curiosité mais je ne te cache pas que je n'ai pas du tout le temps de me pencher là-dessus en ce moment.
    Mais je testerai l'exe demain au taf, sous 7.

    [EDIT] Arf ! J'avais pas vu ça, j'ai foncé tête baissée sur le code, lol ! :
    j'ai utilisé l'API 'AssocQueryStringA' fonctionnant à partir de XP
    Mais c'est intéressant, j'aurai peut-être plus de temps pour fouiller dans une dizaine de jours -- après Noël, quoi [/EDIT]

    [EDIT_2]Impec au taf sous 7, [/EDIT_2]

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    le passage d'un ensemble de clé a une clé classes REG_MULTI_SZ s'est fait avec Vista ( ou comment compliqué des choses simples )

    pour les postes encore sous XP j'ai été obligé de jouer avec RegEnumValue pour rechercher les différentes extensions .

    Encore un peu de travail d'optimisation , peut-être quelques recherches pour les versions < XP ( AssocQueryStringA n'existant et je crains d'avoir encore des postes en Me et 2K ) et de temps et j'aurais enfin une unité aboutie

Discussions similaires

  1. [Lazarus] Ouvrir des fichiers image au format TIF
    Par ChPr dans le forum Lazarus
    Réponses: 22
    Dernier message: 15/03/2014, 18h50
  2. ouvrire des fichiers par un boucle for
    Par stiko dans le forum C++
    Réponses: 5
    Dernier message: 08/07/2006, 15h14
  3. Ouvrir des fichiers pour un IHM
    Par stiko dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 29/06/2006, 12h54
  4. Réponses: 2
    Dernier message: 07/06/2006, 11h44
  5. Ouvrir des fichiers *.mix
    Par arnaud_verlaine dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 24/12/2005, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo