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 : AMOS - Création d'une fenêtre Shell
(Article écrit par Denis Bernard et extrait d'Amiga News - juin 1993)
|
|
Pas de fenêtre Shell ? Qu'à cela ne tienne, on va s'en ouvrir une !
Et en plus, on va même y faire un Dir ; ou peut-être même un List...
Ouverture automatique d'une fenêtre de sortie
En retravaillant légèrement la routine CPRINT[]
du mois dernier, on peut lui faire ouvrir automatiquement sa propre fenêtre de sortie si
celle-ci n'existe pas, ce qui arrive dans le cas où la fenêtre Shell a été fermée ou si
le programme a été lancé depuis le Workbench.
Cependant, pour une question de pratique, on ne va pas ouvrir cette fenêtre avec l'instruction
Open Port (comme on l'a vu dans cet article)
mais en faisant directement appel aux fonctions DOS Open() et Close().
Il faudrait, en effet, gérer un troisième cas dans la procédure CPRINT[]...
Il est vrai qu'en y regardant de plus près, cette solution serait plus
courte que celle que je vous propose ici, mais elle ne nous permettrait pas
de rediriger la sortie d'exécutables CLI, lancés depuis AMOS, dans cette fenêtre (ceci
fait l'objet de la seconde partie de cet article).
Shéma de principe
Lors de l'appel de la procédure CPRINT[], si on n'a pas de pointeur sur
une structure FileHandle (qui équivaut au numéro de canal de fichier en AMOS)
dans la variable _DOS_HAN, on appelle la fonction Output(). Si celle-ci ne retourne
pas de pointeur (pas de fenêtre CLI/Shell), on tente d'ouvrir une fenêtre par
nos propres moyens en faisant appel à la procédure _WINDOPEN[POS_X, POS_Y,
TAILLE_X, TAILLE_Y, NOM]. En cas d'erreur, on appelle la procédure _DOS_ERR
qui se charge d'identifier l'erreur. Les codes d'erreur du DOS n'y figurent pas tous,
mais les principaux y sont. Dans cette routine, à vous de trouver un moyen d'afficher
le code d'erreur, qui se produit ici lorsqu'on ne peut pas ouvrir de fenêtre (cruel dilemne !).
Notez que les procédures ont été conçues pour que le programme soit interrompu en cas
d'erreur, d'où l'instruction End dans la procédure _DOS_ERR.
Dans le cas où on a ouvert notre propre fenêtre, on place True (-1) dans la variable CUSTOM.
Ainsi, pour quitter le programme, on passe par la procédure _END qui se chargera de tout
fermer, y compris notre fenêtre de sortie si nous l'avons ouverte.
Redirection des entrées/sorties d'une commande dans la fenêtre
Il suffit de reprendre le programme de la première partie, d'y ajouter la procédure _WINDEXE[] et de
remplacer la boucle principale par celle du second exemple.
Comment ça marche ?
Pour lancer un exécutable à partir d'AMOS (ou tout autre langage), on ouvre d'abord un
fichier (ou canal) d'entrée/sortie, puis on transmet le pointeur sur le FileHandle
ainsi obtenu à la fonction Execute(). D'habitude, on ouvre NIL: (entrées/sorties redirigées vers le
néant absolu), alors qu'ici on transmet le FileHandle (canal...) de notre fenêtre, ce qui a donc
pour effet, dans notre exemple, d'afficher le contenu de SYS:.
Et comme pour l'ouverture des fenêtres, en cas d'erreur on passe la main à la procédure _DOS_ERR.
A ce sujet, une petite suggestion pour les courageux : AMOS peut générer les mêmes erreurs
que le DOS mais les erreurs correspondantes en AMOS n'ont malheureusement pas le même code.
Essayez donc en mode direct Error 92. AMOS vous répond "Disque Non-DOS", mais on est bien
loin du code 225 du DOS pour la même erreur ! Alors, avec un peu de courage, on peut facilement
faire une table de conversion des codes d'erreurs pour les faire gérer directement par AMOS qui
sera bien obligé de s'en débrouiller. Ce serait même carrément plus élégant, surtout si votre programme
est lancé depuis le Workbench, car AMOS ouvrira une jolie boîte système pour afficher l'erreur...
Et voilà, la porte est ouverte ! Pas la peine d'attendre plus longtemps pour programmer un programme
d'archivage, ou plutôt l'interface graphique d'un programme d'archivage comme Lha (pas la peine
de réinventer la poudre !).
|