J'ai remarqué un certain intérêt de passer des données de Excel vers PB et inversement.
J'ai aussi vu que la plupart du temps on utilise beaucoup de fichiers séquentiel…
La première ligne étant utilisé comme libellé de chaque colonne séparée par un séparateur
Ici le caractère "|" … mais pouvant être ";" ou "," ou tout autre caractère non utilisé à l'intérieur d'un champs.
Aussi j'ai réalisé le code suivant à partir de morceaux glanés ci et là… Et arrangé à ma manière.
Le but de ce code est de lire tout fichier organisé comme ci-dessus venant d'exportation Excel, Access et autres et de pouvoir le traiter sous PureBasic. C'est-à-dire "Modifier", "Supprimer", ou même "ajouter" un enregistrement. Ce fichier étant alors accessible aussi via l'importation aux programmes qui l'aurait exporté ou même créer un fichier sous cette forme le gérer sous PB et l'utiliser ailleurs si utile.
PS: Pour tout test du programme vous copier les lignes ci-dessus (en bleu) et les sauver via le bloc notes sous forme "NomFichier.txt" ou vous exporter un de vos fichier Excel en n'omettant pas de donner le séparateur…
Note : Je l'ai commenté autant que je croyais utile, mais bon ce n'est pas forcément suffisant. Tout comme sa structure ou les fonctions utilisée ne sont pas forcément du goût des puristes PB… Mais l'intérêt est peut là aussi, comme quoi on peu écrire ça aussi…
Code : Tout sélectionner
; =============================================================================================
; Lecture de fichier DIVERS (.TXT) Vers. 1.1 2009-06-26 * Gerhard J. *
; ******************************************************************************************************************************************
; J'utilise une librairies de GNOZAL : 1- PureLVSORT qui permet de trier les colonnes d'un tableau)
; 2- Procédure de redimensionne l'écran (Resize grace à ProcedureResize.pbi) Du Forum ??
; Merci à eux......
; =============================================================================================
; NOTE : Objet de ce programme est de lire des fichiers séquentiel venant d'autres applications avec la première Ligne descriptive
; Donc aucune Structure de fichier n'est définie elles sont données par la première ligne du fichier à lire !!!!
;
; Forme = Expression 1 | Expression 2 | E.... | Expression n | Expression n+1 et "|" étant ICI le séparateur des données ...
;
; Soit, ce que tout gestionnaire de fichiers est normalement capable de produire sous forme "Nom de fichier.TXT"
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Avec par la suite et après la lecture .....
; 1- Possibilité de créer un fichier à accès direct et indéxé ou HashCodé ou seulement séquentiel à la sortie
; 2- Créer un fichier à Arborescence relationnelle..
; 3- D'autres formes que je donnerais par la suite...
; 4- Ou en faire une base de donnée avec SQlite ou autre !!!
; ==============================================================================================
; ATTENTION :
; *****************
; Dans le programme les données sont luent dans un répertoire relatif au programme qui est Rep$+"Mes_Data\"
; Rep$ étant le répertoire ou se trouve le programme...
;
; ==============================================================================================
; Constantes *
; -----------------*
Enumeration ;{
#Fenetre_main=0
#Fenetre_ajouter=1
#Fenetre_Init
EndEnumeration;}
Enumeration ;{
#file : #Dfiles :#Liste
#bouton_valide : #bouton_annule
#bouton_Suivant : #bouton_Precedent
#cadre_0
EndEnumeration ;}
Enumeration ;{
#menu_Ajoute : #menu_Modifier
#menu_Effacer : #menu_Sauver
#menu_Quitter : #menu_Infos
EndEnumeration ;}
;{ ---------------------- GLOBAL --------------------------------------------------
Global Modification, NonOk, MaxL=10, Ref, IndexFiltre ; Flags
Global Nbr_Enreg , Nbr_Champs, Nb_Colonne, ligne, PremiereCol ;
Global Lng_Enreg , LgMax, nMax, PosX, PosY, PosYDep
Global Hauteur_Fenetre, HauteurBouton, Milieu
Global Rep$, NomFile$, RepData$, FichierParDefaut.s
Global Enreg$, Separateur$, TitreFichier$
Global Cr$=Chr(10)+Chr(13)
Global Dim Tableaux.s(MaxL)
Global Dim TableFichier.s(10,MaxL)
Global Dim Lg_Table.i(j)
Global Dim Lng_Champs.i(MaxL)
Define.L Event, EventWindow, EventGadget, EventType, EventMenu
;}
; ***************************************************************************************
; XIncludeFile "Mes_Pbi\ProcedureResize.pbi"
; OU les deux procédures Ci-Dessous .... sous le nom de "ProcedureResize.pbi"
;****************************************************************************************
; Procédures de redimensionnement de la fenêtre
; ************************************************************
Procedure sauve_taille_gadget(id_window,nb_max_gadget)
Structure gadget
id.L
x.L
y.L
L.L
h.L
EndStructure
Global Dim gadget.gadget(1)
nb_gadget=0
For num_gadget=0 To nb_max_gadget ; #PB_Compiler_EnumerationValue
If IsGadget(num_gadget)
;Debug num_gadget
nb_gadget=nb_gadget+1
ReDim gadget.gadget(nb_gadget)
gadget(nb_gadget)\id=num_gadget
gadget(nb_gadget)\x=GadgetX(num_gadget)
gadget(nb_gadget)\y=GadgetY(num_gadget)
gadget(nb_gadget)\h=GadgetHeight(num_gadget)
gadget(nb_gadget)\L=GadgetWidth(num_gadget)
EndIf
Next
gadget(0)\id=nb_gadget
gadget(0)\h=WindowHeight(id_window)
gadget(0)\L=WindowWidth(id_window)
EndProcedure
; Redimentionnement
Procedure resize_gadget(id_window)
hw=gadget(0)\h
lw=gadget(0)\L
nhw=WindowHeight(id_window)
nlw=WindowWidth(id_window)
For num_gadget=1 To gadget(0)\id
If IsGadget(gadget(num_gadget)\id)
nx=gadget(num_gadget)\x*nlw/lw
ny=gadget(num_gadget)\y*nhw/hw
nh=gadget(num_gadget)\h*nhw/hw
nl=gadget(num_gadget)\L*nlw/lw
ResizeGadget(gadget(num_gadget)\id,nx,ny,nl,nh)
EndIf
Next
EndProcedure
; ===================================================================
;{ -------------------- DECLARATION ----------------------------------
;
Declare Main_0(ww,wh)
Declare LectureFichier()
Declare Ajoute_Enregistrement()
Declare RemoveGadget()
Declare Sauver()
Declare Nouvelle()
Declare AfficheModification()
;}
;{ ============== Préhambule ======================================
ecranx = GetSystemMetrics_(#SM_CXSCREEN) ; Largeur de l'écran Si on veux partir de dimension relative au dimensions réelles... !!!
ecrany = GetSystemMetrics_(#SM_CYSCREEN) ; Hauteur "" ""
Largeur=600:Hauteur=260:Milieu=Largeur/2
;
Orig_X=ecranx/2-Largeur/2: Orig_Y=ecrany/2-Hauteur/2-100 ; Nouveau coin sup gauche... Milieu +/-
;
If OpenWindow(#Fenetre_Init,Orig_X,Orig_Y,Largeur,Hauteur+20,"",#PB_Window_BorderLess )
;
Gosub Message0 ; Les textes
TextGadget(85,60,10,500,30,Text0$)
SetGadgetFont(85,LoadFont(85, "Comic Sans MS", 16))
SetGadgetColor(85,#PB_Gadget_FrontColor, $E25048)
;
TextGadget(97,30,40,Largeur-60,Hauteur-60,Text$,#PB_Text_Border)
SetGadgetColor(97, #PB_Gadget_BackColor, $7CF7FC)
SetGadgetFont(97, LoadFont(97, "Arial", 11, 16))
ButtonGadget(99,30+10, Hauteur-10,60,20, "Arrêter ?" )
ButtonGadget(98,Largeur-100,Hauteur-10,60,20, "Continuer ?" )
Repeat
Select WaitWindowEvent () ; Traite les boutons....
Case #PB_Event_Gadget
Select EventGadget () ; Selectionne en fonction de ....???
Case 99 ; VALIDE
OK=2
Case 98 ; Arreter
OK=1
EndSelect
EndSelect
Until OK<>0
If OK=2:End:EndIf
sauve_taille_gadget(#Fenetre_Init,100) ;100 c'est le nombre de gadget max, comme dans mes programme l'énumeration
EndIf
; ----------------------------------------------------------------------------------------------------
Rep$=GetPathPart(ProgramFilename()) ; Repertoire actuel du programme.
RepData$="Mes_Data\" ; Répertoire relatif
Rep$+RepData$ ; Composition du répertoire complet du fichier
SetCurrentDirectory(Rep$) ; Permet de stabiliser le répertoire...
;
NomFile$+"|*.txt":Typ$=".txt"
IndexFiltre = 0
NomFile$ = GetFilePart(OpenFileRequester("Choisissez le nom de votre bibliothèque", FichierParDefaut, NomFile$, IndexFiltre))
TitreFichier$=Left(NomFile$,FindString(NomFile$,Typ$,1))
If Len(TitreFichier$)=0:End:EndIf ; Arrêt par defaut de nom....
Debug Rep$
Debug NomFile$
; -------------------------------------------------------
Saisie$ = InputRequester("InputRequester","Donnez le séparateur ( | , ou point-virgule, vigule ou autre ) : ","|")
Separateur$=Saisie$
If Saisie$ > ""
a$ = " Vous avez donné comme séparateur :" + Chr(10) ; Chr(10) nécessaire seulement
a$ + Saisie$ ; pour faire un saut de ligne
Else
a$ = " La saisie a été annulée ou il n'y a pas de séparateur ":KKKo=1
EndIf
MessageRequester("Information",a$,0)
CloseWindow(#Fenetre_Init)
If KKKo=1:End:EndIf ; Pas de Séparateur
; ----------------------------------------------------------------------------------------
;}
;========================================================================
; **** Boucle du programme principal ****
;========================================================================
LectureFichier() ; Chargement du fichier
ww=570 :wh=335 ; Dimensions de la fenêtre principale.... POUR utiliser la fenêtre redimensionnable !!!!
Main_0(ww,wh) ; Fenêtre principale
;========================================================================
; * P R O C E D U R E S *
; ==========================================================================
; Procedure de lecture d'un fichier séquentiel avec première ligne descriptive (libellé des colonnes)
; et chaque donnée séparée par un MARQUEUR définit et connus... Fichier excell ou autre par exemple
; Utilisation de Tableaux une DIM pour lire les enregistrements et DIM (I,J) pour Ligne et Colonne...
; ==========================================================================
; *********************************************************************************
; ************* Procedure d'affichage de fenetre *************
; *********************************************************************************
Procedure Main_0(ww,wh)
ValOptions = 0
ValOptions | #PB_Window_SizeGadget : ValOptions | #PB_Window_MinimizeGadget
ValOptions | #PB_Window_MaximizeGadget:ValOptions | #PB_Window_SystemMenu
ValOptions | #PB_Window_ScreenCentered ;:ValOptions | #PB_Window_TitleBar
;
If OpenWindow(#Fenetre_main,0,0,ww,wh,"Lecture de "+TitreFichier$,ValOptions)
; ---------------------- Menu Barre ----------------------------------------------------
If CreateMenu(0,WindowID(#Fenetre_main)) ; Le Menu
MenuTitle("Fichier")
MenuItem(#menu_Ajoute,"Ajoute une Fiche")
MenuItem(#menu_Modifier,"Modifier une Fiche")
MenuItem(#menu_Effacer,"Effacer une Fiche")
MenuItem(#menu_Sauver,"Sauvergarde la liste")
MenuItem(#menu_Quitter,"Quitter")
MenuTitle("Aides/Infos")
MenuItem(#menu_Infos,"Informations")
EndIf
; ---------------------- Status Barre ----------------------------------------------------
Lgww=ww/3-10
CreateStatusBar(0,WindowID(0))
If CreateStatusBar(0, WindowID(0))
AddStatusBarField(Lgww-20)
AddStatusBarField(Lgww+20)
AddStatusBarField(#PB_Ignore)
; --------------------------------------------
Statu01$="Nombre de Champs : "+Str(Nb_Colonne)+".."
Statu02$="Nombre d'enregistrements : "+Str(ligne)+".."
StatusBarText(0, 0, Statu01$)
StatusBarText(0, 1, Statu02$)
StatusBarText(0, 2, " Affichage Automatique selon fichier lus ! ")
EndIf
;-------------------------- La grille des données ------------------------------------
; PART 1
For j=1 To Nb_Colonne ; Première Ligne et première colonne... ENTETE
Mot$=TableFichier(1,j)
If j=1
Caract=0
Caract | #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes
Caract | #PB_ListView_Clickselect|#PB_ListIcon_FullRowSelect
Caract | #PB_ListIcon_AlwaysShowSelection:Mot$=Right(Mot$,Lg_Table(1)+2)
ListIconGadget(#Liste,10,20,ww-10,wh-70,Mot$+":",25+Lg_Table(j)*6,Caract)
Else
AddGadgetColumn(#Liste, j ,Mot$+":",20+Lg_Table(j)*4) ;
EndIf
Next j
; * * * * * * * * * * * * * * * * * * * * * AFFICHAGE dans la grille du fichier * * * * * * * * * * * * * * * * * * *
; PART 2
For i=2 To ligne ; Autres Lignes et colonnes DONNEES
Verifie$=""
For j=1 To Nb_Colonne
Verifie$+TableFichier(i,j)+Chr(10)
Next j
; Passage du tableau vers ListeGadget
Verifie$+TableFichier(ligne,Nb_Colonne)
AddGadgetItem ( #Liste ,-1,Verifie$)
Next i
; Préserve pour redimensionnement dans module "ProcedureResize.pbi"
sauve_taille_gadget(#Fenetre_main,100) ;100 c'est le nombre de gadget max, comme dans mes programme l'énumeration
;
EndIf
EndProcedure
;
;{========= Boucle PRINCIPALE ===============================================
; Initialise pour triage...
PureLVSORT_SelectGadgetToSort(#Liste, #True)
If PureLVSORT_SelectGadgetToSort(#Liste, #True) = #PureLVSORT_Ok
For j=1 To Nb_Colonne ; Première ligne et première colonne... ENTETE
;Type=TableType(j) ; Prise du type si necessaire pour définir les différents type de tri pour les colonnes....
NomChamp$=TableFichier(1,j) ; Prise du nom d'entête
If FindString(NomChamp$,"Date",1)<>0 ; C'EST une date... Alors
PureLVSORT_SetColumnType(#Liste, j-1, #PureLVSORT_DateDDMMYYHHMM) ; On fixe un format date pour le trie de cette colonne.
Else ; #PureLVSORT_DateDDMMYYYY
PureLVSORT_SetColumnType(#Liste, j-1, #PureLVSORT_String) ; default, not necessary
EndIf
Next j
EndIf
;=============================================================================
Repeat
Event = WaitWindowEvent()
If EventType() = #PB_EventType_LeftDoubleClick
PureLVSORT_ClearGadget(#Liste)
Else
Select Event
Case #PB_Event_Menu ;
Select EventMenu()
Case #menu_Ajoute ; Procédure nouvelle adresse...
Modification=0 ; Flag pas de Modif.. Mais Nouvelle fiche à créer...
Nouvelle() ; Effectue Saisie des données
Sauver() ; Procédure pour SAUVER après AJOUT
; ------------------------------------------------------------------ Note : Après chaque modification du fichier il est sauvé !!!
Main_0(ww,wh) ; Fenêtre principale
LectureFichier() ; Chargement du fichier
Case #menu_Modifier
Modification=1 ; Flag de Modif.. Mais procédure ID Nouvelle
Nouvelle() ; Effectue Modif..
Modification=0 :Ref=0 ; Remets les Flags à 0
Sauver() ; Procédure pour SAUVER après MODIF
;-------------------------------------------------------------------
Main_0(ww,wh) ; Fenêtre principale
LectureFichier() ; Chargement du fichier
Case #menu_Effacer ; Procédure pour effacer une adresse marquée
;
RemoveGadget() ; Après avoir retiré de la liste les élément
Sauver() ; Marqués on sauve le fichier .... EFFACEMENT
;-------------------------------------------------------------------
Main_0(ww,wh) ; Réaffiche origine..
LectureFichier() ; Chargement du fichier
Case #menu_Sauver
NomFichier$ = InputRequester("Pour changer le nom du fichier !!!! ","Accepter ou changer le nom du fichier :",NomFile$)
NomFile$=NomFichier$
Sauver() ; Procédure pour SAUVER le fichier
LectureFichier() ; Chargement du fichier
Case #menu_Infos ;
Gosub message ; Composition du message
MessageRequester(Info$, Message$,#PB_MessageRequester_Ok)
Case #menu_Quitter ; Procédure pour QUITTER et SAUVER
fermer_window0=1
EndSelect
Case #PB_Event_CloseWindow
fermer_window0=1
Case #PB_Event_SizeWindow ; Redimensionne la fenêtre proportionellement
resize_gadget(0)
EndSelect
EndIf
Until fermer_window0=1
End ;}
;
;---------------------------------------------------------------------------------------------
; Lecture d'un Fichier
;---------------------------------------------------------------------------------------------
Procedure LectureFichier() ; Lecture d'un fichier ".txt" avec délimiteurs connus dans "Marque$"
; ; Et formatage des données des titres + prise de paramêtres
Marque$=Separateur$ ; Séparateur introduit si c'est le cas ....
ligne=0:If Marque$="":Marque$="|":EndIf ; Paramètres utile... avec Marque$="|" par defaut
;
If OpenFile(#file,Rep$+NomFile$)<>0 ; Ouverture du fichier possible ??? +".txt"
OpenFile( #file,Rep$+NomFile$) ; OUI alors on y va +".txt"
; -------------------------------------------------------------------------
While Eof (#file )=0 ; Chargement du fichier complet dans Tableaux.s(MaxL)
; -------------------------------------------------------------------------
Reccord$=ReadString (#file ) ; lecture de l'enregistrement
LgEnregActuel.Q=Len(Reccord$) ; Mesure de l'enrefistrement lu
If LgEnregActuel>LgLgEnregAbsolu ; Est-il plus le plus grand ?
LgLgEnregAbsolu=LgEnregActuel ; Oui on le garde comme tel
EndIf ; ---------------------------------------
ligne+1 ; Nombre d'enregistrement
; ; -------------------------------------
If ligne<2 ;
Nb_Champs = CountString(Reccord$,Marque$) ; Nombre de champs ??
If Right(Reccord$,1)<>Marque$ ; Il y a t'il un CHAMP après le dernier séparateur à la fin.... ???
Nb_Champs=Nb_Champs+1 ; si OUI on ajoute un champs...
EndIf
Nb_Colonne= Nb_Champs ; Copie dans Nb_Colonne
EndIf ;
If ligne>MaxL ; - Le total de ligne dépasse le dimension Maximum
MaxL+1 ; Augmente d'une ligne
ReDim Tableaux.s(MaxL) ; - Alors on augmente le maximum de "MaxL"
ReDim Lg_Table.i(MaxL) ;
EndIf
Tableaux(ligne)=Reccord$ ; - Mémorisons de chaque enregistrement
Wend
; --------------------------------------------------------------------------------------------------------------------------------------------
; Transfert des enregistrements de Tableaux.s(MaxL) dans un tableau deux dimensions TableFichier( i , j )
; --------------------------------------------------------------------------------------------------------------------------------------------
Global Dim TableFichier.s(ligne+2,Nb_Colonne) ; Dimension réelle du fichier... + 2 Ligne pour Ajout SI UTILE ! Cela parce que :
; ; IMPOSSIBLE en PB de Redimensionner Ligne dans TableFichier( Ligne,Nb_Colonne)
Global Dim Lng_Champs(Nb_Colonne) ; ********************************************************************************************
nMax=Len(Str(ligne)) ; nombre de caractère utile pour représentanter le nombre de ligne du fichier...
;
For i=1 To ligne ; De 1 jusqu'au Nombre de ligne
Enreg$=Tableaux(i) ; laissant tel quel
For j = 1 To Nb_Colonne ; Nombre de colonne à charger ( J )
TableFichier(i,j)=StringField(Enreg$, j, Marque$) ; extraction de chaque colonne
If i=1:Lng_Champs(j)=Len(TableFichier(i,j)): EndIf ; Memorise la longueur des titres
;
If i>1 ; SI i > 1 ALORS
LongueurDutitre=Lng_Champs(j) ; Longueur du Titre (entête de colonne)
LgChampActuel=Len(TableFichier(i,j)) ; <<< Longueur actuelle ============ *
If LongueurDutitre>=LgChampActuel ; Longueur du Titre > Celle champs actuel
LgChampActuel=LongueurDutitre ; Oui alors Titre devient plus grande longeur
EndIf
; ; Le champ actuel est-il plus grand que celui enregistré ?
If LgChampActuel>Lg_Table(j) ; Si OUI il devient la plus grande longueur de champs
Lg_Table(j)=LgChampActuel ; En principe on sort avec une table Lg_Table(j) contenant
EndIf ; les plus grande longueur de contenu de chaque colonne
If Lg_Table(j)>LgMax
LgMax=Lg_Table(j) ; et ici avec le plus grand champs
EndIf
; ;
If j=1 And Val(TableFichier(i,1))<>0 ; Si j=1 Alors je cale à droite
TableFichier(i,1)=RSet(Trim(TableFichier(i,1)),Lg_Table(1))
EndIf
EndIf
Next j
; ;
Next i ;
EndIf
EndProcedure
;---------------------------------------------------------------------------------------------
; Efface un enregistrement
;----------------------------------------------------------------------------------------------------------------------
Procedure RemoveGadget() ; **** Effacer les éléments avec Check_Box = ON ****
Protected i.L,total_item.L ; ---------------------------------------------
total_item=CountGadgetItems(#Liste)-1 ; Nombre d'élément dans la liste
For i=total_item To 0 Step -1 ; Recherche l'élément coché..
If GetGadgetItemState(#Liste, i) & #PB_ListIcon_Checked
Ok=1:Ref=i+2 ; Mémorise l'indice (Ref + 2 = 1 pour les titre et 1 pour la première ligne des gadgets)
Break ; Trouvé on sort de boucle....
EndIf
Next i ; ================
; ; Trouvé on Efface ; Debug TableFichier(Ref,1)+" = "+TableFichier(Ref,2)
If Ok=1 ; ================
For k=Ref To ligne-1 ; On Efface l'élément du ListIconGadget
For j=1 To Nb_Colonne
TableFichier(k,j)=TableFichier(k+1,j) ; decallage tableau
Next j
Next k
ligne-1:Ok=0
Else
MessageRequester("Information","La fiche non trouvée et non effacée ? ")
EndIf
EndProcedure
;-----------------------------------------------------------------------------------------------------------------------
; Ajoute / OU / Modifie une fiche ....
;-----------------------------------------------------------------------------------------------------------------------
Procedure Nouvelle() ; *** Ouverture de la Fenêtre d'Ajout ou Modification de donnée ****
HauteurBouton =20 ; LgMax = Longueur du plus grand champs
; ; Container
H_Frame = Nb_Colonne * 30 ; La hauteur = Nombre de colonne * 20 pour le champs + pour entre champs = 30
L_Frame = (100+LgMax)*2 ; Largeur de la fenêtre 2 fois le plus grand champs + les bord (2 fois 50)
;
Largeur_fenetre = L_Frame+20 ; Largeur de la fenêtre
Hauteur_Fenetre= H_Frame+HauteurBouton + 20+30 ; 30= Hauteur Titre
;
Deb_Frame=30
PosYBouton =Hauteur_Fenetre-30 :Xt=25
DebuChamps =55
IndiceString =DebutChamps+Nb_Colonne+1
;
If Modification=1 : ENTETE$="Modification":Else:ENTETE$="Nouvelle entrée":EndIf
;
;--------------------------------------------------------------------------------------------------------------------------------
If OpenWindow(#Fenetre_ajouter,0,0,Largeur_fenetre,Hauteur_Fenetre,ENTETE$,#PB_Window_TitleBar|#PB_Window_ScreenCentered)
; Ici ce sera uniquement pour les champs donc idem mais sans boutons ni bordure...
TextGadget(96,Largeur_fenetre/2-50,10,100,20,Nomfile$)
Frame3DGadget(#cadre_0,10,Deb_Frame,L_Frame ,H_Frame ,"", #PB_Frame3D_Double) ; Largeur_fenetre-20; Hauteur_Fenetre-40
;
PosYDep=35:Milieu=(L_Frame -20)/2 ; Largeur_fenetre
PosY=PosYDep
For i=1 To Nb_Colonne
Titre$=TableFichier(1,i)
TextGadget(DebuChamps+i, 15, PosY, Milieu-15,20,Titre$)
StringGadget(IndiceString+i, Milieu-10, PosY,120+Lg_Table(i),20,"") ; 100+LgMax*2
PosY+30
Next i
If Modification=0
Num$=RSet(Str(Ligne+1),Lg_Table(1))
StringGadget(IndiceString+1, Milieu-10, PosYDep,120+Lg_Table(1),20,Num$) ;
EndIf
; ; Modification demandé pour l'éléments selectionné
If Modification=1 ; Recherche de la fiche selectionné
Nb_item.w=CountGadgetItems(#Liste)-1 ; pour compter l'élément 0
For i=Nb_item.w To 0 Step -1 ; Recherche l'élément coché..
If GetGadgetItemState(#Liste, i) & #PB_ListIcon_Checked
Ok=1:Ref=i+2 ; Mémorise l'indice (Ref + 2 = 1 pour les titre et 1 pour la première ligne des gadgets)
Break ; Trouvé on sort de boucle....
EndIf
Next i
; =========================
; ; Trouvé on affiche ....
If Ok=1 ; ================
PosY=PosYDep
For i=1 To Nb_Colonne
Enreg$=TableFichier(Ref,i) ; Position dans ListGadget (0 pas utilisé ici + 1 pour première ligne des tires...
StringGadget(IndiceString+i, Milieu-10, PosY,120+Lg_Table(i),20,Enreg$)
PosY+30
Next i
Ok=0 ; Modification alors Affichage du contenu....
Else
MessageRequester("Information","Impossible de modifier le fichier!")
EndIf
EndIf
;
;ButtonGadget(#bouton_Precedent,10,10,50,20," <<=")
;ButtonGadget(#bouton_Suivant,Largeur_fenetre-60,10,50,20,"=>> ")
ButtonGadget(#bouton_valide, 20,PosYBouton+5,120,20,"Valider")
ButtonGadget(#bouton_annule,Largeur_fenetre-140,PosYBouton+5,120,20,"Annuler")
EndIf
;---------------------------------------------------------------------------------------
;************* Après la saisie de la nouvelle fiche on ajoute a la liste ***********
;---------------------------------------------------------------------------------------
;
Repeat
Select WaitWindowEvent () ; Traite les boutons....
Case #PB_Event_Gadget
Select EventGadget () ; Selectionne en fonction de ....???
Case #bouton_valide ; VALIDE POUR modif OU ajout
If Modification=1 ; Effectue une MODIFICATION dans la liste en REF
For i=1 To Nb_Colonne ; ------------------------------------------------------------------
TableFichier(Ref,i)=GetGadgetText (i+IndiceString)
Debug TableFichier(Ref,i)
Next i
Modification=0
Else ; OU AJOUTE une NOUVELLE à la LIGNE +1
Ligne+1 ; ------------------------------------------------------------------
For i=1 To Nb_Colonne
TableFichier(Ligne,i)=GetGadgetText (i+IndiceString)
Next i
EndIf
Fermer_window1=1
Case #bouton_annule ; Annule l'entrée
Fermer_window1=1
Case #bouton_Suivant ; Suivant
Ref+1:Modification=1
AfficheModification()
Case #bouton_Precedent ; Précédent
Ref-1:Modification=1
AfficheModification()
EndSelect
EndSelect
Until Fermer_window1=1
CloseWindow ( #Fenetre_ajouter ) ; Fermeture de la fenêtre ajoute...
EndProcedure
Procedure AfficheModification()
EndProcedure
;----------------------------------------------------------------------------------------------------------------------
; Sauve l'état du fichier
;----------------------------------------------------------------------------------------------------------------------
Procedure Sauver()
If CreateFile (#file ,Rep$+NomFile$) ; Recréation du fichier
For i=1 To Ligne
Enreg$="":Ajout$=Separateur$
For j=1 To Nb_Colonne-1
Enreg$+TableFichier(i,j)+Ajout$
Next j
Enreg$+TableFichier(i,j)
WriteStringN(#file,Enreg$)
Next
CloseFile (#file)
Else
MessageRequester("Information","Impossible de créer le fichier!")
EndIf
EndProcedure
;----------------------------------------------------------------------------------------------------------------------
Message0: ;{ Introduction
Text0$="Gestion de fichier format .Txt avec séparateurs"
;
Text$="Ce programme lit les fichiers dont la première ligne est composée des descripteurs de colonnes."
Text$+"Ces descripteurs tout comme les colonnes seront séparés par des marqueurs tel que 'I' ou ';' ou "
Text$+"tout autre caractère ne pouvant être confondu avec un élément des données qu'il doit séparer ! "
Text$+"Il va donc vous être demandé de choisir un fichier et le séparateur qui est utilisé pour séparer les champs."
Text$+Chr(10)+Chr(13)+Chr(13)
Text$+"Ce programme a pour intérêt de travailler sur des fichiers sauvés à partir d'Excel, Access ou tout autre "
Text$+"programme capable d'exporter ses fichiers sous format '.txt' ou assimilé et d'y inclure des séparateurs"
Return ;}
;----------------------------------------------------------------------------------------------------------------------
message: ;{ d'aides
Info$="Aides et Informations"
Message$=" 1- Si vous voulez avoir accès à une fiche pour Modifier"+Cr$
Message$+" ou Supprimer il suffit de cocher la fiche concernée"+Cr$
Message$+" 2- Pour ordonner (trier) le fichier selon l'ordre croissant"+Cr$
Message$+" ou décroisssant Clicker sur l'entête"+Cr$
Message$+" 3- Faire votre choix selon les options du MENU"+Cr$
Message$+" ======================================="+Cr$
Message$+" Les séparateurs peuvent-être des ',' ou ';' ou tout autre "+Cr$
Message$+" caractère n'étant pas inclus dans les données du fichier"+Cr$
Message$+" En espérant avoir été assez clair..."+Cr$
Message$+" "+Cr$
Message$+" Merci"+Cr$
Return ;}
; ***************************************************************************************************************************
; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 412
; FirstLine = 95
; Folding = Agw
; HideErrorLog
; CurrentDirectory = C:\0 0 PureBasic30\PureBasic\
; CompileSourceDirectory
Voilà, voilà... Pour moi, il est fonctionnel, largement améliorable, c'est à vous !