Cibler un volume dans Real Studio

BBFUNK01

Membre actif
18 Octobre 2009
119
0
42
Bourg en Bresse
Hello,

Je suis toujours dans mon apprentissage de real Studio, j'ai donc développé une petite application qui fonctionne bien à un détail près : je dois copier des fichiers d'un répertoire à un autre, ce répertoire est situé sur un volume réseau et je ne parviens pas à cibler ce volume en question.
pour atteindre ce dernier j'ai essayé ceci :

SpecialFolder.Desktop.Child("le_volume")

mais j'obtiens alors une erreur :
"An exception of class NilObjectException was not handled. The application must shut down."

je suppose que le problème vient du chemin que je définis pour atteindre "le_volume".
Auriez-vous une idée ?

Merci,

BBFUNK01
 
Hello,

Je suis toujours dans mon apprentissage de real Studio, j'ai donc développé une petite application qui fonctionne bien à un détail près : je dois copier des fichiers d'un répertoire à un autre, ce répertoire est situé sur un volume réseau et je ne parviens pas à cibler ce volume en question.
pour atteindre ce dernier j'ai essayé ceci :

SpecialFolder.Desktop.Child("le_volume")

mais j'obtiens alors une erreur :
"An exception of class NilObjectException was not handled. The application must shut down."

je suppose que le problème vient du chemin que je définis pour atteindre "le_volume".
Auriez-vous une idée ?

Merci,

BBFUNK01

As tu essayé de faire ceci ?

NomVolume= new FolderItem
NomVolume.name=SpecialFolder.Desktop.Child("le_volume")
 
Bonjour,

C'est comme ceci
Bloc de code:
Dim the_Volume as New FolderItem("le_volume:",FolderItem.PathTypeAbsolute)
Important le : doit être toujours après le nom du volume pour un absolute path
 
Re,

désolé pour la réponse tardive.

CathyGYM -> non je n'ai pas essayé ton code :

NomVolume= new FolderItem
NomVolume.name=SpecialFolder.Desktop.Child("le_volume")

Mais à priori je pense que ce doit être sensiblement la même chose que le code que j'ai utilisé avec comme différence le fait que tu déclares en variable le volume en question au préalable.

Mac_Jac -> Donc si je pige bien c'est ce code :

Dim the_Volume as New FolderItem("le_volume:",FolderItem.PathTypeAbsolute)

...qu'il faut que j'utilise pour cibler le volume, mais ce code permet de déclarer le volume ou alors c'est comme ceci que je peux "entrer" dans le volume pour enregistrer des fichiers dans un dossier contenu dans le volume ? Comme je le comprends c'est la déclaration du volume, donc ensuite il faudrait que j'écrive un truc comme ça pour cibler un dossier :

Dim the_Volume as New FolderItem("le_volume:",FolderItem.PathTypeAbsolute)
the_Volume.Child("dossier1").Child("sous_dossier1").Child("sous_dossier2)

Est-ce que j'ai bien compris le truc ?

Pour le verdict ce sera demain car là je suis chez moi et le fameux volume... A mon boulot :).

BBFUNK01

---------- Nouveau message ajouté à 19h30 ---------- Le message précédent a été envoyé à 19h30 ----------

Et merci à vous deux pour vos réponses ;).

BBFUNK01
 
Comme je le comprends c'est la déclaration du volume, donc ensuite il faudrait que j'écrive un truc comme ça pour cibler un dossier :

Dim the_Volume as New FolderItem("le_volume:",FolderItem.PathTypeAbsolute)
the_Volume.Child("dossier1").Child("sous_dossier1").Child("sous_dossier2)

Est-ce que j'ai bien compris le truc ?
Oui, tu as bien compris.

Mais, pour ne pas planter l'application en cas d'erreur :
Il faut toujours vérifier que le volume est monté, sauf si c'est le volume de démarrage.
Bloc de code:
  Dim the_Volume as FolderItem
  Try
    the_Volume= New FolderItem("le_volume:", FolderItem.PathTypeAbsolute)
  Catch err as UnsupportedFormatException
    MsgBox "Le volume 'le_volume' n'est pas monté ou n'existe pas"
    return //le reste du code ne sera pas executé
  End Try

Pour un sous-dossier (Child), il faut vérifier avec la propriété Exists du Folderitem.
Donc, chaque Child est à vérifier , sauf le dernier Child s'il faut le créer.
 
Hello,

Mes respects Mac_Jac :zen:, ton code marche à merveille ! Je n'ai pas encore testé celui de ton dernier message mais je l'ajouterai dans l'appli dès cet après-midi. Question subsidiaire Mac_Jac : ça fait combien de temps que tu fais du Real Basic ? Car à chaque problème que j'ai soumis tu as répondu et fais mouche de suite, et pour l'anecdote j'ai posé la question sur un autre forum pour mon histoire de volume et les réponses que j'ai obtenu n'ont pas fonctionné... Donc j'ai comme l'impression que tu maîtrises bien ton sujet :up:.

Un grand merci à toi en tout cas ;).

BBFUNK01
 
Bonjour,

Question subsidiaire Mac_Jac : ça fait combien de temps que tu fais du Real Basic ?
Car à chaque problème que j'ai soumis tu as répondu et fais mouche de suite,
J'en ai fait environ quatre ans, mais à partir de 2006, j'utilise Xcode si j'ai besoin d'une interface graphique, sinon j'utilise AppleScript ou des scripts shell.
J'ai renouvelé Real Studio en 2009 en cas de mise à jour de mes vieilles applications Realbasic.
Ma version actuelle est 2010.2.1.0


et pour l'anecdote j'ai posé la question sur un autre forum pour mon histoire de volume et les réponses que j'ai obtenu n'ont pas fonctionné...
Il existe différentes solutions pour obtenir ce que tu demandes,
mais les problèmes, c'est que leurs solutions exigent certaines connaissances, car (les explications et le bout de code en exemple (souvent selon leurs mémoires) ne sont pas toujours compréhensibles par un débutant.

Par exemple ce bout de code :
Bloc de code:
Dim leFich as Folderitem
LeFich = GetFolderItem("Unix/Volumes/nom-de-ton-disque-dur", folderitem.shellpath)
Pour les connaisseurs d'Unix, il sait comment écrire le chemin.
Le chemin des volumes autres que le démarrage commence toujours par /Volumes/et le nom du volume/

Le chemin du volume de démarrage est seulement la barre oblique / (sans le nom du volume)
Donc, Unix était là pour indiquer le type de chemin.

folderitem.shellpath est écrit de mémoire. mais c'est ce code
Bloc de code:
FolderItem.PathTypeShell

Donc, quand j'écris une réponse, j'essaie toujours d'être précis dans mes explications et dans mon exemple de code.

Si tu veux utiliser GetFolderItem:
il ne donnera jamais d'erreur, il faut vérifier avec Exists comme ceci.
Bloc de code:
  Dim the_Volume as Folderitem
  the_Volume = GetFolderItem("/Volumes/le_volume", FolderItem.PathTypeShell)
  if the_Volume.Exists then
    // le volume est monté
    
  else
    MsgBox "Le volume 'le_volume' n'est pas monté ou n'existe pas"
  end if
 
Hello mac_jac,

merci pour toutes ces explications complémentaires :up:. Une petite question d'ordre "pratique", à mon travail on envisageait éventuellement de se tourner vers Xcode pour la création de nos applications, mais il semblerait que Xcode soit beaucoup plus délicat à "apprivoiser" que Real Studio, est-ce ton avis aussi ?

A plus ;),

BBFUNK01
 
Bonjour,

à mon travail on envisageait éventuellement de se tourner vers Xcode pour la création de nos applications, mais il semblerait que Xcode soit beaucoup plus délicat à "apprivoiser" que Real Studio, est-ce ton avis aussi ?
J'ai lu ta discussion sur macfr, je n'ai vraiment rien de plus à ajouter.
 
Hello,

bon de toute manière j'ai conclu que Real Studio serait plus "abordable" techniquement pour moi et mes collègues (d'autant plus que personne au sein de mon équipe n'a jamais fait de prog hormis moi et une collègue, donc Xcode...).
Bref, le fait que tu aies lu ma discussion sur macfr m'amène à te poser cette question :
est-il "simple" de faire communiquer une application créée avec Real Studio avec une autre application ? Dans le détail voici ce que j'envisagerai : l'aide que tu m'as fournie m'a permis de générer des fichiers textes et de copier des fichiers pdf dans un dossier afin de "sauter des étapes" au niveau de la création/gestion de fichiers de flashage, ce qui me permet donc d'obtenir mes fichiers à flasher simplement en remplissant des champs textes dans l'application créée avec real Studio. j'aimerai aller plus loin en propageant les fichiers textes générés dans l'application qui flashe les fichiers, du genre indiquer qu'une fois les fichiers textes générés, ceux-ci sont automatiquement envoyés vers le rip dans tel flux pour être flashés.
Je présume qu'il y a un "chemin" différent à déclarer pour solliciter l'application de flashage, et également une méthode pour lancer l'application si celle-ci n'est pas en activité ?

BBFUNK01
 
est-il "simple" de faire communiquer une application créée avec Real Studio avec une autre application ?
j'aimerai aller plus loin en propageant les fichiers textes générés dans l'application qui flashe les fichiers, du genre indiquer qu'une fois les fichiers textes générés, ceux-ci sont automatiquement envoyés vers le rip dans tel flux pour être flashés.
Je présume qu'il y a un "chemin" différent à déclarer pour solliciter l'application de flashage, et également une méthode pour lancer l'application si celle-ci n'est pas en activité ?

BBFUNK01
On peut piloter l'application (si elle est scriptable) en AppleScript, le nom de l'application suffit (aucun besoin de connaître l'emplacement de l'application).
C'est très simple d'utiliser un script AppleScript qu'on insère dans un projet Real Studio.

Quel est le nom de cette application de flashage ?
Pour voir si elle est scriptable, glisse son icône sur l'application "Éditeur AppleScript".

Sinon si elle accepte des lignes de commande (shell), c'est aussi très simple de l'utiliser dabs Real Studio
 
Hello Mac_Jac,

du coup le problème est résolu : avec une collègue nous avons ce matin édité un flux Nexus (Nexus est une application Esko Artworks), donc de mon côté il faut que je retravaille mon application de manière à générer un dossier qui sera nommé en fonction des 4 champs textes qui sont à remplir, puis simplement générer 2 fichiers textes à l'intérieur de ce dossier. Et au final il faut que j'enregistre ce dossier et son contenu dans un hotfolder situé sur un volume, et c'est ça que le flux prend le relais en créant les fichiers de flashage, puis n les flashant automatiquement.
Bref, mission accomplie (en grande partie grâce à toi pour l'appli Real Studio :up:).

Néanmoins je vais faire des essais en créant des applis qui communiquent avec d'autres applis pour jauger l'étendue des possibilités, par exemple ouvrir un fichier.pdf, convertir des fichiers... ce genre de choses quoi.
Pour répondre à ta question l'application de flashage se nomme "Shuttle", c'est une sorte de rip où l'on drag and drop les fichiers qu'on souhaite flasher, ensuite l'application qui gère les flux se nomme "Nexus", "Shuttle" n'étant qu'une "passerelle" des fichiers vers "Nexus", en fait "Shuttle" se résume à être une fenêtre où l'on sélectionne le hotfolder du flux souhaité après avoir drag and dropé les fichiers.
Quand tu parles d'insérer un script AppleScript dans un projet Real Studio tu veux dire qu'il faut importer le script AppleScript dans le projet tel qu'on importerait une image ? Ou alors il faut insérer le script dans l'éditeur de script de real Studio ?

BBFUNK01

---------- Nouveau message ajouté à 12h03 ---------- Le message précédent a été envoyé à 11h56 ----------

Une dernière question si je puis me permettre :
Je présume que dans Real Studio comme dans tous les softs de programmation il est possible d'utiliser des tableaux (on dit "array" aussi dans real Studio ?), et qu'à priori on peut trier des tableaux en passant par exemple par une boucle ?
Car je me dis que j'améliorerai bien l'appli en automatisant de A à Z les tâches, en gros on a une base de données sous forme de fichier excel et l'idée serait de "lire" cette base avec l'appli, de trier les données suivant les différents paramètres, de les réordonner après le tri, puis de les flasher ensuite.
Dans l'hypothèse ça te semble jouable (lire le fichier excel j'entends, je me doute qu'il y une gestion des arrays et des boucles dans Real Studio) ?

BBFUNK01
 
Hello BBFUNK01,

Quand tu parles d'insérer un script AppleScript dans un projet Real Studio tu veux dire qu'il faut importer le script AppleScript dans le projet tel qu'on importerait une image ?
Oui, c'est exactement comme une image.

Je n'ai pas le temps en ce moment pour répondre à ta deuxième question, mais je le ferais probablement dimanche.
 
Quand tu parles d'insérer un script AppleScript dans un projet Real Studio tu veux dire qu'il faut importer le script AppleScript dans le projet tel qu'on importerait une image ? Ou alors il faut insérer le script dans l'éditeur de script de real Studio ?
BBFUNK01

Si je peux me permettre de compléter le message de Maître Mac_Jac, tu fais passer le script dans ton projet Real Studio (glisser déposer). Le script apparait alors dans la fenêtre projet dans les "Build Automation". Attention, il est très important que le script soit enregistré en tant que script (et non application comme on pourrait le penser). On peut par contre continuer à le faire évoluer à partir d'applescript (le programme importé n'est pas figé), et même si on le change de nom real studio change le nom également...
L'appel à partir de visual studio se fait sans call ni run, mais juste avec le nom de script ; c'est un peu déroutant car contrairement aux variables déclarées dans visual studio, il ne nous est pas proposé lorsque l'on frappe les premières lettres.
Enfin, il est également possible de lui faire passer des arguments, mais dans ce cas il faut déclarer les variables au début du script, exemple de code :

dans le script :
Bloc de code:
on run (MaVariable1Arg, MaVariable2Arg)
set MaVariable1 to MaVariable1Arg as string
set MaVariable2 to MaVariable2Arg as string
display dialog "Les deux arguments sont " & MaVariable1 & " et " & MaVariable2
end run

Appel de real studio :
Bloc de code:
Dim Var1 as String
Dim Var2 as String
Var1="Variable 1"
Var2="Variable 2"
Mon_Script(Var1,Var2)

Enfin, il faut tester le script isolément avant de l'exécuter à partir de Real Studio car si çà plante on ne sait pas où... il ne se passe rien. Le manque de débuguer sur AS nécessite d'ailleurs souvent de faire des affichages, car je trouve perso que les messages d'erreur ne sont pas toujours très explicites.

Concernant les variables "tableaux", je les ai assez peu utilisées mais ce que je peux te dire, c'est qu'ils se déclarent comme les variables simples. A ma connaissance, les index partent de 0 et je ne sait pas si on peut les faire partir de 1 :
Bloc de code:
Dim Tableau1(20) as string
Dim Tableau2(20,5) as integer
For i=0 to 20
   Tableau1(i)="Essai"+str(i)
   For j=0 to 5
      Tableau2(i,j)=i*j
   Next j
Next i

Enfin, concernant l'utilisation d'excel, j'attire ton attention sur le fait que les objets ExcelApplication ne sont utilisables que sous Windows. Tu peux par contre lire des tableaux "Numbers" à partir d'applescript.

Bon courage pour ton projet ;)
 
Hello,

Mac_Jac et cathyGM -> encore une fois merci infiniment à vous deux pour tous vos éclaircissements :up:.
Concernant la lecture d'un fichier excel ce n'est qu'une hypothèse envisagée pour améliorer au paroxysme le minimum d'actions et de manipulations à effectuer, et il est encore trop tôt pour dire si cela se fera (je ne suis pas le seul à intervenir dans cette mise en place donc ça n'est pas de mon seul ressort).
Autrement à l'heure où je rédige cette réponse j'avais une autre question potentielle à poser, mais comme je viens à l'instant de trouver la réponse et bien je ne vais pas la poser :).
C'était simplement créer un fichier.texte sans boîte de dialogue, fichier.texte à créer à l'intérieur du dossier fraîchement créé, voici le code pour ceux que ça intéresse :

Bloc de code:
//création du dossier :
  Dim DEST, newFolder as FolderItem
  DEST = SpecialFolder.Desktop.child("volume").child("sous_volume").child("flux")
  newFolder = DEST.child(DOS)
  newFolder.createAsFolder
  

//création du fichier.texte :
  Dim fich1 as FolderItem
  Dim stream as TextOutputStream
  fich1 = DEST.child(DOS).child(Art1 + "-amalgame" + ".fea")
  If fich1 <> Nil then
    stream=TextOutputStream.Create(fich1)
    fich1.MacCreator="ttxt"
    Stream.WriteLine ("ArtPro Grid Layout File V1.0")
    Stream.WriteLine (Art1 + ".pdf," +  Art2 + ".pdf," + Art3 + ".pdf," + Art4 + ".pdf")
    Stream.WriteLine (Art1 + ".pdf," +  Art2 + ".pdf," + Art3 + ".pdf," + Art4 + ".pdf")
    Stream.Close
  End if

A plus ;),

BBFUNK01

---------- Nouveau message ajouté à 20h38 ---------- Le message précédent a été envoyé à 20h18 ----------

Re,

je cherche tout de même comment faire une zone de texte "info" dans mon appli, un champ texte qui afficherait une sorte de statut, par exemple : "erreur", ou "opération réussie". Un équivalent du champ de texte dynamique dans Flash, soit un champ de texte non sélectionnable et non éditable. Est-ce possible dans Real Studio ou suis-je obligé d'utiliser une TextField ?

Merci ;),

BBFUNK01
 
je cherche tout de même comment faire une zone de texte "info" dans mon appli, un champ texte qui afficherait une sorte de statut, par exemple : "erreur", ou "opération réussie". Un équivalent du champ de texte dynamique dans Flash, soit un champ de texte non sélectionnable et non éditable. Est-ce possible dans Real Studio ou suis-je obligé d'utiliser une TextField ?

Pour faire une zone de texte non sélectionnable et non éditable sur Real Studio, tu as le choix entre un textfield avec la propriété enabled décochée, soit, plutôt un Label, qui peut également être modifié de façon dynamique...
Bloc de code:
Label1.text="erreur"    '---  (ou "opération réussie")

TextField1.text="erreur"
TextField1.enabled=false
Tu pourras même lui changer la couleur de façon dynamique (pour faire ressortir l'erreur par exemple) avec la propriété .textcolor (et même .backcolor pour les textfield)... après le choix c'est plus une question de design si tu as juste un texte à écrire dedans...:cool:
 
Merci beaucoup CathyGYM, ça marche nickel :up:.

A plus ;),

BBFUNK01

---------- Nouveau message ajouté à 13h15 ---------- Le message précédent a été envoyé à 11h59 ----------

Hello,

je me heurte à un nouveau "petit" problème d'ordre graphique cette fois-ci, j'effectue un contrôle sur les champs entrés dans l'appli, et par conséquent si les champs sont ok un message "ok" s'affiche, si ce n'est pas ok un message "erreur" s'affiche. Lorsque le message s'affiche le focus est sur le champ texte TextField4, j'aimerais donc que lorsque l'on met le curseur de la souris sur le TextField1 le champ texte d'erreur se réinitialise à "". Je me doute qu'il y a une histoire de SetFocus ou GotFocus mais je n'ai pas encore trouvé la solution. Avez-vous des suggestions ?

Merci ;),

BBFUNK01
 
Raahhh...
Décidément je sèche encore sur un truc : écrire dans un fichier.texte existant et ce en ajoutant le nouveau texte à la ligne suivante, j'ai donc écrit ce code :

Bloc de code:
    Dim FLASHAGE as FolderItem
    Dim stream3 as TextOutputStream
    FLASHAGE = SAVE.child("FLASHAGE du " + DATE).child("Flashage amalgames du " + DATE)
    If FLASHAGE <> Nil then
      stream3 = TextOutputStream.Create(FLASHAGE)
      FLASHAGE.MacCreator="ttxt"
      Stream3.WriteLine (Archive)
      Stream3.Close
    elseif FLASHAGE.Exists = true then
      Stream3.Write (Archive)
      Stream3.Close
    End if

J'ai donc regardé dans le manuel et ai fait des tests avec append et Delimiter :

Bloc de code:
elseif FLASHAGE.Exists = true then
      Stream3.append(FLASHAGE)
      Stream3.Write (Archive)
      Stream3.Close
    End if

et :

Bloc de code:
elseif FLASHAGE.Exists = true then
      \n = TextOutputStream.Delimiter
      Stream3.Write (\n + Archive)
      Stream3.Close
    End if

Mais sans succès... Comment donc écrire dans un fichier.texte ayant déjà un contenu, et ce sans écraser ce contenu ?

Merci ;),

BBFUNK01
 
je me heurte à un nouveau "petit" problème d'ordre graphique cette fois-ci, j'effectue un contrôle sur les champs entrés dans l'appli, et par conséquent si les champs sont ok un message "ok" s'affiche, si ce n'est pas ok un message "erreur" s'affiche. Lorsque le message s'affiche le focus est sur le champ texte TextField4, j'aimerais donc que lorsque l'on met le curseur de la souris sur le TextField1 le champ texte d'erreur se réinitialise à "". Je me doute qu'il y a une histoire de SetFocus ou GotFocus mais je n'ai pas encore trouvé la solution. Avez-vous des suggestions ?
BBFUNK01

Pour celà, tu programmes l'évènement gotfocus du textfield1, pour çà tu regardes sur la partie gauche de ton projet tu as la liste des controles disponibles sur ta feuille, tu choisis textfield1, puis l'évènement gotfocus, et dans la partie programme, tu fais la remise à "" de la zone de texte qui contient les message d'erreur (textfield4 je crois)...
Bloc de code:
textfield4.text=""

Je regarde ton message suivant, et je vois si je peux y répondre...

---------- Nouveau message ajouté à 18h43 ---------- Le message précédent a été envoyé à 18h24 ----------

Décidément je sèche encore sur un truc : écrire dans un fichier.texte existant et ce en ajoutant le nouveau texte à la ligne suivante...
J'ai eu un problème similaire récemment, et je l'ai contourné en passant par un fichier temporaire. Pas très propre, mais çà avait marché, en copiant le fichier existant dans un fichier. Puis j'avais recopié toutes les lignes. Ca donne un truc comme çà :


Bloc de code:
  dim fFic as FolderItem
  dim fFicTemp as FolderItem
  dim FichierAEcrire as TextOutputStream
  dim FichierALire as TextInputStream
  '--- Déclaration de tes folderitems
  '--- Donner un path aux 2 fichiers 
  if fFic.exists then
     fFic.CopyFileTo (fFicTemp)
     FichierALire=TextInputStream.open(fFicTemp)
     FichierAEcrire=TextOutputStream.open(fFic)
     while not FichierALire.EOF
          ligne = FichierALire.ReadLine
          FichierAEcrire.writeline ligne
     wend
     FichierALire.close
     fFicTemp.delete
   else
     FichierAEcrire=TextOutputStream.Create(fFic)
   end if
   FichierAEcrire.writeLine LigneSuivante


Mais je pense qu'il doit y avoir mieux... (je débute aussi !) ;)
Bon courage...
 
Re CathyGYM,

Ah ! Pour le coup du gotFocus en fait c'était simple comme bonjour ! Je n'avais pas encore mis le nez dans les différentes propriétés des contrôles... Merci beaucoup ;).
Pour ce qui est d'écrire dans le fichier.texte qui possède déjà un contenu je vais chercher pour trouver la solution adéquate, car je t'avoue que même si ta solution fonctionne comme tu le dis ce n'est "pas très propre".

A plus ;),

BBFUNK01