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 :
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
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;
mon problème est le suivant :
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;
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 :
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 ...),
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 }
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.
Partager