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

Langage Delphi Discussion :

Problème lors de l'association d'une icone à une extension


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Problème lors de l'association d'une icone à une extension
    bonjour a tous ,
    je sais pas bien comment expliquer mon problème mais j'essaie quand même de le faire :
    bon pour associer une icône avec une extension j'utilise la procédure suivante :
    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
     
    procedure associe(extension:string; executable:string; DescriptionExe:string; icone:string;
                   ShellCommand:string; AssociationPrincipale : Boolean);
    {============================================================================================}
    { extension      : l'extension concernée                                                     }
    { executable     : emplacement du fichier exécutable à associer à l'extension                }
     { DescriptionExe : Le libellé que l'on verra apparaitre dans le menu contextuel              }
    { icone : l'icone à associer                                                                 }
    { ShellCommand   : Vous pouvez mettre ce que vous voulez, On met souvent Open                }
    { Attention mettre Open retire les autres associations ayant mis Open => mieux vaut choisir  }
     
    { AssociationPrincipale :  N'intervient que s'il y avait déjà une autre association          }
    { pour cette extension. Mettre true si on veut que ce soit maintenant notre application      }
    { qui soit lancée lors d'un double clic. }                                                                                                        
    {============================================================================================}
     
    Var
      Registre : TRegistry;
      ClefDeNotreExtension : string;
     
    begin
      // recherche s'il y a déjà une clef portant le nom de votre extension (par exemple '.ess')
      Registre:=TRegistry.Create;
      try
        Registre.RootKey:=HKEY_CLASSES_ROOT;
        Registre.OpenKey('.'+extension,true);
        ClefDeNotreExtension:=Registre.ReadString('');
        Registre.CloseKey;
        Registre.Free;
      Except
        ShowMessage('erreur d''écriture dans la base de registre');
        Registre.Free;
      end;
     
      // si elle n'a pas été déjà définie par un autre programme,
      // ClefPourNotreExtension est égal à ''
      // dans ce cas, il faut lui donner une valeur par exemple : extension+'_file;
      if ClefDeNotreExtension='' then ClefDeNotreExtension:=extension+'_file';
      if ShellCommand='' then ShellCommand:='Open';// valeur par défaut si on a
         //passé une chaine vide en paramètre
     
      // écriture de la clef à la racine et portant le nom de notre extension.
      // On y écrit une valeur correspondant
      // à la clef dasn laquelle se trouvent les renseignements concernant l'association
      EcritRegistre(HKEY_CLASSES_ROOT,'.'+extension,'',ClefDeNotreExtension);
     
      // écriture de l'exécutable à associer à l'extension
      EcritRegistre(HKEY_CLASSES_ROOT,
                  ClefDeNotreExtension+'\shell\'+ShellCommand+'\command','',executable+' %1');
     
      // écriture du fait que notre programme sera le programme "pricipal"
      //c a d qui s'ouvre lors d'un double clic
      if AssociationPrincipale then EcritRegistre(HKEY_CLASSES_ROOT,
                                    ClefDeNotreExtension+'\shell\','',ShellCommand);
     
      // écriture du libellé apparaissant dans le menu contextuel
      if DescriptionExe<>'' then EcritRegistre(HKEY_CLASSES_ROOT,
                             ClefDeNotreExtension+'\shell\'+ShellCommand+'\','',DescriptionExe);
     
      // écriture du nom du fichier contenant l'icone
      if icone<>'' then EcritRegistre(HKEY_CLASSES_ROOT,
                          ClefDeNotreExtension+'\DefaultIcon','',icone);
    end;
    pour écrire dans la base de registre voici la procédure :
    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
     
    procedure EcritRegistre(racine:DWord;clef,nom,valeur:string);
    {=====================================================================================}
    {procédure servant à écrire dans la base de registre. Racine est le noeud principal   }
    {de la base de registre (ex: HKEY_CLASSES_ROOT )                                      }
    {clef est le noeuds choisi où l'on veut écrire (un noeud correspond à un noeud        }
    {dans l'arborescence de la base de registre)                                          }
    {nom est le nom auquel on veut affecter une valeur                                    }
    {valeur est la valeur en question                                                     }
    {=====================================================================================}
    Var Registre:TRegistry;
    begin
      Registre:=TRegistry.Create;  // Création de Registre
      try  // try except end sont facultatifs. Voir mon exemple traitant de ce sujet (les exeptions).
        Registre.RootKey:=Racine; //spécifie la clé racine choisi pour l'application
        Registre.OpenKey(clef,True);  //Permet de sélectionner une clef particulière.
                     // Une clef est un noeud de l'arborescence de la base de registre.
                     // True car on veut que si le noeud n'existe pas on le crée.
        Registre.WriteString(nom,valeur); //affecte dans la base de registre
                     //la valeur valeur au nom nom
        Registre.CloseKey; //Ecrit la clé en cours dans le registre et ferme cette clé.
        Registre.Free;               // libération de la mémoire (annule l'effet de create)
      except
        Showmessage('erreur d''écriture dans la base de registre');
        Registre.Free;  // libère la mémoire même en cas d'erreur.
      end;
    end;
    mon problème est le suivant :
    1) quand je clic sur le fichier secondaire (qui contiens l'icône a associer ) une autre fenêtre s'ouvre qui contiens mon programme principale , et chaque fois que je clic sur un fichier secondaire une nouvelle fenêtre s'ouvre >> alors comment faire pour que mon programme s'exécute une seule fois ?

    2) quand je met ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If ParamStr(1)<> '' then ouvrir(ParamStr(1)) { ouvrir est une procedure de ma  propre définition }
    lors de l'ouverture de mon programme celui ci ce met dans le répertoire du fichier secondaire qu'il la appeler , et ça donne des erreurs pour charger les autre fichiers dont mon programme fait référence (fichiers dll, base de données ...),
    alors comment faire pour que lorsque mon programme s'exécute suite a son appelle par le fichier secondaire (qui contiens l'icône a associer) il garde son chemin de celui de son origine ?

    et merci d'avance.

  2. #2
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut,

    J'ai pas trop compris alors si tu veux recuperer le chemin principal regarde dans "ExtractFileName"

    si j'ai mal compris alors desoler..

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bon pour simplifié le problème voici un example :
    par example pour ouvrir un fichier project delphi, l'EDI delphi s'execute une seule fois ,et quand vous clickez sur un autre project vous aurez un seul EDI et non pas 2 , c'est ca ce que je veux faire pour mon programme avec ces fichiers associés, avez vous une solution pour réaliser ça? .

    et pour l'autre partie du problème je croix que la solution est d'ecrire le chemin de mon programme (Ainsi que les dll ,fichiers base de données...) dans la base de registre , puis lire ce chemin apres chaque execution de mon programme apres l'avoire appeler par le fichier associer a lui , pour lui indiquer ou ce trouve les fichiers dll,base de données,icones...
    a moin que vous avez une autre méthode !

  4. #4
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonsoir
    utiliser l'evenement sendmessage au demarrage de l'application
    il y a une autre methode base sur l'utilisation un cle de registre mais si vous ave des compts limite ça ne marche pas

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour, pour votre soucis je vous conseilles de jeter un oeil à cette et aussi à celle juste en dessous.

  6. #6
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonjour
    J'ai trouvé ce Project sur le site de Michel Bardou http://www.phidels.com initialement rédiger pour le transfert des donnes entre applications il utilise la procedure "FindWindow"dans cet example j'ai choisi le nom " Identite" alors j'ai fait quelque modification et il y a aussi la procédure Dragdrop trouvée sur le site de developpez
    Inserer dans une form un memo et associé le avec une extention et tester le glisser deposer
    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
    program Project1;
     
    uses
      Forms,
      Windows,
      Messages,
      SysUtils,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.RES}
    var
    NumMessage : UINT;
    Type
    TPDataEnvoyes=^TDataEnvoyes;
    TDataEnvoyes =String[255];
    var
      h:THandle;
      DataEnvoyes:TDataEnvoyes;
      CopyDataStruct:TCopyDataStruct;
    begin
    Form1.Caption:='';
    h:=FindWindow(nil,'Identite');
    if (h>0)and (ParamStr(1)<> '') then begin
    NumMessage:=RegisterWindowMessage('Form1');
    DataEnvoyes:=ParamStr(1);
    CopyDataStruct.cbData:=SizeOf(DataEnvoyes);
    CopyDataStruct.lpData:=@DataEnvoyes;
    SendMessage(h, WM_COPYDATA,Application.Handle,LongInt(@CopyDataStruct));
    Application.Terminate;
    end else  begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end;
    end.
    Unit 1
    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
    unit Unit1;
    interface
    uses
      ShellApi,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    type
      TForm1 = class(TForm)
      Memo1: TMemo;
      procedure FormCreate(Sender: TObject);
      private
      Procedure Drops(var Msg :TMessage);
      message wm_dropfiles;
      public
      procedure OnWmCopyData(var msg:TMessage); message WM_COPYDATA;
      end;
    var
      Form1 : TForm1;
    implementation
    {$R *.DFM}
    Type
    TPDataEnvoyes=^TDataEnvoyes;
    TDataEnvoyes =String[255];
    procedure TForm1.OnWmCopyData(var msg: TMessage);
    type
      TPCopyDataStruct=^TCopyDataStruct;
      TPDataEnvoyes=^TDataEnvoyes;
    Var
      DataEnvoyes:TDataEnvoyes;
      PDataEnvoyes:TPDataEnvoyes;
      PCopyDataStruct:TPCopyDataStruct;
    begin
      PCopyDataStruct:=TPCopyDataStruct(msg.LParam);
      PDataEnvoyes:=PCopyDataStruct^.lpData;
      DataEnvoyes:=PDataEnvoyes^;
      memo1.Clear;
      memo1.Lines.LoadFromFile(DataEnvoyes);
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    DragAcceptFiles(handle,true);
    If ParamStr(1)<> '' then begin
    memo1.Clear;
    memo1.Lines.LoadFromFile(ParamStr(1));
    end;
    Form1.Caption:='Identite';
    end;
    Procedure TForm1.Drops(var Msg :TMessage);
     var F :array[0..255] of char;
         Drop : thandle;
      begin
        Drop := Msg.WParam;
        DragQueryFile(Drop,0,F,255);
        DragFinish(Drop);
        //if votre exention then
        memo1.Clear;
        memo1.Lines.LoadFromFile(F);
        //
      end;
     
    end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Vxi3] Problème lors de l'extraction du mois d'une invite
    Par jod13 dans le forum Webi
    Réponses: 2
    Dernier message: 21/02/2012, 15h17
  2. Réponses: 2
    Dernier message: 18/03/2010, 13h31
  3. Associer une icone à une extension
    Par Jiyuu dans le forum Windows
    Réponses: 4
    Dernier message: 08/01/2010, 21h28
  4. Réponses: 2
    Dernier message: 30/03/2007, 13h17
  5. Réponses: 1
    Dernier message: 28/06/2006, 16h07

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