Problème de boucle conditionnelle avec "Shell"

Bonjour,
Je tombe sur un os. Lorsque je fais du pas à pas, le code s’arrête sur la ligne “if ud = “0” then” puis saute directement et systématiquement sur la dernière ligne (Shell1.close) sans tenter le test ElseIf ud=“1”. Aucun MessageBox ne s’affiche alors que la chaine est bien soit “0” soit “1”.
Voilà qui est curieux. Le même code sans le “Shell.execute/Shell1.result”, fonctionne sans problème.

Mon code simplifié :
Var ud as String
ud = “”
Shell1.Mode = 0
Shell1.Execute (“defaults read com.apple.dock show-recents”)
ud = Shell1.Result()
if ud = “0” then
MessageBox(ud)
ElseIf ud = “1” then
MessageBox(ud)
End If
Shell1.Close

Je pense que le problème vient probablement de la ligne “ud = Shell1.Result”.
Quelqu’un voit-il d’ou vient le problème ?
Merci.

Je complète mon Post :
D’après mes recherches, il semblerai que la valeur renvoyée par Shell1.Result soit au format “CFStringRef” et non String classique.
Lorsque je fait un MessageBox(Shell1.Result), il me renvoie bien un “0” ou un “1” sous forme d’une chaine de caractère mais j’ai lu ceci dans la Doc de Xojo:slight_smile:
“CFStringRef se convertit implicitement en String ou Text lorsqu’il est affecté à des variables String ou Text”
Alors la question qui se pose est peut-être : Comment convertir une chaine au format CFStringRef en chaine de caractère classique (voire en Integer) ?
Si vous avez la réponse, vous avez toute ma gratitude :slight_smile:
Merci.

Il est possible qu’un caractère invisible se soit glissé dans ud.

J’essaierais ceci:

if ud.indexOf("0") > -1 then
1 Like

Effectivement il y a 3 bytes dans la chaine de retour.
Le premier correspond à 1 ou 0 (true ou false), c’est celui qui m’intéresse pour cocher mes CheckBox, les 2 autres, je ne sait pas.
J’ai réussi hier, après, moults essaient hasardeux, en faisant ceci :slight_smile:
Mais je suis conscient qu’on peu faire mieux, surtout en convertissant directement le "CFStringRef” en String. Je suis preneur de toute amélioration de ce code !

Var ud As String // ou CFStringRef
Var cs As New MemoryBlock(3) // 3 bytes retournés
bt = “”
ud = “”
Shell1.Execute (“defaults read com.apple.dock autohide”)
ud = Shell1.Result //Chaine au format CFStringRef, à convertir !

cs.CString(0) = ud
bt = cs.Byte(0).ToString //On prends le premier byte des 3 !
ret = GetDefaultsReadState(ud) 'Vers MaFonction
CheckBox8.Value = ret

MaFonction (renvoie true ou false) :
if bt = “48” then //Code ASCII 048 = 0 (Eqv False)
Return false
ElseIf bt = “49” then //Code ASCII 049 = 1 (Eqv True)
Return true
else
MessageBox(“Valeur inconnue !”)

End If

Merci,

Haîe ! Ca fonctionne sur les deux premières commandes Shell1.Execute (“…") mais à partir de la 3e j’ai un “OutOfBoundsException” sur la variable cs (MemoryBlock (3)).
“An exception of class OutOfBoundsException was not handled…”

Pourquoi ne faites vous pas ce que j’ai suggéré ? C’est bien plus simple que votre usine à gaz…

Merci Michel,

J’ai mis cela dans ma fonction :
if ud.indexOf(“0”) > -1 then Return false else Return true

Oui effectivement, je n’ai plus d’erreur mais l’état de mes boites à cocher, hormis les 2 premières, ne correspondent pas au fichier com.apple.dock. Elles sont toutes cochées alors que les fonctions correspondantes ne sont pas actives et doivent être décochées (false).

J’ai vu le problème. Selon la commande “defaults read”, elle me retourne soit un 0 ou un 1, soit un TRUE ou un FALSE. Comment tu adapte ton IndexOff() pour les deux conditions ? Je ne suis pas familiarisé avec cette commande…

Exemple `
Shell1.Execute (“defaults read com.apple.dock showhidden”)
ud = Shell1.Result
MessageBox(ud) ----> renvoie “FALSE”

Merci.

J’ai mis comme cela, ca a l’air pas mal :

if ud.indexOf(“0”) > -1 or ud.indexOf(“FALSE”) > -1 then Return false else Return true

1 Like