Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Script dynamique en Panoramic Jeu 16 Fév 2012 - 19:01 | |
| Je voulais trouver un moyen d'exécuter du code Panoramic dynamiquement, sans avoir à compiler et générer un EXE au préalable. Je m'absente 4 jours et pendant ce temps, je trouve ma solution, et qu'est-ce que je constate au retour ? Jack l'Eclair a fourni l'outil qui permet de faire exactement cela ! Bravo Jack ! Mais je vais mettre ma solution en ligne quand-même. L'idée est la suivante: - dans un programme Panoramic, on constitue, en cours d'exécution, un morceau de code Panoramic dans une variable, avec des CHR$(13)+CHR$(10) comme séparateur de ligne. - on crée un fichier temporaire contenant ce code (le fichier "script") - on lance Panoramic avec la commande EXECUTE, en lui passant ce fichier en paramètre. Résultat: l'éditeur Panoramic démarre, ayant chargé ce fichier, mais attend la commande "Ecécuter", par le menu, par un click sur l'éclair ou la touche F9. Alors, j'ai fait une petite DLL qui servira de noyau pour gérer le pilotage d'un programme Windows à partir d'un programme Panoramic. L'idée, c'est de faire croire à l'éditeur Panoramic (ou à tout autre programme par la suite), que certaines touches ont été frappées. J'ai fait donc une première fonction pour lancer l'exécution du programme que l'éditeur a chargé en mémoire: ident_panoramic$ = "PANORAMIC EDITOR" i% = dll_call1("Execute_PANORAMIC",adr(ident_panoramic$)) Cette fonction ne fait que ça: démarrer l'exécution. J'ai fait aussi la fonction réciproque: arrêter un programme Windows. Ceci peut s'appliquer au programme lancé par l'éditeur, puis l'éditeur lui-même ! Voilà: pour le programme lancé par l'éditeur (le "script"): ident_srcipt$ = "titre de la fenêtre du programme lancé par l'éditeur" : ' à adapter bien sûr i% = dll_call2("Stop_PANORAMIC",adr(ident_script$),0) pour l'éditeur lui-même: i% = dll_call2("Stop_PANORAMIC",adr(ident_panoramic$),1) Le second paramètre est 0 dans le cas normal, et 1 dans le cas où le programme demande une confirmation par "Y" pour sortir (comme l'éditeur Panoramic). Ces fonctions sont dans la nouvelle dll Pilote.dll (dans DLLs divers), et la doc est mise à jour. Je suis en train d'étendre cette DLL de sorte à pouvoir envoyer n'importe quelle touche à n'importe quel programme, même les touches fonction comme F1 à F12, les flèches, alt, shift, control, numlock, print etc. C'est en bonne voie. Donc, finalement, ma contribution n'est pas obsolète - elle est un complément ouvrant l'horizon vers d'autres applications. On pourra, par exemple, aller chercher le texte d'une fenêtre Word, le copier dans le presse-papier (tout ça par la simulation des touches qu'on aurait frappé au clavier), puis récupérer le presse-papier dans un mémo. Et ce n'est qu'un exemple. Idem pour les images, ... C'est pourquoi ma DLL s'appelle "Pilote" - c'est bien parce qu'elle permettra de "piloter" d'autres programmes. La dll est incluse aussi dans le téléchargement global de mes DLL's. EDIT Voici un petit programme de démo montrant l'usage de ces fonctions. Un mémo permet de saisir un petit programme (sans coloration syntaxique, bien sûr). Un programme par défaut est proposé - ce programme affiche un bouton "Fermer" qui arrête ce "script". Quatre boutons de fonctions permettent de lancer ce script selon plusieurs modalités. - Code:
-
label exec1 label exec2 label exec3 label exec4 label timer15sec
dim ident_test$ : ident_test$ = "Test SCRIPT Panoramic" dim ident_panoramic$ : ident_panoramic$ = "PANORAMIC EDITOR" dim ident_script$ : ident_script$ = "SCRIPT_PILOTE" dim ident_script_string$ : ident_script_string$ = " "+chr$(34)+ident_script$+chr$(34) dim panoramic$ : panoramic$ = "c:\PROGRA~1\PANORA~1\Panoramic_Editor.exe " dim script$ : script$ = "panoramic_script.bas" dim i%, nsec% dim go% : ' 0=riel en cours 1=Panoramic en cours
height 0,730 : left 0,400 : top 0,50 : caption 0,ident_test$
memo 1 : top 1,10 : left 1,10 : width 1,400 : height 1,600 button 2 : top 2,10 : left 2,420 : caption 2,"Exécuter" on_click 2,exec1 : width 2,160 button 3 : top 3,40 : left 3,420 : caption 3,"Exécuter et arrêter après 15 sec." on_click 3,exec2 : width 3,160 button 4 : top 4,70 : left 4,420 : caption 4,"Exécuter et laisser" on_click 4,exec3 : width 4,160 button 5 : top 5,100 : left 5,420 : caption 5,"Arrêter de force" on_click 5,exec4 : width 5,160 : inactive 5 progress_bar 6 : top 6,130 : left 6,420 : hide 6 min 6,0 : max 6,15 : position 6,0 timer 10 : timer_off 10 : timer_interval 10,1000 : on_timer 10,timer15sec
item_add 1,"label fermer" item_add 1,"button 1 : caption 1,"+chr$(34)+"Fermer"+chr$(34) item_add 1,"top 1,300 : left 1,10" item_add 1,"on_click 1,fermer" item_add 1,"end" item_add 1,"fermer:" item_add 1,"terminate"
end
exec1: if go%>0 then return go% = 1 inactive 2 : inactive 3 : inactive 4 if item_read$(1,1)<>"caption 0,"+ident_script_string$ then item_insert 1,1,"caption 0,"+ident_script_string$ file_save 1,script$
' lancer l'éditeur avec le script execute panoramic$ + script$ ' et attendre qu'il démarre while HANDLE_FORM(ident_panoramic$)=0 wait 1 end_while
' attendre que le l'éditeur soit prêtt wait 4000 ' et lancer le script dll_on "pilote.dll" i% = dll_call1("Execute_PANORAMIC",adr(ident_panoramic$))
' attendre que le script soit lancé while HANDLE_FORM(ident_script$)=0 wait 1 end_while ' puis attendre que le script soit terminé while HANDLE_FORM(ident_script$)<>0 wait 1 end_while
' alors terminer l'éditeur i% = dll_call2("Stop_PANORAMIC",adr(ident_panoramic$),1) dll_off go% = 0 active 2 : active 3 : active 4 return exec2: if go%>0 then return go% = 1 inactive 2 : inactive 3 : inactive 4 if item_read$(1,1)<>"caption 0,"+ident_script_string$ then item_insert 1,1,"caption 0,"+ident_script_string$ file_save 1,script$
' lancer l'éditeur avec le script execute panoramic$ + script$ ' et attendre qu'il démarre while HANDLE_FORM(ident_panoramic$)=0 wait 1 end_while
' attendre que le l'éditeur soit prêtt wait 4000 ' et lancer le script dll_on "pilote.dll" i% = dll_call1("Execute_PANORAMIC",adr(ident_panoramic$))
' attendre que le script soit lancé while HANDLE_FORM(ident_script$)=0 wait 1 end_while ' maintenant, attendre 15 secondes show 6 timer_on 10 return ' ici, les 15 secondes d'attende sont terminées timer15sec: timer_off 10 nsec% = nsec% + 1 position 6,nsec% if nsec%<15 timer_on 10 return end_if ' alors terminer le script i% = dll_call2("Stop_PANORAMIC",adr(ident_script$),0)
' puis attendre que le script soit terminé while HANDLE_FORM(ident_script$)<>0 wait 1 end_while
' alors terminer l'éditeur i% = dll_call2("Stop_PANORAMIC",adr(ident_panoramic$),1) dll_off go% = 0 hide 6 active 2 : active 3 : active 4 return exec3: if go%>0 then return inactive 2 : inactive 3 : inactive 4 go% = 1 inactive 2 : inactive 3 : inactive 4 : active 5 if item_read$(1,1)<>"caption 0,"+ident_script_string$ then item_insert 1,1,"caption 0,"+ident_script_string$ file_save 1,script$
' lancer l'éditeur avec le script execute panoramic$ + script$ ' et attendre qu'il démarre while HANDLE_FORM(ident_panoramic$)=0 wait 1 end_while
' attendre que le l'éditeur soit prêtt wait 4000 ' et lancer le script dll_on "pilote.dll" i% = dll_call1("Execute_PANORAMIC",adr(ident_panoramic$))
' attendre que le script soit lancé while HANDLE_FORM(ident_script$)=0 wait 1 end_while active 5 return exec4: if go%=0 then return inactive 5
' alors terminer le script i% = dll_call2("Stop_PANORAMIC",adr(ident_script$),0)
' puis attendre que le script soit terminé while HANDLE_FORM(ident_script$)<>0 wait 1 end_while
' alors terminer l'éditeur i% = dll_call2("Stop_PANORAMIC",adr(ident_panoramic$),1) dll_off go% = 0 active 2 : active 3 : active 4
return
| |
|
Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 8:18 | |
| | |
|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 8:32 | |
| Personnellement, ce qui m'intéresserait, ce serait de pouvoir récupérer la sortie d'un programme Panoramic sous forme d'une chaîne de caractères, sans être obligé de créer un fichier sur disque.
Pour cela, il faudrait que le programme puisse écrire sur la sortie standard (la console). Or à ma connaissance il ne peut écrire que sur des objets graphiques (FORM ou autres).
Il nous faudrait une instruction du type PRINT_TARGET_IS_CONSOLE. Est-ce possible ?
L'intérêt, c'est qu'on pourrait lancer des scripts Panoramic depuis un autre langage comme FreeBASIC qui peut récupérer la sortie standard dans une chaîne de caractères.
(Désolé de réclamer encore des modifications alors que Jack vient tout juste de sortir la version en ligne de commande, mais c'est bien connu : plus on en a, plus on en veut !) | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 10:25 | |
| J'ai une possibilité de récupérer stdout et stderr ainsi que d'alimenter stdin, à partir d'une DLL en Delphi. Comment écrire sur stdout en Panoramic ? Je n'ai pas trouvé. Tout PRINT est effectivement dirigé sur PRINT_TARGET_IS qui est form 0 par défaut. | |
|
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 10:58 | |
| ... il y a beaucoup de questions sur PRINT_TARGET_IS en ce moment... Tout à fait d'accord avec jean debord : PRINT_TARGET_IS_CONSOLE est une bonne idée surtout pour des programmes qui doivent s'executer en ligne de commande et n'ayant pas, par la force des choses, d'interface graphique... | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 12:13 | |
| Oui, PRINT_TARGET_IS_CONSOLE serait bien, mais il est évident que dans ce contexte, PRINT_LOCATE, PRINT_X_LOCATE et PRINT_Y_LOCATE devraient être simplement ignorés. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Script dynamique en Panoramic Ven 17 Fév 2012 - 19:03 | |
| J'ai ajouté des fonctions à ma dll Pilote.dll qui permettent d'écrire du texte dans StdOutput pour pouvoir le récupérer dans le programme suivant. J'ai ouvert un fil de discussion dans la section "Le site de Klaus" au sujet de cette DLL, et je poursuis les discussions à cet sujet à cet endroit. Merci ! | |
|