addition contenu de plusieurs StringGadget ( numériques)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

bonjour,
j'ai trouve ça:

Code : Tout sélectionner

#fenetre_principale = 0 : #gadget_affiche_texte = 0 : #gadget_editeur = 1 
Procedure Ouvre_Fenetre_principale() 
     If OpenWindow ( #fenetre_principale , 0, 0, 200, 200, "fenêtre principale" , #PB_Window_SystemMenu | #PB_Window_WindowCentered ) 
         If CreateGadgetList ( WindowID ( #fenetre_principale ))                    ; on créer la liste des éléments (gadget) de la fenètre
             ButtonGadget ( #gadget_affiche_texte , 10, 10, 180, 20, "Créer le fichier texte" ) 
             EditorGadget ( #gadget_editeur , 10, 40, 180, 150, Text1)             ; on crée un EditorGadget 
             AddGadgetItem ( #gadget_editeur , 0, "Tapez du texte ici" )          ; on crée une ligne de texte dans l'EditorGadget 
         EndIf 
     EndIf 
EndProcedure 
Procedure Creation_Fichier_Texte() 
    Nombre_de_ligne = CountGadgetItems ( #gadget_editeur )             ; on compte le nombre de lignes
                                                                                                        ; on crée un fichier texte ( comme pas indiqué d'adresse de stockage, celui sera écrit à l'emplacement du programme )
       If CreateFile (0, "EditorGadget.txt" )                                         ; On lit chaque ligne de l'EditorGadget, puis on l'enregistre dans le fichier "EditorGadget.txt" 
            For n = 0 To Nombre_de_ligne - 1                                          ; boucle For de la première ligne à la dernière 
               Texte.s = GetGadgetItemText ( #gadget_editeur , n, 0)         ; on lit le texte de ligne n et l'enregistre dans fichiers "EditorGadget.txt" 
                   WriteStringN (0,Texte)                                                           ; permet d'écrire dans le fichier en cours, ici, le 0 puis ajoute un saut de ligne 
            Next 
                                                                         ; Une boucle fait évoluer une variable entre 2 valeurs, la valeur n va prendre les valeurs suivantes :  0, 1, 2, 3, 4, ... , Nombre_de_ligne - 1 
                                                                          ; Pour chaque valeur de n, les actions placées entre le For et le Next seront executées 
            CloseFile (0)                                        ; on ferme le fichier 0 qui correspond à "EditorGadget.txt" 
       EndIf 
   RunProgram ( "EditorGadget.txt" )               ; On ouvre le fichier texte avec les fonction RunProgram
EndProcedure 

Ouvre_Fenetre_principale()              
Repeat                                            
    Event = WaitWindowEvent () 
        If Event = #PB_Event_Gadget           
             Select EventGadget ()  
                  Case #gadget_affiche_texte      
                  Creation_Fichier_Texte() 
             EndSelect 
        EndIf 
Until Event = #PB_Event_CloseWindow : End
et ça:

Code : Tout sélectionner

      StandardFile$ = "C:\"   ; set initial file+path to display
      Pattern$ = "Text (*.txt)|*.txt;All files (*.*)|*.*"
      Pattern = 0    ; use the first of the three possible patterns as standard
      File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
mais comment faire pour passer de l'enreg. automatique dans dossier PB ( 1er code ) à un enreg. choisi -nom, dossier- avec la fenêtre ouvrir / sauver ?
je veux sauvegarder / recharger les sommes entrées dans les StringGadgets et le contenu d'un EditorGadget ?

merci[/quote]
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

oups !!

j'ai mis le "open", mais mes essais avaient bien été faits avec le "save"
une journée sans m'en sortir...
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

j'ai enfin trouvé !!!
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

bravo :)
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

bonjour,

je me trouve bloqué:
comment faire pour sauver, puis ensuite charger le contenu des StringGadgets ?

comme je veux terminer au +vite et que je n'ai pas trop compris la méthode structure / tableau de Chris et que j'avais déja fait toute la présentation j'ai continué comme j'avais commencé.
mais est-ce possible pour la sauvegarde ?
je vois comment y arriver en construisant les stringGadgets sans #PB_Any mais cela conduit à une liste terrible de déclarations ! comment contourner le PB ? j'y ai passé beaucoup de temps mais rien !
c'est à la ligne 320.
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

et pourquoi cette ligne me donne:
incorrect number of parameters ?

Code : Tout sélectionner

SetGadgetText (#nourr13), StrD ( ValD ( GetGadgetText (#nourr1))+ValD ( GetGadgetText (#nourr2))+ ValD ( GetGadgetText (#nourr3))+ ValD ( GetGadgetText (#nourr4))+ ValD ( GetGadgetText (#nourr5))+ ValD ( GetGadgetText (#nourr6))+ ValD ( GetGadgetText (#nourr7))+ ValD ( GetGadgetText (#nourr8))+ ValD ( GetGadgetText (#nourr9))+ ValD ( GetGadgetText (#nourr10))+ ValD ( GetGadgetText (#nourr11))+ ValD ( GetGadgetText (#nourr12)),2) 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@fouilloud : je t'invite a reposter ton code en plusieurs morceaux si tu veux, mais entre balise s'il te plait ...

là c'etait pas possible, que je laisse un fouillis pareil !!! :)

tu as la possibilité aussi de mettre un lien vers ton source, a condition de pouvoir l'heberger bien sur .... :)

en plus un code long trouvera difficilement quelqu'un pour le debugger
car le nombre de bus augmente souvent de façon proportionelle a la longueur du code :)
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

j'ai bien utilisé les balises ? peut-être des lignes trop longues, c'est quelque chose qui manque: pouvoir couper les ligne comme avec VB.
je refais un essai:...et je me rends Cpte en prévisu que c'est bien ça !!
n'ayant pas d'ébergement, je vais essayer de me faire comprendre.

j'ai des lignes de StringGadget ( j'y entre les dépenses par postes (23 x 12 mois) + total par mois + total par postes + total sur l'année + entrée du millésime année + revenu année + un EditorGadget pour du texte vrac .
voila comment sont créés les 312 StringGadget postes par mois et totaux:


Code : Tout sélectionner

y = 90 : x=220 : L=68
For a = 1 To CountString(mois$,",")+1
  nourr(a)=StringGadget(#PB_Any, x,y, L,16,"",#PB_String_BorderLess|#PB_Text_Right ) ;crée StringGadgets poste nourriture
    If a=12 : x=x+98 : L=90 : Else : x=x+76 : EndIf : Next :    x=220 : y = y + 25 : L=68
et ça pour entrer les sommes de chaque poste chaque mois:

Code : Tout sélectionner

If EventType ()= #PB_EventType_Change ;si le contenu d'un gadget a changé 
  QuelGad= EventGadget () ; on regarde quel StringGadget a ete utilisé
     For a= 1 To 13                              ; total annuel  poste "nourr"
        If QuelGad=nourr(a) 
          SetGadgetText (nourr(13), StrD ( ValD ( GetGadgetText (nourr(1)))+ ValD ( GetGadgetText (nourr(2)))+ ...etc     
        EndIf 
     Next
idem pour tous les postes (23)
et voila mes procédures pour sauvegarder et charger le total:

Code : Tout sélectionner

Procedure sauver_tout()
  mil_annee.s = SaveFileRequester("Sauver le fichier","c:\PureBasic\catalogue\","Fichiers: .fou|*.fou",0) ;sauve millésime année 
    CreateFile(0, mil_annee) 
       annee.s = GetGadgetText(#numero_annee) 
          WriteStringN(0,annee)
             nombre_ligne = CountGadgetItems(#editeur)         ; sauve le contenu texte de l'EditorGadget
                For n = 0 To nombre_ligne-1 
                    texte.s=GetGadgetItemText(#editeur,n,0) 
                       WriteStringN(0,texte) 
                Next
                       ;  ICI JE VOUDRAI POUVOIR SAUVER LES SOMMES INSCRITES DANS TOUS LES STRINGGADGETS, 
                        ; POUR LES RECHARGER  A LA SESSION SUIVANTE AVEC LA PROCEDURE OUVRIR_TOUT()
    CloseFile(0)               
EndProcedure  


Procedure ouvrir_tout()     ; ouvrir une année déja enregistrée
     mil_annee.s = OpenFileRequester("Ouvrir le fichier", "c:\PureBasic\catalogue\", "Fichiers: .fou|*.fou", 0)  
     d=ReadFile(1, mil_annee) 
        If d 
           While Eof(1)=0 
              Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10) 
           Wend 
              SetGadgetText(#numero_annee, Text$)
                Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10)  ;COMMENT OUVRIR DANS #EDITEUR SEULEMENT SON TEXTE 
                  SetGadgetText(#editeur, Text$)     ; ET PAS EN PLUS L'ANNEE QUI VIENS D'ETRE CHARGEE DANS #NUMERO_ANNEE ?
        EndIf  
                       ;  ICI JE VOUDRAI POUVOIR OUVRIR LES SOMMES INSCRITES DANS TOUS LES STRINGGADGETS,  
                             ; PRECEDEMENT SAUVEGARDEES
     CloseFile(1) 
EndProcedure
deux PB:
1 - comment sauver/recharger chaque StringGadget des sommes postes/mois/totaux ?
2 - actuellement pour le millésime année et texte vrac (EditorGadget) c'est OK pour la sauvegarde mais au chargement le texte vrac reprends en + l'année ? bon, c'est normal comme ça, mais comment faire ?
PS - pas moyen de montrer ici des lignes + longues ?
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

et, en plus, alors qu'en prévisu tout était OK je me rends compte qu'une fois envoyé mon texte pourtant placé avec balises et devenu diff. au point de vue des longueurs de lignes !!!
qu'est-ce que je fait de travers ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

fouilloud a écrit :et, en plus, alors qu'en prévisu tout était OK je me rends compte qu'une fois envoyé mon texte pourtant placé avec balises et devenu diff. au point de vue des longueurs de lignes !!!
qu'est-ce que je fait de travers ?
fait tout simplement des blocs de code plus petit :)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

mon conseil pour plus de lisibilité de ton code.

utilise l'indentation pour t'y retrouver dans tes boucles tes if/endif select/case etc.

exemple

Code : Tout sélectionner

if x=1
   y=y+1
endif

Code : Tout sélectionner

for a=1 to 100
   if a=20
      b=b+1
   endif
next

Code : Tout sélectionner

select a
case 1
   b=1
case 2
   c=42
endselect
de cette maniere tu peux facilement voir si une boucle est bien fermée si chaque if est bien terminé etc... simplement en regardant plus bas dans le code si le endif est en face de son if etc...

personellement dans mes debut en programmation je ne faisais pas vraiment comme ca et depuis que je procede de la sorte j'ai echappé a un nombre incalculable de bugs

voici ton code

Code : Tout sélectionner

Procedure ouvrir_tout()     ; ouvrir une année déja enregistrée
	mil_annee.s = OpenFileRequester("Ouvrir le fichier", "c:\PureBasic\catalogue\", "Fichiers: .fou|*.fou", 0) 
	d=ReadFile(1, mil_annee)
	If d
		While Eof(1)=0
			Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10)
		Wend
		SetGadgetText(#numero_annee, Text$)
		Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10)  ;COMMENT OUVRIR DANS #EDITEUR SEULEMENT SON TEXTE
		SetGadgetText(#editeur, Text$)     ; ET PAS EN PLUS L'ANNEE QUI VIENS D'ETRE CHARGEE DANS #NUMERO_ANNEE ?
	EndIf 
	;  ICI JE VOUDRAI POUVOIR OUVRIR LES SOMMES INSCRITES DANS TOUS LES STRINGGADGETS, 
	; PRECEDEMENT SAUVEGARDEES
	CloseFile(1)
EndProcedure
je remarque que quand tu lis ton fichier

Code : Tout sélectionner

           While Eof(1)=0
              Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10)
           Wend 
tu ajoute toute les lignes contenues dans le fichier dans la variable 'text$'

alors que si chaque ligne sauvée correspond a un gadget tu dois plutot metre le contenu de la ligne lue dans le bon gadget

donc plutôt quelque chose comme ça

Code : Tout sélectionner

For mois=1 To 12 
	SetGadgetText(nourr(a),ReadString(1))
Next	
et pourquoi cette ligne te donne:
incorrect number of parameters ?
SetGadgetText (#nourr13), StrD ( ValD ( GetGadgetText (#nourr1))+ValD ( GetGadgetText (#nourr2))+ ValD ( GetGadgetText (#nourr3))+ ValD ( GetGadgetText (#nourr4))+ ValD ( GetGadgetText (#nourr5))+ ValD ( GetGadgetText (#nourr6))+ ValD ( GetGadgetText (#nourr7))+ ValD ( GetGadgetText (#nourr8))+ ValD ( GetGadgetText (#nourr9))+ ValD ( GetGadgetText (#nourr10))+ ValD ( GetGadgetText (#nourr11))+ ValD ( GetGadgetText (#nourr12)),2)
regarde bien la position de tes parentheses

SetGadgetText (#nourr13),
tu ferme la fonction AVANT de lui transpmetre tout ses parametres
SetGadgetText (#nourr13,StrD (ValD (GetGadgetText(#nourr1))+ValD (GetGadgetText(#nourr2))+ValD (GetGadgetText(#nourr3))+ ValD ( GetGadgetText (#nourr4))+ ValD ( GetGadgetText (#nourr5))+ ValD ( GetGadgetText (#nourr6))+ ValD ( GetGadgetText (#nourr7))+ ValD ( GetGadgetText (#nourr8))+ ValD ( GetGadgetText (#nourr9))+ ValD ( GetGadgetText (#nourr10))+ ValD ( GetGadgetText (#nourr11))+ ValD ( GetGadgetText (#nourr12)),2))
voila j'espère que mes quelques conseils te seront utiles et n'hésite pas a demander si tu as d'autre questions :)
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

le Problème ne viens pas de blocs codes trop gros mais de LONGUEUR de lignes.
j'ai des lignes qui font 490 caractères (sans espaces).VISUAL a un signes qui permets de continuer sur la ligne suivante tout en conservant le fonctionnement informatique comme une seule ligne. pas PureBasic.

SetGadgetText(nourr(13),StrD(ValD(GetGadgetText (nourr(1)))+ValD(GetGadgetText(nourr(2)))+...etc = 490 caract. comment contourner le prebl. ?

faut-il faire: balise, coller texte, balise ( ce que j'avais fait )
ou: balise, à la ligne, coller texte, à la ligne, balise ou est-ce indifférent

concernant l'enregistrement:

For mois=1 To 12
SetGadgetText(nourr(a),ReadString(1))
Next

mes StringGadget ont été construits comme ceci:

For a = 1 To CountString(mois$,",")+1
nourr(a)=StringGadget(#PB_Any, x,y, L,16,"...etc

je ne peux pas ? utiliser nourr(a) comme tu l'indique sous peine d'avoir une erreur, il faut que je reface la construction sous la forme #nourr(1) ...soit plus de 300 et je dois aussi les mettre en déclaration.
j'avais commencé comme cela et vais peut-être continuer dans cette voie plus volumineuse
merci pour tout
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

fouilloud a écrit :le Problème ne viens pas de blocs codes trop gros mais de LONGUEUR de lignes.
j'ai des lignes qui font 490 caractères (sans espaces).VISUAL a un signes qui permets de continuer sur la ligne suivante tout en conservant le fonctionnement informatique comme une seule ligne. pas PureBasic.

SetGadgetText(nourr(13),StrD(ValD(GetGadgetText (nourr(1)))+ValD(GetGadgetText(nourr(2)))+...etc = 490 caract. comment contourner le prebl. ?

faut-il faire: balise, coller texte, balise ( ce que j'avais fait )
ou: balise, à la ligne, coller texte, à la ligne, balise ou est-ce indifférent

concernant l'enregistrement:

For mois=1 To 12
SetGadgetText(nourr(a),ReadString(1))
Next

mes StringGadget ont été construits comme ceci:

For a = 1 To CountString(mois$,",")+1
nourr(a)=StringGadget(#PB_Any, x,y, L,16,"...etc

je ne peux pas ? utiliser nourr(a) comme tu l'indique sous peine d'avoir une erreur, il faut que je reface la construction sous la forme #nourr(1) ...soit plus de 300 et je dois aussi les mettre en déclaration.
j'avais commencé comme cela et vais peut-être continuer dans cette voie plus volumineuse
merci pour tout

je ne comprend pas ton souci

tu cree tes gadgets avec ta boucle

For a = 1 To CountString(mois$,",")+1
nourr(a)=StringGadget(#PB_Any, x,y, L,16,"...etc

next


pour sauver le contenu des gadget dans un fichier
tu peux faire

Code : Tout sélectionner

sav=CreateFile(#PB_Any,"text.txt")
  For a = 1 To CountString(mois$,",")+1
      WriteStringN(sav,GetGadgetText(nourr(a)))
  Next
CloseFile(sav)
pour charger le contenu du fichier dans tes gadgets tu peux faire la meme chose

Code : Tout sélectionner

load=ReadFile(#PB_Any,"text.txt")
  For a = 1 To CountString(mois$,",")+1
      SetGadgetText(nourr(a),ReadString(load))
  Next
CloseFile(load)
je ne vois pas ou se situe le probleme :)


sauf si tu ne declare pas ton tableau comme etant global en debut de code

global dim nourr(xx)
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

j'ai bien ajouté Global Dim nourr(13), mais seule la somme du 1er mois est enregistrée ? je vais encore regarder + tard, mais il y a autre chose qui pose probl. pour l'instant je ne vois pas comment sauver le millénaire, l'editorgadget et les sommes dans un seul fichier avec le requester qui demande un .s je continue...

rappel la construction des stringgadgets

Code : Tout sélectionner

    For a = 1 To CountString(mois$,",")+1
      nourr(a)=StringGadget(#PB_Any, x,y, L,16,"",#PB_String_BorderLess|#PB_Text_Right ) 
et la procedure sauve

Code : Tout sélectionner

  Procedure sauver_tout()
;  mil_annee.s = SaveFileRequester("Sauver le fichier", "c:\PureBasic\catalogue\", "Fichiers: .fou|*.fou", 0)  

   ;      CreateFile(0, mil_annee)                                        ; sauve le millénaire de l'année
    ;          annee.s = GetGadgetText(#numero_annee) 
    ;         WriteStringN(0,annee)
              
   ;                nombre_ligne = CountGadgetItems(#editeur)     ; sauve le contenu texte de l'EditorGadget
     ;                 For n = 0 To nombre_ligne-1 
      ;                    texte.s=GetGadgetItemText(#editeur,n,0) 
      ;                   WriteStringN(0,texte) 
     ;                 Next

            sav=CreateFile(#PB_Any,"Fichiers: .fou") 
                      For a = 1 To CountString(mois$,",")+1 
                          WriteStringN(sav,GetGadgetText(nourr(a)))
                      Next 

     ;     CloseFile(0)
          CloseFile(sav)                
  EndProcedure
fouilloud
Messages : 34
Inscription : ven. 07/déc./2007 17:15

Message par fouilloud »

bonjour,

terminé !!
j'ai contourné le probl. en faisant un peu différemment mais ça fonctionne parfaitement. je le reprendrai peut être + tard lorsque j'en aurai + appris.
merci à tous.
Répondre