Gambas France BETA


Pas de compte ? Incription

[Résolu] Boîte de dialogue Enregistrer sous

Ce sujet est résolu.

1
AuteurMessages
Foromus#1 Posté le 14/1/2010 à 21:00:00
Bonjour,

Je viens de découvrir la boîte "Enregistrer sous", j'avoue que c'est un peu compliqué pour moi.
J'explique : mon programme tourne normalement, je clique sur un bouton pour Enregistrer sous (je ne m'occupe pas de Menus pour l'instant), et ma boîte apparaît normalement.
L'aide proposée :

1
Dialog.SaveFile (gb.qt)STATIC FUNCTION SaveFile ( ) AS BooleanAppelle la boîte de dialogue standard pour obtenir le nom d'un fichier à enregistrer.Retourne TRUE si l'utilisateur a cliqué sur le bouton Annuler, et FALSE si l'utilisateur a cliqué sur le bouton OK.Cet exemple montre comment vous pouvez enregistrer le contenu d'un TextArea dans un fichier sélectionné par l'utilisateur. Si l'utilisateur annule la boîte de dialogue le fichier n'est pas enregistré.ExemplesPUBLIC SUB ButtonSave_Click() Dialog.Filter = ["*.txt", "Text Files"] IF Dialog.SaveFile() THEN RETURN File.Save(Dialog.Path, TextAreaEdit.Text)CATCH Message.Info(Error.Text)END


ne me donne pas vraiment le chemin à suivre, si ce n'est Return qui semble abandonner la fonction.
Est-ce que je peux tout mettre à l'inrétieur d'un Sub existante, ou est-ce que je dois écrire le fonction qui va avec ?
Pour faire simple, qu'est-ce que je fais avec tout ça ?....

Merci !
spheris#2 Posté le 14/1/2010 à 21:08:00
Foromus,
C'est toujours le meme principe :

Tu definis une variable de type string qui récupèrera ta valeur retournée :

dim monchemin as string

ensuite tu retournes la valeur de ta boite enregistrer sous puis tu mets ta condition d'existence du fichier :

PUBLIC SUB ButtonSave_Click()
dim monchemin as string
monchemin = Dialog.Filter = ["*.txt", "Text Files"]
IF Dialog.SaveFile() THEN RETURN
File.Save(Dialog.Path, TextAreaEdit.Text)
CATCH
Message.Info(Error.Text)
END

;)
Foromus#3 Posté le 14/1/2010 à 21:38:00
Oui, j'ai un peu bêtement recopié le tout, mais ça ne colle pas...
Au lancement, j'ai un message d'erreur type "TextAreaEdit" est un identifiant inconnu.
Parce que, dans l'histoire, il faut quand même que je récupère le nouveau nom de fichier et son chemin. Donc, et normalement, je dois le récupérer par la boîte.
En fait, je dois récupérer deux choses :
1 - l'accord d'enregistrement, ou le refus,
2- si accord, les nom et chemin du fichier.
Une fois tout ça récupéré, je peux faire ma sauvegarde en appelant la sub adéquate. Mais c'est idiot puisque dans ma Sub dédiée, il y a le chemin et le nom de fichier anciens !
Ou alors, je fais un nouveau Create dans ma Sub Enregistrer sous...
Là, je sens qu'il va falloir ruser un peu....
micio#4 Posté le 15/1/2010 à 10:42:00
' Gambas class file
PUBLIC SUB Form_Open()
' controle -TextArea1- pour saisir du texte par exemple
TextArea1.Text = "saisir\ndu\ntexte"
END
PUBLIC SUB Button1_Click()
' filtre du -dialog-
Dialog.Filter = ["*.txt", "Fichiers texte"]
' ouverture du -Dialog.SaveFile()- + teste
IF Dialog.SaveFile() THEN RETURN ' fin si FALSE
' sauve le fichier si TRUE
File.Save(Dialog.Path, TextArea1.Text)
' informe si erreur
CATCH
Message.Info(Error.Text)
END
Foromus#5 Posté le 15/1/2010 à 16:14:00
Bon, il est clair que sur ce coup-là, je me suis planté :
Une très mauvaise question, et pire, très mal posée.
On efface tout et on recommence.

Voilà, j'ai une ListBox avec dedans, 3 éléments : a, b, c
Je sais comment les mettre, comment les enlever, comment les sauvegarder dans un fichier.
Donc je veux sauvegarder dans un fichier Data.txt, lequel fichier sera installé dans le répertoire de mon application. J'ai un bouton, BoutonEnregistrer, pour enregistrer ce qui est dans ma ListBox, ce qui donne ceci :

1
PUBLIC SUB BoutonEnregistrer_Click() DIM FichierData AS File DIM N AS INTEGER FichierData = OPEN Application.path & "/Data.txt" FOR CREATE FOR N = 0 TO lstBoxNoms.Count - 1 PRINT #FichierData, lstBoxNoms.List[N] NEXT CLOSE #FichierData END


Donc, ceci fonctionne : quand je vais voir dans le répertoire de mon application, je trouve bien le fichier Data.txt, et quand je l'ouvre avec un éditeur quelconque, je retrouve bien mes a, b, c.

Bien, maintenant, je me dis que ces 3 lettres sont importantes, et à tout moment, je voudrais faire une sauvegarde de sécurité, à un endroit quelconque du disque, sous un nom quelconque, au besoin, garder le(s) même(s), (ce qui est idiot..).
Donc, je place un autre bouton sur ma feuille que j'appelle BoutonEnregisterSous. Un double click, et je me retrouve avec :

1
PUBLIC SUB BoutonEnregisterSous_Click()END


Donc, ma vraie question est :

Qu'est-ce que je mets entre le Sub et le End - et éventuellement ailleurs, de manière à ce que l'opération me permette de :
1- sélectionner le répertoire « /Home/toto/Gambas/Essais/Provisoire » - ou un autre,
2- rentrer le nom : « SaveData01 » - ou un autre, dans la boîte de dialogue qui s'affichera,
3- qu'un le clic sur le bouton « Save » de la boîte fasse en sorte que le fichier SaveData01 soit, non seulement créé - et à la bonne place, mais encore, qu'il soit rempli de mes 3 données, a, b, c. ?

Voilà donc ma vraie question !

Si je suis (ou essaie de suivre) les conseils ici donnés, j'arrive à ceci :

1
PUBLIC SUB BoutonEnregisterSous_Click() 'CreerFichierDonnees 'STATIC FUNCTION SaveFile DIM monchemin AS StringDialog.Filter = ["*.txt", "Text Files"]IF Dialog.SaveFile() THEN RETURN'File.Save(Dialog.Path, TextAreaEdit.Text) File.Save(Dialog.Path, monchemin) CATCH Message.Info(Error.Text) END


Guère besoin d'être grand clerc pour supposer que ça va coincer quelque part...
Cela permet déjà d'afficher la boîte, de sélectionner un répertoire et d'entrer un nom, c'est déjà ça ! Mieux encore, ça crée un fichier, mais il est vide... Ce qui me paraît logique...

Bon, j'espère avoir été un peu plus clair cette fois !

Merci de votre attention !
manu#6 Posté le 15/1/2010 à 17:26:00
Avec Gambas ca roule !Bein après tu ré-ouvres ton fichier et tu écris dedans ce que tu a à sauvegarder.

Tu lis ton fichier data.txt avec une boucle (While par exemple) et tu écris dans ton second fichier dataSauv.txt.
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
micio#7 Posté le 15/1/2010 à 18:36:00
« File.Save(Dialog.Path, monchemin) »
Le 2me argument doit être le texte à sauver,
Le chemin complet est contenu dans Dialog.Path.
----------------------------------------------------
1
' Gambas class filePUBLIC SUB Form_Open() ListBox1.Add("premier") ListBox1.Add("deuxième") ListBox1.Add("troisième")ENDPUBLIC SUB Button1_Click() DIM chn, c AS String ' On construit la chaine à sauvegarder FOR EACH c IN ListBox1.List chn = chn & c & "\n" NEXT ' filtre du -dialog- Dialog.Path = Application.Path Dialog.Filter = ["*.txt", "Fichiers texte"] ' ouverture du -Dialog.SaveFile()- + teste IF Dialog.SaveFile() THEN RETURN ' fin si FALSE ' sauve le fichier si TRUE File.Save(Dialog.Path, chn) ' informe si erreur CATCH Message.Info(Error.Text)END
Foromus#8 Posté le 15/1/2010 à 20:43:00
Bonsoir tout le monde,

Bon, là, je vais en surprendre plus d'un : j'ai réussi à faire un truc qui marche...
Un seul regret : si on met un même nom de fichier, l'ancien est écrasé sans mise en garde.
Un second regret quand même : la boite est en anglais...

Par curiosité et à titre culturel :

1
' Gambas class filePUBLIC SUB Form_Open() ListBox1.Add("premier") ListBox1.Add("deuxième") ListBox1.Add("troisième")END

Ça, c'est pour remplir une ListBox, l'intérêt ici ?...

1
' On construit la chaine à sauvegarder FOR EACH c IN ListBox1.List chn = chn & c & "\n" NEXT


OK, le chn, je vois, le c, je vois moins, le \n, pas du tout...

Dans mon travail, pour sauvegarder mes données, j'ai mis un Retour Chariot Chr$(13) pour faire mes séparations entre chaque éléments, sinon, j'avais tout en file indienne. Par ailleurs, il faut mettre son premier élément hors boucle, sinon, le ficher commence par une chaîne vide... (Ce qui risque d'être le cas avec chn = chn & qqchose.)
Bon, ça marche, mais ce n'est peut-être pas la meilleure syntaxe.

Pour le reste de la formule, j'avais à peu près compris, hormis le fait que je ne savais pas trop ce qu'il y avait dans Dialog.Path,

Par contre, je croyais avoir lu que l'enregistrement se faisait si la boite renvoyait False, et non pas True.
Je note que Return permet de sortir de la Sub : ce serait donc l'équivalent du "Exit Sub" de vB ?... (Justement, je cherchais la commande il y a peu).
micio#9 Posté le 15/1/2010 à 22:54:00
"\n" : nouvelle ligne pour linux, revient à chr(10)

la boucle FOR EACH passe en revue chaque élément de ListBox1.List et à chaque itération l'élément courant (ligne) est affecté à c puis dans le corps de la boucle on concatène c à chn

On peut écrir
chn = chn & c & "\n"
ou
chn &= c & "\n"



===========================
FOR EACH élément_courant IN liste_d'élément
'traitement
... ...
NEXT
Foromus#10 Posté le 16/1/2010 à 09:07:00
Bonjour,

Jusqu'alors, je n'ai jamais utilisé la boucle For Each, et si je vois d'emblée à quoi elle sert, je ne connais pas vraiment sa syntaxe.
Je vais voir ça dans un cas concret !

Merci à tous pour ces aides !
spheris#11 Posté le 16/1/2010 à 11:34:00
L'exemple du bloc note de gambas ici :

http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=278

comporte le test si le fichier existe, et le non remplacement du fichier.
Sert en c'est un très bon exemple de Taoteblue.

;)
1