OVH Cloud OVH Cloud

[HTA] Affichage dynamique message (innertext)

15 réponses
Avatar
sympatix
Bonjour !

J'ai une page HTA, dans laquelle un script s'éxécute à l'ouverture.
Je voudrais afficher un message dynamique à l'aide d'innertext, durant
l'éxécution du script, mais je n'y arrive pas.
Dans l'exemple ci-dessous, le script tourne en boucle, tant que notepad (par
exemple) n'est pas lancé.
Normalement, il devrait s'afficher:

1: Prêt (pendant un temps très court, même trop court pour être vu...mais
c'est pas le problème)
2: Script lancé (tant que notepad n'est pas lancé)
3: Fin du script (dès l'ouverture de notepad)

Or, il n'en est rien, je n'ai que "prêt" pendant l'exécution du script,
puis, "Fin du script".
(je précise que j'ai essayé avec la balise "defer", bien qu'à priori, ça
n'ai aucun rapport dans mon cas ?)
Ou est l'erreur ?
merci d'avance !

------Couper ici-------
<HTML>

<div id=D1> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("sans titre")
D1.innertext = A
Wend
D1.innertext = B
</SCRIPT>

</HTML>
------Couper ici-------
--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)

10 réponses

1 2
Avatar
Do Re Mi chel La Si Do
Bonjour !

J'ai la flemme de chercher, en VBS. Mais ce script devrait répondre à ton
besoin :


<HTML>
<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<script language=JavaScript>
function visu(nom, txt) {
var tt = document.getElementById(nom);
tt.innerHTML = txt;
}
</script>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("Sans titre")
visu "D1",A
Wend
visu "D1",B
</SCRIPT>



@-salutations
--
Michel Claveau
Avatar
sympatix
Mais ce script devrait répondre à ton besoin :
Je l'ai lancé ton code modifé, mais le problème reste identique: "Script

lancé" ne s'affiche toujours pas pendant l'éxécution du script.
J'ai comme avant "Prêt" pendant le lancement du script, puis "Fin du script"
dès que je lance notepad. Mais je n'ai pas l'affichage intermédiaire "Script
lancé", *pendant* que le script tourne.

--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
"Do Re Mi chel La Si Do" a écrit dans le
message de news:
Bonjour !

J'ai la flemme de chercher, en VBS. Mais ce script devrait répondre à ton
besoin :


<HTML>
<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<script language=JavaScript>
function visu(nom, txt) {
var tt = document.getElementById(nom);
tt.innerHTML = txt;
}
</script>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("Sans titre")
visu "D1",A
Wend
visu "D1",B
</SCRIPT>



@-salutations
--
Michel Claveau



Avatar
Do Re Mi chel La Si Do
Aaarrgghh ! J'avais mal lu.
Avatar
Do Re Mi chel La Si Do
Et avec ça :


<HTML>
<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<script language=JavaScript>
function visu(nom, txt) {
var tt = document.getElementById(nom);
tt.innerHTML = txt;
}

function attente() {
if (oShell.appactivate("Sans titre")){
visu("D1","NotePad chargé");
}
else{
visu("D1","Script lancé");
setTimeout('attente()',50);
}
}

var oShell = new ActiveXObject("WScript.Shell");
attente();

</script>
</HTML>
Avatar
sympatix
Merci, ça fonctionne ...mais...

Je n'y connais rien en Jscript, mais j'arrive à deviner que c'est une pause
de 50ms qui résoud le problème ?
Dans mon exemple, c'est nickel, ça fonctionne, mais, je compte appliquer ça
dans une boucle récurssive d'environ 5000 fichiers...(pour afficher une
progression)
(je sais, j'aurais pu le dire avant, mais j'ai pris un petit exemple concret
pour simplifier)

Donc, 50 x 5000 = 250 secondes (un peu plus de 4mn). Là, malheureusement, ça
ne peut pas aller.
(j'usqu'ici, je travaillais en vbs sous Wsh, donc, pas en HTA, et je me
servais d'une instance d'IE comme moyen pour afficher une progression. Et
comme maintanant je me met tout doucement au HTA, je cherche l'équivalant,
et tant qu'à faire, directement dans ma page HTA)


--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
"Do Re Mi chel La Si Do" a écrit dans le
message de news: %
Et avec ça :


<HTML>
<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<script language=JavaScript>
function visu(nom, txt) {
var tt = document.getElementById(nom);
tt.innerHTML = txt;
}

function attente() {
if (oShell.appactivate("Sans titre")){
visu("D1","NotePad chargé");
}
else{
visu("D1","Script lancé");
setTimeout('attente()',50);
}
}

var oShell = new ActiveXObject("WScript.Shell");
attente();

</script>
</HTML>




Avatar
Jean
Bonjour,

vous pouvez faire quelque chose comme ce qui suit (... et la charge CPU sera *fortement* réduite comparée au 100% actuel ;-) ) :

http://automation.eu.tf/Temporisation_VBS.HTA (VBScript * voir code ci-dessous)
http://automation.eu.tf/Temporisation_JS.HTA (JScript * voir code ci-dessous)

La récursive de Michel est bonne aussi.
Au lieu de passer par une récursive j'utilise les méthodes setInterval et clearInterval du DOM.
Cette dernière peut aussi s'avérer utile pour interompre la temporisation à tout instant (via un bouton par ex.).

<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer language='vbs'>
Executer_Notepad_Apres_10_sec 'Simulation

titre="Sans titre"

c=""
Debut

Sub Debut
'....Code....
D1.InnerText="Prêt"
'Suite
SetTimeout "Suite",1000 'Simulation
End Sub

Sub Suite
D1.InnerText="En cours "
c=SetInterval("Temporisation",150)
End Sub

Sub Temporisation
If Not CreateObject("WScript.Shell")_
.AppActivate(titre) Then
D1.InnerTextÑ.InnerText&"... "
Else
Fin
End If
End Sub

Sub Fin
ClearInterval(c)
'....Code....
D1.InnerText="Terminé"
End Sub

Sub Executer_Notepad_Apres_10_sec
SetTimeout _
"CreateObject(""WScript.Shell"")"&_
".Run ""notepad.exe""",10000
End Sub
</script>
<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->

<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer>
executer_notepad_apres_10_sec() //Simulation

titre='Sans titre'

debut()

function debut(){
//....Code....
D1.innerText='Prêt'
//suite()
setTimeout('suite()',1000) //Simulation
}

function suite(){
D1.innerText='En cours '
c=setInterval('temporisation()',150)
}

function temporisation(){
if(!new ActiveXObject('WScript.Shell').
appActivate(titre)){
D1.innerText+='... '
}else{
fin()
}
}

function fin(){
clearInterval(c)
//....Code....
D1.innerText='Terminé'
}

function executer_notepad_apres_10_sec(){
setTimeout
(
'new ActiveXObject("WScript.Shell")'+
'.run("notepad.exe")'
,10000
)
}
</script>
<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->


Amicalement,

Jean - JMST
Belgium

"sympatix" a écrit dans le message de news:
Bonjour !

J'ai une page HTA, dans laquelle un script s'éxécute à l'ouverture.
Je voudrais afficher un message dynamique à l'aide d'innertext, durant
l'éxécution du script, mais je n'y arrive pas.
Dans l'exemple ci-dessous, le script tourne en boucle, tant que notepad (par
exemple) n'est pas lancé.
Normalement, il devrait s'afficher:

1: Prêt (pendant un temps très court, même trop court pour être vu...mais
c'est pas le problème)
2: Script lancé (tant que notepad n'est pas lancé)
3: Fin du script (dès l'ouverture de notepad)

Or, il n'en est rien, je n'ai que "prêt" pendant l'exécution du script,
puis, "Fin du script".
(je précise que j'ai essayé avec la balise "defer", bien qu'à priori, ça
n'ai aucun rapport dans mon cas ?)
Ou est l'erreur ?
merci d'avance !

------Couper ici-------
<HTML>

<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("sans titre")
D1.innertext = A
Wend
D1.innertext = B
</SCRIPT>

</HTML>
------Couper ici-------
--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)






Avatar
sympatix
Bonjour !

Dans votre exemple, effectivement, tout fonctionne au poil, car la démo se
sert d'une tempo en guise de code.
Mais, si je veux appliquer ça dans une boucle récursive (une collection de
5000 fichiers par exemple), soit:

1: Je place un affichage de progression avec tempo à chaque passage de
boucle (pas possible avec une tempo)
2: Je cherche à placer l'affichage de progression à une fréquence moins
rapide (solution envisagée)...mais reste à trouver où ?

Je vais chercher, merci !

--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
"Jean" <http:// a écrit dans le message de news:
unxf%23%
Bonjour,

vous pouvez faire quelque chose comme ce qui suit (... et la charge CPU
sera *fortement* réduite comparée au 100% actuel ;-) ) :

http://automation.eu.tf/Temporisation_VBS.HTA (VBScript * voir code
ci-dessous)
http://automation.eu.tf/Temporisation_JS.HTA (JScript * voir code
ci-dessous)

La récursive de Michel est bonne aussi.
Au lieu de passer par une récursive j'utilise les méthodes setInterval et
clearInterval du DOM.
Cette dernière peut aussi s'avérer utile pour interompre la temporisation
à tout instant (via un bouton par ex.).

<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer language='vbs'>
Executer_Notepad_Apres_10_sec 'Simulation

titre="Sans titre"

c=""
Debut

Sub Debut
'....Code....
D1.InnerText="Prêt"
'Suite
SetTimeout "Suite",1000 'Simulation
End Sub

Sub Suite
D1.InnerText="En cours "
c=SetInterval("Temporisation",150)
End Sub

Sub Temporisation
If Not CreateObject("WScript.Shell")_
.AppActivate(titre) Then
D1.InnerTextÑ.InnerText&"... "
Else
Fin
End If
End Sub

Sub Fin
ClearInterval(c)
'....Code....
D1.InnerText="Terminé"
End Sub

Sub Executer_Notepad_Apres_10_sec
SetTimeout _
"CreateObject(""WScript.Shell"")"&_
".Run ""notepad.exe""",10000
End Sub
</script>
<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->

<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer>
executer_notepad_apres_10_sec() //Simulation

titre='Sans titre'

debut()

function debut(){
//....Code....
D1.innerText='Prêt'
//suite()
setTimeout('suite()',1000) //Simulation
}

function suite(){
D1.innerText='En cours '
c=setInterval('temporisation()',150)
}

function temporisation(){
if(!new ActiveXObject('WScript.Shell').
appActivate(titre)){
D1.innerText+='... '
}else{
fin()
}
}

function fin(){
clearInterval(c)
//....Code....
D1.innerText='Terminé'
}

function executer_notepad_apres_10_sec(){
setTimeout
(
'new ActiveXObject("WScript.Shell")'+
'.run("notepad.exe")'
,10000
)
}
</script>
<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->


Amicalement,

Jean - JMST
Belgium

"sympatix" a écrit dans le message de news:

Bonjour !

J'ai une page HTA, dans laquelle un script s'éxécute à l'ouverture.
Je voudrais afficher un message dynamique à l'aide d'innertext, durant
l'éxécution du script, mais je n'y arrive pas.
Dans l'exemple ci-dessous, le script tourne en boucle, tant que notepad
(par
exemple) n'est pas lancé.
Normalement, il devrait s'afficher:

1: Prêt (pendant un temps très court, même trop court pour être vu...mais
c'est pas le problème)
2: Script lancé (tant que notepad n'est pas lancé)
3: Fin du script (dès l'ouverture de notepad)

Or, il n'en est rien, je n'ai que "prêt" pendant l'exécution du script,
puis, "Fin du script".
(je précise que j'ai essayé avec la balise "defer", bien qu'à priori, ça
n'ai aucun rapport dans mon cas ?)
Ou est l'erreur ?
merci d'avance !

------Couper ici-------
<HTML>

<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("sans titre")
D1.innertext = A
Wend
D1.innertext = B
</SCRIPT>

</HTML>
------Couper ici-------
--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)











Avatar
Jean
Bonjour,

ou en utilisant la méthode showModelessDialog du DOM et en bricolant avec la routine Pause que j'avais postée ici dans le fichier
Pause.HTA ... un truc dans ce genre ci :

<!---8<---Jean-JMST-Belgium--->
<script defer language='vbs'>

s=""
i=0
ratio=0
vPosX=ScreenLeft
vPosY=ScreenTop

MoveTo 3000,3000
Set W=ShowModelessDialog(_
"about:<BODY><DIV IDÐ></DIV><DIV IDÑ></DIV></BODY>","",_
"dialogheight:70px;dialogwidth:200px;center:no;resizable:no;unadorned:yes"_
)
With W
.DialogLeft=vPosX
.DialogTop=vPosY
With .Document
With .Body
.Scroll="No"
With .Style
.Margin="0px"
.Padding="0px"
.BackGroundColor="Lavender"
.Border="3 ridge green"
.TextAlign="Center"
End With
End With
With .All.D0.Style
.Height="10px"
.Color="Yellow"
.BackGroundColor="Blue"
.Width="0%"
.Border="2 Solid Green"
End With
With .All.D1.Style
.FontSize="12px"
.Height="10px"
.Color="Blue"
.BackGroundColor="LemonChiffon"
.Width="100%"
.Border="2 Solid Silver"
End With
End With
End With

With CreateObject("Scripting.FileSystemObject")
Set fichiers=.GetFolder(.GetSpecialFolder(0)&"system32").Files
For Each f in fichiers
Pause 15
i=i+1
ratio=Round(i/(fichiers.Count/100))
'If i Mod 100=0 Then Pause(50)
With W.Document.All
.D0.InnerText=ratio&"%"
.D0.Style.Width=ratio&"%"
.D1.innerText=f.Name
End With
s=s&f.Name&"<br>"
Next
End With

W.Close
MoveTo vPosX,vPosY
document.body.innerHTML=s

Sub Pause(msec)
showModalDialog _
"about:<script language='vbscript'>setTimeout ""Close"","&_
msec&_
"<"&"/"&"script>"_
,"","dialogHeight:0px;dialogWidth:0px"
End Sub

</script>
<!---8<---Jean-JMST-Belgium--->

Amicalement,

Jean - JMST
Belgium

"sympatix" a écrit dans le message de news:
Bonjour !

Dans votre exemple, effectivement, tout fonctionne au poil, car la démo se
sert d'une tempo en guise de code.
Mais, si je veux appliquer ça dans une boucle récursive (une collection de
5000 fichiers par exemple), soit:

1: Je place un affichage de progression avec tempo à chaque passage de
boucle (pas possible avec une tempo)
2: Je cherche à placer l'affichage de progression à une fréquence moins
rapide (solution envisagée)...mais reste à trouver où ?

Je vais chercher, merci !

--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
"Jean" <http:// a écrit dans le message de news:
unxf%23%
Bonjour,

vous pouvez faire quelque chose comme ce qui suit (... et la charge CPU
sera *fortement* réduite comparée au 100% actuel ;-) ) :

http://automation.eu.tf/Temporisation_VBS.HTA (VBScript * voir code
ci-dessous)
http://automation.eu.tf/Temporisation_JS.HTA (JScript * voir code
ci-dessous)

La récursive de Michel est bonne aussi.
Au lieu de passer par une récursive j'utilise les méthodes setInterval et
clearInterval du DOM.
Cette dernière peut aussi s'avérer utile pour interompre la temporisation
à tout instant (via un bouton par ex.).

<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer language='vbs'>
Executer_Notepad_Apres_10_sec 'Simulation

titre="Sans titre"

c=""
Debut

Sub Debut
'....Code....
D1.InnerText="Prêt"
'Suite
SetTimeout "Suite",1000 'Simulation
End Sub

Sub Suite
D1.InnerText="En cours "
c=SetInterval("Temporisation",150)
End Sub

Sub Temporisation
If Not CreateObject("WScript.Shell")_
.AppActivate(titre) Then
D1.InnerTextÑ.InnerText&"... "
Else
Fin
End If
End Sub

Sub Fin
ClearInterval(c)
'....Code....
D1.InnerText="Terminé"
End Sub

Sub Executer_Notepad_Apres_10_sec
SetTimeout _
"CreateObject(""WScript.Shell"")"&_
".Run ""notepad.exe""",10000
End Sub
</script>
<!---8<---Temporisation_VBS.HTA---Jean-JMST-Belgium--->

<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->
<div idÑ></div>

<script defer>
executer_notepad_apres_10_sec() //Simulation

titre='Sans titre'

debut()

function debut(){
//....Code....
D1.innerText='Prêt'
//suite()
setTimeout('suite()',1000) //Simulation
}

function suite(){
D1.innerText='En cours '
c=setInterval('temporisation()',150)
}

function temporisation(){
if(!new ActiveXObject('WScript.Shell').
appActivate(titre)){
D1.innerText+='... '
}else{
fin()
}
}

function fin(){
clearInterval(c)
//....Code....
D1.innerText='Terminé'
}

function executer_notepad_apres_10_sec(){
setTimeout
(
'new ActiveXObject("WScript.Shell")'+
'.run("notepad.exe")'
,10000
)
}
</script>
<!---8<---Temporisation_JS.HTA---Jean-JMST-Belgium--->


Amicalement,

Jean - JMST
Belgium

"sympatix" a écrit dans le message de news:

Bonjour !

J'ai une page HTA, dans laquelle un script s'éxécute à l'ouverture.
Je voudrais afficher un message dynamique à l'aide d'innertext, durant
l'éxécution du script, mais je n'y arrive pas.
Dans l'exemple ci-dessous, le script tourne en boucle, tant que notepad
(par
exemple) n'est pas lancé.
Normalement, il devrait s'afficher:

1: Prêt (pendant un temps très court, même trop court pour être vu...mais
c'est pas le problème)
2: Script lancé (tant que notepad n'est pas lancé)
3: Fin du script (dès l'ouverture de notepad)

Or, il n'en est rien, je n'ai que "prêt" pendant l'exécution du script,
puis, "Fin du script".
(je précise que j'ai essayé avec la balise "defer", bien qu'à priori, ça
n'ai aucun rapport dans mon cas ?)
Ou est l'erreur ?
merci d'avance !

------Couper ici-------
<HTML>

<div idÑ> Prêt </div> <BR>
<HTA:APPLICATION></HTA:APPLICATION>

<SCRIPT Language = VBSCRIPT>
Set oShell = CreateObject("WScript.Shell")
A = "Script lancé"
B = "Fin du script"
While not oShell.appactivate ("sans titre")
D1.innertext = A
Wend
D1.innertext = B
</SCRIPT>

</HTML>
------Couper ici-------
--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)

















Avatar
Do Re Mi chel La Si Do
Re

Rien n'empêche de mettre l'attente à 2 ms, ce qui amène à 10 secondes.

Mais, le calcul ne s'applique pas comme ça. Si la fenêtre est ouverte, il
n'y aura pas d'attente. Dans le meilleur des cas, il n'y a que le temps
d'exécution du code.

MCI
Avatar
sympatix
Rien n'empêche de mettre l'attente à 2 ms, ce qui amène à 10 secondes.
J'ai même poussé le vice plus loin: j'ai mis 0, et ça marche !


Donc, j'ai visiblement pas bien compris le principe du pourquoi du comment
de la chose, c'est donc pas lié à la tempo...
Bon, le principal, c'est que ça marche !

Merci !
--
Cordialement
Sympatix
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
"Do Re Mi chel La Si Do" a écrit dans le
message de news:
Re

Rien n'empêche de mettre l'attente à 2 ms, ce qui amène à 10 secondes.

Mais, le calcul ne s'applique pas comme ça. Si la fenêtre est ouverte, il
n'y aura pas d'attente. Dans le meilleur des cas, il n'y a que le temps
d'exécution du code.

MCI





1 2