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



## TheBob (19 Mars 2004)

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 (20 Mars 2004)

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 (20 Mars 2004)

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 (21 Mars 2004)

TheBob a dit:
			
		

> J'avais bien essayé ça, mais je dois mal m'y prendre car ça ne fonctionne pas...
> 
> 
> 
> ...



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 (21 Mars 2004)

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 (21 Mars 2004)

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 (21 Mars 2004)

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 (21 Mars 2004)

TheBob a dit:
			
		

> Ah parfait!! Le problème venait bien du chemin. Merci!
> 
> 
> 
> ...



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 (23 Mars 2004)

> 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 (26 Mars 2004)

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 (27 Mars 2004)

tugnegne !! hola the BOB  c'est une défaite bien rapide pour une merdouille


----------



## TheBob (28 Mars 2004)

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__ (30 Mars 2004)

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("Pantherivers:toto.xml", tutu as string)
readfile("Pantherivers: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 (3 Avril 2004)

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__ (3 Avril 2004)

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é


----------

