AppleScript, Xcode, Interface Builder et accès à un fichier texte...

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Salut à vous!

Voilà le contexte :
J' (essaye d') utilise(r) Xcode et Interface Builder dans le but de monter une petite application type "dictionnaire interactif Français-Japonais", le tout avec le langage AppleScript.
Des que je tape une chaîne de caractères (destinée à l'affichage dans une zone de texte) en Japonais dans le code AppleScript et que je sauvegarde, la chaîne est transformée en une suite de caractères incompréhensibles.
Par contre, si je fais une interface graphique toute bête avec une zone de saisie, un bouton et une zone d'affichage, en tapant du texte directement en Japonais dans la zone de saisie et en cliquant sur le bouton, la zone d'affichage n'a aucun problème pour me réafficher le texte en Japonais.
Première conclusion : pas moyen de faire comprendre le Japonais lorsqu'il est directement dans le code AppleScript.

Donc :
J'aimerai accéder à un fichier texte (en lecture/écriture) qui contiendrait du texte en Japonais. Selon moi, cette méthode fonctionnerait (et serait probablement la plus adaptée).

Base de travail :
J'ai un livre sur AppleScript qui explique comment accéder à des fichiers. Pour commencer, sous Xcode, il faut créer un nouveau projet de type AppleScript Document-based Application, puis créer l'interface graphique en modifiant le fichier Document.nib (car MainMenu.nib ne contient pas le composant Window). Je suppose donc que le code AppleScript va également dans Document.applescript. Pour le saisir, il faut choisir l'élément File's owner et implémanter les fonctions write to file et read from file que voici...

En écriture :
<font class="small">Code:</font><hr /><pre>
on write to file theObject path name pathname of type ofType
--affectez ici les données que vous voulez stocker à myData
set theFile to open for access (pathname as POSIX file) with write permission
write myData to theFile as string
close access theFile
return true
end write to file
</pre><hr />

En lecture :
<font class="small">Code:</font><hr /><pre>
on read from file theObject path name pathname of type ofType
set theFile to open for access (pathname as POSIX file)
set myData to read theFile as string
close access theFile
--affectez ici le contenu de myData aux éléments de votre interface
return true
end read from file
</pre><hr />

Précision apportée dans le livre :
Toute l'interface utilisateur a déjà été renseignée : on a choisi le nom d'un fichier, géré les doublons et sélectionné un emplacement. Seules les lignes de commentaires (myData) doivent être modifiées selon vos besoins.

C'est là que se trouve le problème : où, quand et comment indiquer le fichier auquel on veut accéder!!? Ce n'est écrit nulle part...

Merci pour votre aide
 

simon

Membre d’élite
Club MacG
18 Juin 2000
3 669
16
Singapore
www.simonganiere.ch
La comme ça à première vue je dirais que ta variable pathname contient le chemin d'accès jusqu'a ton fichier.
Quelque chose du genre: /Users/tonlogin/tonfichier.txt
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
J'avais bien essayé ça, mais je dois mal m'y prendre car ça ne fonctionne pas...


Mettons que sur mon interface graphique, je dispose d'une zone de texte et d'un bouton, et qu'au clic sur le bouton je veuille afficher le contenu de texte.txt qui se trouve dans ~/Documents/. Il faut donc que j'implémante la fonction on read from file et on clicked.

Comment appeler la fonction de lecture du fichier depuis celle qui gère le clic du bouton?

Car si je ne crée pas de bouton, c'est un peu chaud pour savoir si la lecture a bien lieu ou pas (même si ma zone de texte n'affiche toujours rien)...
 

simon

Membre d’élite
Club MacG
18 Juin 2000
3 669
16
Singapore
www.simonganiere.ch
TheBob a dit:
J'avais bien essayé ça, mais je dois mal m'y prendre car ça ne fonctionne pas...


Mettons que sur mon interface graphique, je dispose d'une zone de texte et d'un bouton, et qu'au clic sur le bouton je veuille afficher le contenu de texte.txt qui se trouve dans ~/Documents/. Il faut donc que j'implémante la fonction on read from file et on clicked.

Comment appeler la fonction de lecture du fichier depuis celle qui gère le clic du bouton?

Car si je ne crée pas de bouton, c'est un peu chaud pour savoir si la lecture a bien lieu ou pas (même si ma zone de texte n'affiche toujours rien)...
regarde avec ça c'est parfait ni complet mais en tout cas chez moi cela fonctionne, tu cliques sur le boutont tu choisis le fichier et hop il apparait dans le text view. --&gt; http://www.simonganiere.ch/pub/readFromFile.sit
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Merci pour ton exemple! Il fonctionne en effet sans problème!

Par contre, c'est moi qui en crée en essayant d'adapter le script à mes besoins... eh eh

Voici la partie du code que j'ai conservée :
<font class="small">Code:</font><hr /><pre>on clicked theObject
set theFolder to ""
set theFolder to choose file with prompt "Choose a file"
set pathToFolder to POSIX path of theFolder as string
set theFile to open for access (pathToFolder as POSIX file)
set theData to read theFile as string
close access theFile
set contents of text view 'editor" of scroll view "editor" of window of theObject to theData
end clicked</pre><hr />

Tel quel, ça fonctionne très bien. Mais comme je voudrais me passer de la sélection du fichier à ouvrir (dans la mesure où ça sera toujours le même), je cherche comment indiquer cette info directement dans le code. Et bien sûr, je n'y arrive pas...

Voici comment j'ai modifié le script :
<font class="small">Code:</font><hr /><pre>on clicked theObject
set theFolder to "~/Documents/texte.txt"
set pathToFolder to POSIX path of theFolder as string
set theFile to open for access (pathToFolder as POSIX file)
set theData to read theFile as string
close access theFile
set the contents of text field "txtContenu" of window of theObject to theData
end clicked</pre><hr />

A l'exécution, j'ai le message d'erreur suivant : End of file error. (-39)
Je ne dois plus être très loin de la syntaxe exacte, mais il y a visiblement quelque chose que j'ai loupé. Qu'est-ce selon toi? (Précision : le fichier texte.txt contient juste le mot bonjour, sans retour à la ligne, et il s'affichait très bien dans ton exemple).

Autres questions :
- Que signifie POSIX path/file?
- Que sont censés contenir (précisement) les variables theFolder et pathToFolder? (je serais tenté de dire theFolder = ~/Documents/texte.txt et pathToFolder = ~/Documents/)
 

simon

Membre d’élite
Club MacG
18 Juin 2000
3 669
16
Singapore
www.simonganiere.ch
en fait il te faut définir ton chemin d'accès en entier et non pas depuis ~, cela revient à faire quelque chose du genre:

set theFolder to "/Users/tonlogin/Documents/texte.txt"

maintenant theFolder contient le chemin d'accès brut, la variable PathToFolder contient le chemin d'accès convertir au format POSIX (c-à-d avec correction de /) afin qu'il puisse être interprété correctement par le système
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Ah parfait!! Le problème venait bien du chemin. Merci!

Je devrais m'en sortir pour l'écriture dans le fichier.

Par contre, je viens de tester avec du texte en japonais, et ça ne fonctionne toujours pas

Si j'enregistre au format .txt ça me met des caractères bizarres, et en .rtf l'affichage est étrange aussi.
Est-ce que cela ne viendrait pas du fait que les fichiers du project Xcode se trouvent dans un dossier English.lproj? Comment en modifier la langue!?
 

simon

Membre d’élite
Club MacG
18 Juin 2000
3 669
16
Singapore
www.simonganiere.ch
TheBob a dit:
Ah parfait!! Le problème venait bien du chemin. Merci!

Je devrais m'en sortir pour l'écriture dans le fichier.

Par contre, je viens de tester avec du texte en japonais, et ça ne fonctionne toujours pas

Si j'enregistre au format .txt ça me met des caractères bizarres, et en .rtf l'affichage est étrange aussi.
Est-ce que cela ne viendrait pas du fait que les fichiers du project Xcode se trouvent dans un dossier English.lproj? Comment en modifier la langue!?
Si tu veux créer une localisation en japonais il te faut procéder de la manière suivante: sélectionne le fichier que tu veux localiser (dans le cas présent le script ainsi que le fichier .nib) avec le fichier sélectionner tu fais lire les infos (soit depuis la toolbar avec le bouton correspondant ou en faisant un control-clique puis show infos. là tu pourras ajouter une localisation et sélectionner le japonais
 

la tortue

Membre confirmé
6 Novembre 2003
397
1
Si j'enregistre au format .txt ça me met des caractères bizarres, et en .rtf l'affichage est étrange aussi.
Il faut que tu enregistres ton fichier avec le bon encodage de caractères (Unicode ou autre).
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Je vois bien tous ces différents réglages, mais je n'arrive toujours pas à régler mon problème d'affichage.

Je laisse tomber, ça devient pénible. Et puis j'ai trouvé le même genre d'application, dans laquelle il est possible de modifier un fichier au format RTF pour utiliser la liste de mots que l'on veut (programme Cocoa, ça gère peut-être mieux le Japonais que l'AppleScript!?).

Merci pour vous coups de main en tout cas!
 

plumber

Membre confirmé
15 Janvier 2003
473
0
tugnegne !! hola the BOB c'est une défaite bien rapide pour une merdouille
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Oui mais euh...!


Pi d'abord, j'comprends pas pourquoi ça coince leur format de langue. Et vu que ce que je voulais existe déjà, j'vais pas me priver. Ca m'évitera de passer des heures à cogiter pour pas grand chose.

Qui a dit que c'était pas bien de choisir la solutions de facilité!?
 

__bobo__

Membre junior
29 Mars 2004
69
0
voila 2 fonctions qui marchent pour tt ce que tu veux, y plus qu'a changer le chemin

set tutu to "vive le mac, ca dépote un g6 quadri proso!!!"

writeFile("Panther:Divers:toto.xml", tutu as string)
readfile("Panther:Divers:toto.xml")


on readFile(theFile)
local theData, fileRef
set fileRef to open for access theFile
try
set theData to read fileRef
close access fileRef
on error errMsg number errNum
close access fileRef
error errMsg number errNum
end try

return theData
end readFile


on writeFile(theFile, theData)
local fileRef
set fileRef to open for access theFile with write permission
try
set eof fileRef to 0
write theData to fileRef
close access fileRef
on error errMsg number errNum
close access fileRef
error errMsg number errNum
end try
end writeFile
 

TheBob

Membre confirmé
19 Avril 2003
132
0
Visiter le site
Merci pour ta participation, Bobo.
J'ai esayé ton code, qui fonctionne très bien en effet, à 2 exceptions près :
- Il m'est quasi impossible de mettre la main sur le fichier (txt, rtf, ce que tu veux) qui est créé lorsqu'il n'existe pas. Sur tous les essais que j'ai fait, je ne l'ai vu apparaître qu'une seule fois dans mon dossier Documents. Et en plus, impossible de l'ouvrir avec TextEdit!! J'y comprends rien!

- Si j'essaye le même code avec un fichier rtf contenant ce que je veux lire, j'ai le message d'erreur End of file error...

J'sais pas, j'dois pas être doué


Enfin bref, je me suis rendu compte qu'en PHP, ce que je voulais faire fonctionne très bien (à savoir, entre autre, l'affichage du Japonais). Donc je suis parti là-dessus et c'est quasiment terminé!
 

__bobo__

Membre junior
29 Mars 2004
69
0
la création/lecture de fichier marche trés bien, mais :

mon tutu as string est du texte, un document rtf contient du text et des info du style police, encodage, gras ou pas.

et la c'est a toi de rajouter tt ca.

Le php est surement plus adapté