Page 1 sur 1

[R] Simplifier les installations

Posté : lun. 07 juil. 2008 06:16
par SagePourpre
Edit :

Fonction terminée, testée et fonctionnelle.

La version la plus récente est ici .

Mon but était, avec cette fonction, de monter plus rapidement des
scripts d'installation de programme et de le faire de manière
visuellement plus claire en prenant une ligne par fenêtre à activer
comprenant les actions que je devrais y réaliser.

Ex : mon installation de Speedfan avec ma fonction à laquelle j'ai
même ajouté un message de félicitation à la fin.

Code : Tout sélectionner

#include<Perso.au3>
Run("Speedfan 4.32.exe")
WA("SpeedFan|read carefully|!A")
WA("SpeedFan|Components|550|{DOWN}|{SPACE}|{DOWN}|{SPACE}|!N")
WA("SpeedFan|Install directory|!I")
WA("SpeedFan|Completed|tMSG|3|Installation completée|Barvo Champion|!C")

perso.au3
(5.41 Kio) Téléchargé 110 fois
Attention .

Ci-bas se trouve le premier post que j'avais posté la première fois (très loin de la fonction finale )

*************

► Afficher le texte1er post


P.s : Notez que je suis relativement débutant donc si vous avez des
suggestions pour améliorer le code, je suis toujours preneur. Sinon, cette version-ci du code est parfaitement fonctionnelle.

Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )

Re: [Func] Func _WinActivate pour simplifier scripts d'install

Posté : lun. 07 juil. 2008 10:31
par Tlem
Voici 2 suggestions :

Code : Tout sélectionner

Func _WinActivate($i = "", $ii = "",$sleep = 300, $h1 = "", $h2 = "", $h3 = "", $h4 = "", $h5 = "")

Dim $Snd[5] = [$h1, $h2, $h3, $h4, $h5]

    WinWait($i,$ii)
    IF Not WinActive($i, $ii) Then WinActivate($i, $ii)
    WinWaitActive($i, $ii)
    
For $i = 1 To 5
    If $Snd[$i] <> "" Then
        Sleep($sleep)
        Send($Snd[$i])
    EndIf
Next

EndFunc

Code : Tout sélectionner

; La même fonction sans limite dans le nombre de commandes.
; Séparer chaque commande par le caractère '|'.
;
Func _WinActivate2($i = "", $ii = "",$sleep = 300, $Snd = "")

$Snd = StringSplit($Snd, "|")

    WinWait($i,$ii)
    IF Not WinActive($i, $ii) Then WinActivate($i, $ii)
    WinWaitActive($i, $ii)
    
For $i = 1 To $Snd[0]
    If $Snd[$i] <> "" Then
        Sleep($sleep)
        Send($Snd[$i])
    EndIf
Next

EndFunc

Re: [Func] Func _WinActivate pour simplifier scripts d'install

Posté : mar. 08 juil. 2008 21:06
par SagePourpre
Edit : Vous pouvez lire ma demande si vous voulez mais j'ai trouvé le moyen de la réaliser... je pense que le fait de tout écrire dans ce post m'a éclairci les idées... je vous reviens avec ce que je vous décrit plus bas dans mon prochain post :)



:D

Code : Tout sélectionner

Func _WinActivate($snd = "")

$snd = StringSplit($snd, "|")
$t = $snd[1]
$tt = $snd[2]
$sleep = $snd[3]

if $snd[3] = "" Then
    $sleep = 300
EndIf

WinWait($t,$tt)
    IF Not WinActive($t, $tt) Then WinActivate($t, $tt)
    WinWaitActive($t, $tt)


For $i = 4 To $snd[0]
    
    If $snd[$i] <> "" Then
        Sleep($sleep)
        Send($snd[$i]) 
    EndIf
      

Next




EndFunc
Ce qui donne, en pratique

Code : Tout sélectionner

_WinActivate("Titre|Texte|Délai|Send 1| Send 2... sans limites )
Merci Thierry ... Je l'aime beaucoup mieux comme ça...

L'infini à un côté séduisant ... :|

J'ai choisi d'utiliser ta deuxième suggestion en intégrant tous mes
paramètres dans le "stringsplit()"

Mais voilà... ça m'a ouvert l'appétit.

Je m'explique.

Est-il possible de différencier les string split ?

Ex:

Code : Tout sélectionner

$snd = StringSplit($snd, "|#")
Je veux que mon "|" renvoie à la commande "send"
mais j'aimerais que si le délimiteur "#" est trouvé, qu'au lieu
de mon "send" habituel j'aille un "controlsend" ...

Un exemple de ce que je veux dire

Ma fonction actuelle :

Code : Tout sélectionner

_WinActivate("Titre|Texte|Délai|Send 1| Send 2... sans limites )
Ce que je voudrais faire

Code : Tout sélectionner

_WinActivate("Titre|Texte|Délai|Send 1| Send 2|Send 3#"controlid"# Send 4 ( associé à mon controlID)
Il faudrait donc que mon stringsplit soit divisé en deux Le premier s'occupe de réagir à "|" et dans le cas ou un "#" est aperçu,
non seulement le code associé à "|" ne réagit pas, c'est le code associé au séparateur "#" qui réagit... Mais quand un # est rencontré, il doit prendre en compte les deux variables inscrites, soit le "controlid" et le "send"

Code : Tout sélectionner




_WinActivate("Titre|Texte|Délai|Send 1| Send 2|Send 3#Param 4 | Param 5|Send normal jusqu'à ce que "#" soit rencontré à nouveau


Ma question est .... comment faire lol (je bosse là-dessus depuis les suggestions de Thierry.


Sinon ... j'ai une option 2 beaucoup plus simple je crois même si je ne me la figure pas encore.

Ça serait de tout simplement avoir un deuxième argument dans ma fonction.

Code : Tout sélectionner

_WinActivate($snd,$csend)
;mon $snd =stringsplit($snd,"|")  continuerait à gérer 
; titre, texte, sleep et Send normaux, et mon deuxième argument
;gérerait les "control send" après avoir fait tous les send normaux.
 
Mon problème reste toujours l'intégration de deux paramètres
"controlid" et "send" prix en compte dans le même laps de temps.

Néanmoins, la deuxième proposition reste moins intéressante de par
le fait que les control send se déroule nécessairement après les send.


Je ne sais pas si quelqu'un m'a compris
mais dans ma tête c'est clair comme tout... sauf si vous me demandez de remplacer tout ce que j'ai dit par du code. :D

Bon... Je retourne bosser là-dessus et si je trouve quelque chose de concluant, je revient en trombe.

Sinon, en attendant, vos lumières sont les bienvenue.

Re: [Func] Func _WinActivate pour simplifier scripts d'install

Posté : mar. 08 juil. 2008 23:50
par Tlem
Pour simplifier les choses, dans la boucle FOR analysez la valeur de $snd[$i] en y cherchant le caractère '#' (Voir la fonction StringInStr).
En fonction du résultat, décomposez cette ligne pour faire le ControlSend ou sinon le Send.

Re: [Func] Func _WinActivate pour simplifier scripts d'install

Posté : jeu. 10 juil. 2008 04:09
par SagePourpre
Tlem a écrit :Pour simplifier les choses, dans la boucle FOR analysez la valeur de $snd[$i] en y cherchant le caractère '#' (Voir la fonction StringInStr).
En fonction du résultat, décomposez cette ligne pour faire le ControlSend ou sinon le Send.
hmmm... je ne connaissais pas StringinStr. j'ai jeté un coup d'oeil mais j'avais déjà utilisé un "if" pour réaliser mes ambitions.

J'ai inclus la fonction en *.au3 car elle ne rend pas très bien ici ( les lignes de commentaires sont écrasés )

J'aurais voulu savoir s'il y'avait moyen de régler ce petit détail

Code : Tout sélectionner

For $i = 4 To $snd[0]
If $snd[$i-5] = $test Then
 
Cette boucle ne peut pas fonctionner
puisque mon [$i-5] lorsque mon $i = 4 est invalide
(le paramètre -1 ... )
Existe-t'il un moyen pour contourner cela ?

Une formule qui dirait :
Si ma variable "I" est impossible, ne pas s'en soucier et continuer

Sinon, il me reste un petit truc a peaufiner.
Admettons que j'ai une boucle comme ceci

Code : Tout sélectionner

For $i = 4 To $snd[0]
If $snd[$i-4] = $test Then
 

Cela fonctionne. Ma boucle réagit à partir du 4eme paramètres de ma fonctions _FonctionA (param1,param2,param3,param4,param5)

Mais comment puis-je faire pour que cette boucle fonctionne à partir du paramètre 3 ?

Si je procède comme celà

Code : Tout sélectionner

For $i = 3 To $snd[0]
If $snd[$i-4] = $test Then
 

ça me donne une erreur de type : Array substring badly formatted.
Probablement car mon $i égalant 3 , il n'y a pas de paramètre -1 à une fonctions.

Comment passer outre cette erreur ?

... je continue mes
recherches.
wa.au3
(5.29 Kio) Téléchargé 99 fois

Re: [..] Simplifier les installations

Posté : jeu. 10 juil. 2008 08:43
par Tlem
Post déplacé dans le forum Aide Générale.

Votre 'fonction' n'est pas encore opérationnelle, et me semble bien trop complexe pour être considérée comme une fonction.
En fait, avec votre code vous refaite presque un mini langage !!!

Personnellement, je vous conseillerais de partir plutôt sur un UDF qui interpréterait un fichier de réponse établit en fonction de vos besoin et qui réaliserait les actions séquentiellement (Mais même comme cela, c'est comme si vous ré-inventiez la roue).

Re: [..] Simplifier les installations

Posté : lun. 14 juil. 2008 00:03
par SagePourpre
Voilà .... j'ai réussi ... J'ai pris mon problème à l'envers. Je ne pouvais pas aller sous zéro dans mes paramètres de fonctions car ça ne se peut pas... alors, au lieu de procéder avec [$i-X] ou X me créait des problème s'il était plus grand que $i, j'ai utilisé [$i + x] donc ça s'est réglé comme de rien.

Pour vous donner un exemple, voilà mon installation de Speedfan

Code : Tout sélectionner

#include<Perso.au3>
Run("Speedfan 4.32.exe")
WA("SpeedFan|read carefully|!A")
WA("SpeedFan|Components|550|{DOWN}|{SPACE}|{DOWN}|{SPACE}|!N")
WA("SpeedFan|Install directory|!I")
WA("SpeedFan|Completed|tMSG|3|Installation completée|Bravo Champion|!C")
Une fenêtre à traiter par ligne et en prime, une msgbox
complètement inutile pour me féliciter une fois l'installation
terminée.

j'ai réussi !!

Merci à Thierry et à Thierry pour leur coup de main.
(où serais-je sans stringsplit... surement pas bien loin :P )
perso.au3
(5.41 Kio) Téléchargé 117 fois


Et la roue tourne !