Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur/C - La requête de fichiers de la arp.library
(Article écrit par Dominique Genot et extrait d'Amiga News Tech - janvier 1991)
|
|
Chaque programmeur se heurte un jour ou l'autre au problème qui consiste à demander à l'utilisateur du programme le
nom d'un fichier : chargement, sauvegarde, données...
Cette interaction est une des routines de base de la arp.library ; elle s'appelle FileRequest (requête de fichiers).
Tout le monde a déjà vu cette routine en action : elle ouvre une fenêtre munie de trois
gadgets booléens (Ok, Parent, Cancel), d'un gadget vertical proportionnel pour visualiser tous les répertoires
et fichiers du chemin courant, et de deux gadgets de chaîne pour entrer au clavier le nom du chemin et celui du
fichier, on peut aussi cliquer sur le bouton droit de la souris pour changer de disque. C'est cette
requête qui s'ouvre quand on demande à charger un fichier avec l'assembleur Devpac. Ceux qui ont déjà
programmé cette requête savent que cela prend du temps pour une tâche finalement triviale et fastidieuse.
Celui-ci est-il au moins simple à utiliser ? La réponse est oui... (ouf !).
La seule chose nécessaire est bien entendu la bibliothèque ARP qui est dans le domaine public et
qui se trouve dans le tiroir "Libs:" de beaucoup d'utilitaires courants (comme Devpac), Il suffit
de la copier dans le tiroir "Libs:" de sa disquette système. On peut en connaître la version en
tapant sous CLI "version arp.library". Les sources qui suivent sont valables pour la version 34.1
et au-delà.
Deux types de sources sont donnés : en C (Lattice 4.01) et en assembleur (Devpac 2), ce qui devrait
satisfaire la plupart des programmeurs (pour le GFA Basic, voir
cet article).
Programmation en C
Cela va nous permettre de préciser les structures nécessaires. En effet, ouvrir la requête,
c'est bien, récupérer les réponses, c'est mieux ! Une seule structure est ici nécessaire :
elle s'appelle FileRequester et elle décrit les caractéristiques de la fenêtre que l'on veut ouvrir :
Ce qui est directement utilisable :
- fr_titre est un pointeur sur la chaîne qui contient le titre voulu pour la requête
(du style "Ma Requête" pour rester traditionnel...).
- fr_file est un pointeur sur un tampon mémoire qui contiendra au retour le nom du fichier
choisi (plus un octet à 0).
- fr_dir est un pointeur sur un tampon mémoire qui contiendra le nom du chemin.
- fr_window permet de choisir la fenêtre Intuition dans laquelle s'ouvrira la requête.
Si on met à 0 ce pointeur, la requête s'ouvre alors dans la fenêtre active au moment de l'appel.
Si on a ouvert sa propre fenêtre Intuition par l'instruction "Window=OpenWindow(&NewWindow);",
on pourra fixer ce pointeur par "Freq.fr_window=Window;"
- fr_reserved2 est un long mot qui, dans les versions ultérieures (au-delà de 34.1)
indique la position du coin supérieur gauche de la requête (par rapport au coin supérieur gauche
de l'écran ?). Il est alors décomposé comme suit :
UWORD fr_leftedge /* marge gauche */
UWORD fr_topedge /* hauteur du coin */
|
Quand cette structure est définie et initialisée, y compris les tampons nécessaires :
char fname[80]; /* 79 octets +0 pour le nom de fichier */
char dirname[120]; /* idem pour le nom du chemin */
char nom_complet[200]; /* pour le nom complet */
|
Il faut préciser le décalage de la routine FileRequest avec une instruction pragma au début du source :
#pragma libcall ArpBase FileRequest 126 801
|
Ceci correspond à :
D0 = FileRequest(FileRequester) (A0)
|
Le décalage de la routine est -$126 dans ArpBase et le registre A0 doit pointer sur la structure
FileRequester. En retour, D0 contient 0 s'il y a eu une erreur ou si l'utilisateur a cliqué sur
"Cancel". Si tout s'est déroulé normalement, D0 contient l'adresse du tampon qui contient
le nom du fichier choisi ("fname" dans le source qui suit).
Voici le programme (sous LATTICE 4.0) :
Programmation en assembleur
La structure est la même que précédemment, on la définit sous Devpac avec le compteur interne
"rs". Pour la signification de chaque label, voir le paragraphe précédent. Rappelons les
conditions d'appel :
FileRequest EQU -$126
D0 = FileRequest(FileRequester) (A0)
|
Donc A0 doit pointer sur une structure FileRequester et D0 donne le résultat de la demande :
D0=0 si "Cancel" ou si un problème fut rencontré, sinon D0 pointe sur le nom du fichier.
Précisons que si une fenêtre Intuition est ouverte, on peut fixer le pointeur "fr_window"
pour que la requête s'ouvre dans cette fenêtre.
Exemple :
move.l _intuitionbase,A6 ; la bibliothèque Intuition étant ouverte
lea fenetre,a0 ; structure de la fenêtre à ouvrir
JSR OpenWindow(A6) ; ->D0=adresse fenêtre ouverte
lea FileReq,a0 ; filerequester à ouvrir
move.l d0,fr_window(A0) ; initialise le pointeur fr_window
|
Enfin, si le pointeur "fr_window" est à 0, la requête s'ouvrira dans la fenêtre à partir de
laquelle le programme fut lancé (sauf si le programme est lancé sous Devpac, la requête
s'ouvre alors dans la fenêtre ouverte par défaut).
Voici le source du programme sous Devpac 2 :
#include <exec/types.h>
#include <string.h>
#pragma libcall ArpBase FileRequest 126 801
APTR ArpBase=NULL;
LONG FileRequest();
struct FileRequester
{
UBYTE *fr_titre; /* texte fenêtre */
UBYTE *fr_file; /* filename */
UBYTE *fr_dir; /* direname */
struct Window *fr_window; /* Win voulue ou NULL */
UBYTE fr_flags; /* flags */
UBYTE fr_reserved1; /* mettre à zéro */
APTR fr_fonction; /* UserFunction */
LONG fr_reserved2; /* occupe ! */
};
char fname[80];
char dirname[120];
char nom_complet[200];
LONG reponse;
struct FileRequester Freq=
{" Mon Requester ",fname,dirname,NULL,NULL,NULL,NULL,NULL};
void main()
{
ArpBase=(APTR)OpenLibrary("arp.library",0);
if (ArpBase==NULL)
exit(FALSE);
reponse=FileRequest(&Freq);
CloseLibrary(ArpBase);
if(reponse)
{
printf("\n Vous avez choisi comme chemin '%s'",dirname);
printf("\n Vous avez choisi comme fichier '%s'",fname);
strmfp(nom_complet,dirname,fname);
printf("\n Le nom complet est '%s'\n",nom_complet);
}
}
|
Mise à jour de mai 2025 : une archive contenant le listing adapté à vbcc, et avec l'exécutable
compilé par vbcc, a été réalisée par Yann-Gaël Guéhéneuc et est disponible sur
obligement.free.fr/files/antarpfilerequester.lha.
Comme les deux sources le montrent, il ne faut pas oublier de "coller" le nom du répertoire et celui du fichier pour
avoir le nom complet (en ajoutant un "/" si nécessaire).
|