IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PureBasic Discussion :

Lire ou Ecrire un Fichier séquentiel Venant Allant de ou vers !


Sujet :

PureBasic

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 57
    Points
    57
    Par défaut Lire ou Ecrire un Fichier séquentiel Venant Allant de ou vers !
    Salut à tous,

    J'ai remarqué un certain intérêt de passer des données de Excel ou autres vers PB et inversement.
    Soit de programmes qui exportent des données en format "Nomfich.txt"… Et cela depuis très longtemps et ce dans les deux sens en passant par un arrangement du type ci-après !(Et pas seulement pour PB)
    Sujet|Titre|NomFamille|Nom Editeur|AnnéeCopyright (<<< les entêtes)
    Album enfant|Echappée belle, L'|Sauer|Actes Sud Junior|1998
    Album enfant|ABC Dinosaures|Pienkowski|Albin Michel Jeunesse|1994
    Album enfant|Pingu le petit fripon|Von Flüe et Wolf|Artis-Historia|1992
    Album enfant|Pingu le malchanceux|Von Flüe et Wolf|Artis-Historia|1993
    Album enfant|Pingu et ses amis|Von Flüe et Wolf|Artis-Historia|1991
    Album enfant|Pingu et sa famille|Von Flüe et Wolf|Artis-Historia|1991
    Album enfant|Pingu le magicien|Von Flüe et Wolf|Artis-Historia|1994
    Album enfant|Pingu et la rentrée des classes|Von Flüe et Wolf|Artis-Historia|1992
    La première ligne étant utilisé comme libellé de chaque colonne séparée par un séparateur (normal non !)
    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. Avant toute chose je tiens à préciser que je sais qu'il existe avec "COMateplus" des possibilités de passer des données directement vers excel, Word et autres et même d'autres moyens.

    Mais le but de ce code et d'être en PB de base... D'utiliser des tableaux normaux... Et de lire tout fichier organisé comme ci-dessus venant d'exportation Excel, Access et autres et de pouvoir le traiter sous PureBasic.
    D'avoir au final un code fonctionnel avec des fonctions de gestion de fichier, 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é. Voir même de créer un fichier sous cette forme et le gérer sous PB et l'utiliser ailleurs si utile.

    Voilà, c'est tout !

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
     
    ; =============================================================================================
    ;  Lecture de fichier DIVERS  (.TXT)                                  2009-06-26 
    ; 
    ;                                                                             *  GeBonet   * 
    ;********************************************************************************************
    ;  J'utilise une librairies de GNOZAL : 1- PureLVSORT qui permet de trier les colonnes d'un tableau)
    ;                  (Si vous ne l'avez pas il suffit de neutraliser les lignes "
    ;                   concernant : "PureLVSORT..."
    ;                                                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 ..... 
    ;
    ;  Les données étant dans un tableau(Ligne, Colonne) avec la première ligne contenant Les titres des colonnes
    ;     La possibilité est donnée d'en faire ce que l'on veux...
    ;
    ;        1- Possibilité de créer un fichier à accès direct
    ;       2- 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 .... (fenêtre qui se crée seule)
    ;-----------------------------------------------------------------------------------------------------------------------
    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 ;}
    ; ***************************************************************************************************************************
    ;{                Unitées de Mesure Windows  (rappel utile)   
    ;               Offert par je ne sais plus qui... Mais très utile !!!                     
    ;
    ;   1 point = 20 Twips          1 Pixels    = 15 Twips          1 Caractères = 120 Twpis                                                           
    ;   1 mm  = 56,7 Twips       1 Cm        = 567 Twips        1 Pouce         = 1440 Twips                                                     
    ;                                                                                           
    ; ***************************************************************************************************************************
    ;Caracteres.Pouce=1440/120   ; =  12                                                                                                                              
    ;Caracteres.Cm     =  567/120  ; =  4,73                                                                                                                            
    ;                                                  Ou 80 Caractères ==> 9600 Twips...                                                                           
    ;                                                  Ou 480 points...    ==> 9600 Twips...                                                                            
    ;                                                  ---------------------------------------------------                                                                        
    ;                                                   Ou 640 Pixels       ==> 9600 Twips...                                                                            
    ;                                                   Ou 480 Pixels       ==> 7200 Twips...                                                                            
    ;} 
    ; ***************************************************************************************************************************
    ; IDE Options = PureBasic 4.31 (Windows - x86)
    ; *****************************************************
    Voilà, voilà... Pour moi, il est :
    1- D'abord fonctionnel
    2- Mais, largement améliorable sur toutes une série de point
    2.1- Imprimer
    2.2- Aligner et formater avec alignement à droite de nombres avec 2 décimales ???
    2.3 - Imaginez de récupérer un tableau avec 50 colonnes... (Donc au minimum deux colonne aussi en auto création de fenêtre)
    Bref une base de réflexion, c'est à vous !
    N'oubliez pas d'ALLEZ Voir la suite plus bas.
    ..
    GeBonet

  2. #2
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Salut

    J'utilise une librairies de GNOZAL : 1- PureLVSORT qui permet de trier les colonnes d'un tableau)
    (Si vous ne l'avez pas il suffit de neutraliser les lignes "
    Je ne connais pas cette lib, mais tu dis qu'elle permet de trier une colonne d'un tableau , dans ce cas pourquoi ne pas utiliser les fonctions de tri de PureBasic ?

    J'imagine que la lib de Gnozal en fait plus, tu peux m'éclairer ?
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    La Lib de Gnozal fait partie de l'ensemble des Libs qu'il met a disposition tout comme JaPBe et PureFORM... Qui sont des outils que j'ai rencontré dès que j'ai commencé avec PureBasic il y a un peu plus d'un an. JaPBe ma semblé directement plus fonctionnel que l'IDE natif, et ma conduit à regarder aussi les libs qu'il proposait et qui dans l'ensemble m'ont semblé aussi de bons outils (voir son site de téléchargement : http://freenet-homepage.de/gnozal/ ). Les fonctions et possibilités de cette lib sont incluses dans le module qui est téléchargé. Détails quand même elle permet de trier sur toutes les colonnes (click sur l'entête).

    De plus comme en plus Gnozal suit ses "produits" de concert avec les versions de PB, j'ai donc tendance les utiliser aussi. Tout comme les "COMate" de "SRod"...

    Mais d'une certaine manière tu as raison, il vaudrait mieux quand on débute avec PB s'efforcer de rester le plus possible avec les fonctionnalités de PureBasic d'abord et ce jusqu'à une maitrise suffisante AVANT même de s'y coller avec les API's, et les montagnes de librairies de tout horizons...

    Car de fait il existe tellement de librairies que si on voulait les connaitre toutes on ne ferait que de les passer en revue avec leurs exemples sans jamais arriver à coder une seule ligne.

    C'est aussi un peu la raison de ce Code ci dessus...
    Dont l'objet est de livrer un "machin" complet, suffisamment simple et ouvert, voir utile. De montrer aussi l'utilisation des tableaux sans pointeurs, les manipulations de chaines etc... Et l'auto-formatage d'une fenêtre de saisie à partir de données.

    Bref un ensemble qui tourne, et n'est certainement pas parfait, mais peut et engage même à être aménagé pour tester des tas de fonctions diverses avec des bases déjà écrites.

    Voilà, voilà... J'espère avoir répondu à ta question.

    Par la même occasion et pour répondre sur la transformation de chiffre en lettres version "Belge" ou "Suisse"... En version "Française"...

    VOIR le Post concerné j'ai placé une version avec les deux possibilitées : forme Française et une Belgo/Suisse :

  4. #4
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 57
    Points
    57
    Par défaut Une petite dernière version ?
    Bonjour,
    Bon, voilà en principe une dernière version de ce code.
    Qu'est-ce qu'il a en plus ou en moins ? Pour le moins rien...
    Pour le plus : Création de fichier à partir du programme même donc pas de nécessité d'importer !
    Possibilité de fermer e fichier en cours pour recharger un autre (le dernier crée par exemple pour encoder : l
    La dernière, enfin, je crois, trier en ordre ascendant (Click sur la tête de colonne qui de "Tête" devient "<<Tête>>").
    Note : A cette fin j'utilise une procédure de d'insertion dichotomique (très vieille ) de mon cru .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    865
    866
    867
    868
    869
    870
    871
    872
    873
    874
    875
    876
    877
    878
    879
    880
    881
    882
    883
    ; =================================================================
    ;  Lecture de fichier DIVERS  (.TXT)       Vers. 1.5    2009-08-21  *  GeBonet  *                         
    ;                                                                                                                                                                                            J.G.           
    ;  Merci a ceux qui se retrouverais dans des morceaux de code comme le redimmensionnement de fenêtre... 
    ; ==================================================================
    ;  Constantes    *  
    ; -------------------*
    Enumeration  ;{
        #Fenetre_main    =0 
        #Fenetre_ajouter =1
        #Fenetre_Init       =2
        #Fenetre_Champ=3
    EndEnumeration;}
    Enumeration ;{
        #file : #Dfiles : #Liste  : #Saisie
        ;                 
        #NomDuChampsText : #NomDuChampsString
        #NomAchercherText   : #NomAchercherString
     
        #bouton_valide            : #bouton_annule
        #bouton_Suivant         : #bouton_Precedent    : #bouton_OK    
        #cadre_0                     : #Titre
     
    EndEnumeration ;}
    Enumeration ;{
        #menu_Ajoute     :   #menu_Modifier
        #menu_Effacer   :   #menu_Sauver
        #menu_Fermer   :  #menu_Quitter    :
        #menu_Separe   :  #menu_Creation
        #menu_Infos       :   #menu_Cherche
    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, IndiceString
        Global Hauteur_Fenetre, HauteurBouton=20, Milieu, i , J , j
        Global AffRow.i, AffColumn.i,AffColPrecedent.i, LgAffichage.d
        Global OldWindowsWidth,OldWindowsHeigh          
     
        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(MaxL)
        Global Dim Lng_Champs.i(MaxL)
     
        Global Dim PointCree.s(MaxL)
     
        Define.L Event, EventWindow, EventGadget, EventType, EventMenu
    ;}    
    ;*****************************************************************************************************
    ;  Procédures de redimensionnement de la fenêtre  Merci à l'auteur ?
    ; ****************************************************************************************************
    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()
        Declare TrieTable(Ligne, Col_A_Trier)    
        Declare Callback(Window.l, Message.l, wParam.l, lParam.l) 
    ;}
    ;{ ==============     Préhambule       ======================================
        ; API des dimenssion de l'écran ......         
    Start0:    
        ecranx = GetSystemMetrics_(#SM_CXSCREEN) ;  Largeur de l'écran Si on veux partir de dimension relative au dimensions réelles... !!!
        ecrany = GetSystemMetrics_(#SM_CYSCREEN) ;  Hauteur   ""     ""    dans ce cas par appel d'API ! 
        Debug "dimensions ecran": Debug Str(ecranx)+" x "+Str(ecrany)
        ; *********   OU LE PENDANT  ==>  PureBASIC     **********
        ; NbDesktops = ExamineDesktops()  ; Ici nombre de fenetres... 
        ; Largeur = DesktopWidth(k)              ; k=0 puisque 1 écran donc fenêtre 1-1=0
        ; Hauteur = DesktopHeight(k)             :  Debug Str(Largeur)+" x "+Str(Hauteur)
        ; **************** FENTRE de présentation de l'objet du programme  ********************
        ; Ici affectation des dimension de la fenêtre qui sera ouverte initialement 
        ;
        Largeur=600:Hauteur=360: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(#NomDuChampsText,60,10,500,30,Text0$)
            SetGadgetFont(#NomDuChampsText,LoadFont(85, "Arial", 16))
            SetGadgetColor(#NomDuChampsText,#PB_Gadget_FrontColor, $E25048) 
            ;     
            TextGadget(#NomAchercherText,30,40,Largeur-60,Hauteur-60,Text$,#PB_Text_Border)
            SetGadgetColor(#NomAchercherText, #PB_Gadget_BackColor, $7CF7FC)
            SetGadgetFont(#NomAchercherText, LoadFont(97, "Arial", 11, 16))
     
            ButtonGadget(#bouton_annule,30+10, Hauteur-10,60,20, "Arrêter ?" )
            ButtonGadget(#bouton_valide,Largeur-100,Hauteur-10,60,20, "Continuer ?" )
            Repeat
                Select WaitWindowEvent ()                   ;  Traite les boutons....
                     Case #PB_Event_Gadget
                         Select EventGadget ()                   ; Selectionne en fonction de ....???
                            Case #bouton_valide   :OK=2      ; VALIDE         
                            Case #bouton_annule :OK=1      ; Arreter
                        EndSelect
                EndSelect                
            Until OK<>0 
            If OK=1:End:EndIf    
        EndIf
        ; ---------------------< Determine le répertoire de travaille >---------------------------------
        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... 
    	; ----------------------< Selection du fichier >-----------------------------------------------------	
    	NomFile$+"Texte (*.txt)|*.txt*" :Typ$=".txt"          
    	IndexFiltre = 0                                                
    	NomFile$ = GetFilePart(OpenFileRequester("Choisissez le nom de votre fichier *.txt ", "", NomFile$, IndexFiltre))
    	TitreFichier$=Left(NomFile$,FindString(NomFile$,Typ$,1))
        CloseWindow(#Fenetre_Init)
    	If Len(TitreFichier$)=0
    	    a$="Alors, voulez-vous créer un fichier ? "
            Resultat=MessageRequester("Information",a$,#PB_MessageRequester_YesNo) 	    
            If Resultat = 6                       ; le bouton Oui a été choisi (Resultat = 6)
                a$ + " Oui" :ww=570 :wh=335
                Gosub CreeFichier          ; Nouveau fichier ...... 
            EndIf
            End
    	EndIf                                         ; Arrêt par defaut de nom....
        Debug Rep$
        Debug NomFile$
        ; --------------------<  Question relative au séparateur  >----------------------------------- 
         IniX=Orig_X+140:IniY=Orig_Y+110:Ok=0                                          
         If OpenWindow(#Fenetre_Champ,IniX,IniY,320,110,"",#PB_Window_BorderLess); Fenetre d'interrogation multibox ...
            StickyWindow(#Fenetre_Champ, 1) 
            SetWindowColor(#Fenetre_Champ, $0AFAF5) :Np=1                    
            Text1$="Nom Du Fichier : ":Reponse1$=NomFile$
            Text2$="Séparateur  =>  : ":Reponse2$="|"
             Gosub PointFenetre          
             Separateur$=GetGadgetText (#NomAchercherString)
            ;If Len(Separateur$)<>0:a$ = " Vous avez donné comme séparateur > " + Separateur$+" <":EndIf 
             StickyWindow(#Fenetre_Champ, 0) 
             CloseWindow(#Fenetre_Champ)
        EndIf                            
        ;MessageRequester("Information",a$,0)
        If KKKo=1:End:EndIf                                        ; Pas de Séparateur fin de programme ! 
    ;}   
    ;========================================================================
    ;                      ****   Boucle du programme  principal ****
    ;========================================================================
    Start:  ;*************************************************************
                LectureFichier()         ; Chargement du fichier 
                ww=600 :wh=400      ; Dimensions de la fenêtre principale....  POUR utiliser la fenêtre redimensionnable !!!!
                Main_0(ww,wh)  		   ; Fenêtre principale
    ; ==========================================================================
    ;           *************    Procedure d'affichage de fenetre      *************     
    ; *********************************************************************************
    Procedure Main_0(ww,wh)
     
        wwh.d=wh                                            
        If LgAffichage.d>ww                 ; Réévaluation des dimension de la fenêtre en fonction du contenu...
            Proportion.d=LgAffichage.d/ww
            ww=LgAffichage.d : wwh=wh*Proportion:wh=wwh
        EndIf 
        ; 
        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_Fermer,"Fermer le fichier")
                MenuItem(#menu_Quitter,"Quitter")
                MenuTitle("Utilitaires")
                    MenuItem(#menu_Cherche,"Chercher une enregistrement")
                    MenuItem(#menu_Separe,"Modifier le Séparateur")
                    MenuItem(#menu_Creation, "Créer un nouveau Fichier")
                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-1)+".."
                StatusBarText(0, 0, Statu01$)
                StatusBarText(0, 1, Statu02$)
                Aff$="  Affichage Automatique ! "+"X="+Str(WindowWidth(#Fenetre_main))+" Y="+Str(WindowHeight(#Fenetre_main))
                StatusBarText(0, 2, Aff$) 
             EndIf
            ;-------------------------- La grille des données ------------------------------------
            ; PART 1                
            For j=1 To Nb_Colonne                                           ;             Première Ligne et première colonne... ENTETE
                Mot$=TableFichier(0,j)
                If j=1
                    Caract=0
                    Caract | #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes
                    Caract | #PB_ListView_ClickSelect|#PB_ListIcon_FullRowSelect ; ,#PB_ListIcon_FullRowSelect
                    Caract | #PB_ListIcon_AlwaysShowSelection:Mot$=Right(Mot$,Lg_Table(1)+2) ; Ici le +2 => 1 pour la ligne 0 non exploitée et 1 pour la ligne de titre
                    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) ;
                    SetGadgetItemData(#Liste, j, j)
                EndIf
            Next j
            ;  * * * * * * * * * * * * * * * * * * * * * AFFICHAGE dans la grille du fichier * * * * * * * * * * * * * * * * * * *        
            ; PART 2
            For i=1 To ligne-1                                                      ;                   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 de traiment du contenu de la fenêtre======================
    ;   
        Repeat                                                                        
    		Event = WaitWindowEvent()                                  
            SetWindowCallback(@Callback())                       ; Prend les zones clické.... si il y a lieu ?
            If AffRow>0 Or AffColumn>0                                ; Il y a eu un au moins un click actionné 
                ; ---------------------------------------------------------- 
                If AffColumn>0 And AffRow=0                         ; L'entête à été clické pour triage selon colonne de l'entête ! 
                    If AffColumn<>AffColPrecedent                   ; Est-ce bien une colonne différente que la précédente ? 
                        TableFichier(0,AffColumn)=Chr(171)+TableFichier(0,AffColumn)+Chr(187)      ; échange des deux lignes 
                        If Left(TableFichier(0,AffColPrecedent),1)=Chr(171)                                   ;          MARQUE la colonne trié 
                             TableFichier(0,AffColPrecedent)=Mid(TableFichier(0,AffColPrecedent),2)
                             TableFichier(0,AffColPrecedent)=Left(TableFichier(0,AffColPrecedent),Len(TableFichier(0,AffColPrecedent))-1)
                        EndIf                                                               
                        TrieTable(Ligne, AffColumn)                     ; Appel le triage.... 
                        ww=OldWindowsWidth : wh=OldWindowsHeigh      
                        Main_0(ww,wh)                                         ; réaffiche la Fenêtre principale                                                            
                        AffColPrecedent=AffColumn                     ; On retient la dernière colonne de triage
                    EndIf                                                                  
                EndIf                                                                    
                ; ----------------------------------------------------------
                AffRow=0:AffColumn=0                                     ; Remise à zéro des Flag de "Ligne" et "Colonne"
            EndIf                                                  
    		;                                                          
    		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_Cherche  ; Rechercher une fiche précise ...   
    					    ; ************************************************************
                            IniX=ww-100:IniY=wh+60:Ok=0                                          
                            If OpenWindow(#Fenetre_Champ,IniX,IniY,320,110,"",#PB_Window_BorderLess); Fenetre d'interrogation multibox ...
                                SetWindowColor(#Fenetre_Champ, $0AFAF5)    
                                StickyWindow(#Fenetre_Champ, 1) :Reponse1$="":Reponse2$=""
                                Text1$="Nom Du champs":Text2$= "Nom à chercher : "
                                Gosub PointFenetre                   
                                ;                                                  
                                Repeat                                      
                                    Event = WaitWindowEvent()
                                    Select Event                          
                                        Case #PB_Event_Gadget
                                            Select EventGadget()   
                                                Case #bouton_OK        ; VALIDE         
                                                    Champ$=GetGadgetText (#NomDuChampsString): Debug Champ$
                                                    Cherche$=GetGadgetText (#NomAchercherString):Debug Cherche$
                                                    If Len(Champ$)<>0 And Len(Cherche$)<>0
                                                        For i=1 To Nb_Colonne                                   ; Cherche le champs 
                                                            If FindString(TableFichier(0,i),Champ$,1)<>0
                                                                Indice=i                                                        : Debug Str(Indice)
                                                                For j=1 To Ligne                                                                               ; Balaye la colonne de la liste 
                                                                    Debug TableFichier(j,Indice)+" Ligne : "+Str(j)
                                                                    If FindString(TableFichier(j,Indice),Cherche$,1)<>0                    ; Cherche l'objet 
                                                                        SetGadgetItemState(#Liste, j-1, #PB_ListIcon_Checked)        ; Coche la fiche trouvé
                                                                        CloseWindow(#Fenetre_Champ):Fermee=1                           ; Puis Idem Modification ! 
                                                                        Modification=1                 ; Flag de Modif.. Mais procédure ID Nouvelle
                                                                        Nouvelle()                        ; Effectue Modif..
                                                                        Modification=0 :Ref=0     ;  Remets les Flags à 0  
                                                                        j=Ligne                             ; Force l'indice au dernier...                   Fin de boucle
                                                                    EndIf                        
                                                                Next j
                                                                Break 2
                                                            EndIf    
                                                        Next i
                                                    EndIf
                                                    Ok=1
                                            EndSelect
                                    EndSelect
                                Until Event = #PB_Event_CloseWindow Or OK<>0
                                If Fermee=0
                                    StickyWindow(#Fenetre_Champ, 0) 
                                    CloseWindow(#Fenetre_Champ)
                                EndIf   
                            EndIf 
                            ; ***********************************************************
    					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_Fermer
                            Sauver()                       ; Sauvegarde du fichier telquel 
                            CloseWindow(#Fenetre_main)
                            Gosub ResetVar        ;  Réinitialise les variables 
                            Goto Start0                 ;  Recommence au début du programme ..............*** Restart Programme ***
                            ; ************************************************************                               
    					Case #menu_Creation   ; Création d'un FICHIER séquentiel...                          
    					     Gosub CreeFichier:   ; Nouveau fichier ....                        
    					    ; ************************************************************                               
    					Case #menu_Separe  ;   Changer les séparateurs 
    		                Saisie$ = InputRequester("Répondre à la question","Donnez le nouveau séparateur ( | , ou point-virgule, vigule ou autre ) : ",Separateur$)
                            If Saisie$ > ""  And Saisie$<>Separateur$
                                a$ = " Vous avez donné comme séparateur :" + Chr(10)  ; Chr(10) nécessaire seulement
                                a$ + Saisie$                                                                        ; pour faire un saut de ligne
                                Resultat=MessageRequester("Information",a$,#PB_MessageRequester_YesNo) 	    
                                If Resultat = 6                                                                      ; le bouton Oui a été choisi (Resultat = 6)
                                    Separateur$=Saisie$
                                    Sauver()                                                                           ; Procédure pour SAUVER le fichier et ici le nouveau séparateur ! 
                                EndIf	         
                            Else 
                                a$ = " La saisie a été annulée ou il n'y a pas de séparateur "
                                MessageRequester("Information",a$,0) 	                
                            EndIf
    				        ; ***********************************************************
    				    Case #menu_Infos                                                                 ; Aides 
    				        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)             
    				OldWindowsWidth=WindowWidth(#Fenetre_main): OldWindowsHeigh=WindowHeight(#Fenetre_main)                          
                    Aff$="  Affichage Automatique ! "+"X="+Str(OldWindowsWidth)+" Y="+Str(OldWindowsHeigh)
                    StatusBarText(0, 2, Aff$) 
    		EndSelect
     
        Until fermer_window0=1
     
    End;}-
    ;  
    ;---------------------------------------------------------------------------------------------
    ; -            Call Back  Procedure Selection Ligne-Colonne
    ;---------------------------------------------------------------------------------------------
    Procedure Callback(Window.l, Message.l, wParam.l, lParam.l) 
     
        result = #PB_ProcessPureBasicEvents 
        Select Message 
            Case #WM_NOTIFY                     ; Cette évenement a emit une notification de message 
                *pnmh.NMHDR = lParam                             ; lParam est structuré de plusieurs informations
                If *pnmh\hwndFrom = GadgetID(#Liste)      ; Est-ce le bon gadget ?
                    Select *pnmh\code                                  ; selectionne En fonction du code actuel 
                        Case #LVN_COLUMNCLICK               ; l'utlisateur à clicker en tête de colonne 
                            *pnmv.NMLISTVIEW = lParam         ; pointe sur l'autre info de la structure 
                            Column.l = *pnmv\iSubItem              ; La collonne clické est "column" 
                            AffColumn=Column+1                      ; Memorise pour transmettre
                            ;
                        Case #NM_CLICK                                 ; l'utilisateur à clicker dans la ListView et ici il donnera  
                            *lpnmitem.NMITEMACTIVATE = lParam 
                            Row.l = *lpnmitem\iItem                    ; La Ligne 
                            Column.l = *lpnmitem\iSubItem        ; La colonne 
                            AffRow=Row+1: AffColumn=Column+1 
                            ;MessageRequester("Click Liste","Ligne: "+Str(AffRow)+" Colonne: "+Str(AffColumn), 0) 
                            ;
                            ; Il y a aussi comme info disponible 
                            ; #NM_DBLCLK    - Double click 
                            ; #NM_RCLICK     - Bouton droit 
                            ; #NM_RDBLCLK - Double click Droit 
                            ; ils fonctionnent de la même manière que #NM_CLICK 
                            ;
                    EndSelect 
                EndIf 
            EndSelect 
        ProcedureReturn result
     
    EndProcedure 
    ;---------------------------------------------------------------------------------------------
    ;               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)
                ;                                                                                     ET évaluation des paramètres, titres etc.... Pour gestion ultérieur... 
                Reccord$=ReadString (#file )                                    ; lecture de l'enregistrement                  
                ; -----------------------------------------------------------------------
                ; ICI le caractère TAB est systèmatiquement remplacé par le caractère définit  " " ou par defaut "|" 
                String$ = ReplaceString(Reccord$, Chr(9), " ",#PB_String_InPlace,1)
                ; -----------------------------------------------------------------------
                LgEnregActuel.Q=Len(Reccord$)                              ; Mesure de l'enrefistrement lu
                If LgEnregActuel>LgEnregAbsolu                              ; Est-il plus le plus grand  ? 
                    LgEnregAbsolu=LgEnregActuel                              ; Oui on le garde comme tel   
                EndIf                                                                           ; ---------------------------------------------------------------------     
                ligne+1                                                                        ; Nombre d'enregistrement total inclus la ligne d'entête... 
                ;                                                                                   ; --------------------------------------------------------------------- 
                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 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+1)    ; 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 Lg_Table(Nb_Colonne+1)                         ;  ********************************************************************************************  
            nMax=Len(Str(ligne))                                                     ; nombre de caractère utile pour représenter  le nombre de ligne du fichier...
    		;             
            For i=0 To ligne-1                                                                      ; De 0 jusqu'au Nombre de ligne    
    			Enreg$=Tableaux(i+1)	                	         	                        ; 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=0:Lg_Table(j)=Len(TableFichier(i,j)): EndIf                 ; Memorise la longueur des titres pour chaque colonne
                    ;                                                                                             comme base de largeur de colonne....
                    ;                                                               Evaluation de la Table des données 
                    If i>0                                                                                   ; SI i > 0 ALORS il s'agit des données
                        If Lg_Table(j)<Len(TableFichier(i,j))                              ; si la plus grande largeur du champs est plus petite que le champs actuel
                           Lg_Table(j)=Len(TableFichier(i,j))                              ; c'est la largeur du champs actuel qui devient la plus grande largeur
                           LgMax=Lg_Table(j):LgAffichage.d+LgMax                    ;  Totalisation des plus grande largeur de colonne
                        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
       Protected width.l
     
    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   ****
     
        Protected PremierPoint
     
        H_Frame            = Nb_Colonne * 30          ; La hauteur = Nombre de colonne * 20 pour le champs + pour entre champs = 30
        L_Frame            = (100+LgMax)*2.5          ; Largeur de la fenêtre 2 fois le plus grand champs + les bord (2 fois 50)
        Deb_Frame        =30             
        ;
        Largeur_fenetre  = L_Frame+20                ; Largeur de la fenêtre 
        Hauteur_Fenetre= H_Frame+HauteurBouton + 20+30 ; 30= Hauteur Titre
        PosYBouton       =Hauteur_Fenetre-30    
        ;
        DebuChamps     =50
        IndiceString        =DebuChamps+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(#Titre,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 J=1 To Nb_Colonne
                Titre$=TableFichier(0,J)                        
                TextGadget(DebuChamps+J,   15, PosY, Milieu-15,20,Titre$)  
                StringGadget(IndiceString+J, Milieu-10, PosY,120+Lg_Table(0),20,"")   ; 100+LgMax*2
                PosY+30 : If J=1:PremierPoint=IndiceString+J:EndIf ;  Mémorisation du premier champs de saisie
            Next J
            ;
            If Modification=0
                Num$=RSet(Str(ligne+1),Lg_Table(0))
                StringGadget(IndiceString+1, Milieu-10, PosYDep,120+Lg_Table(0),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+1                                ; 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
                    AfficheModification()
                Else
                    MessageRequester("Information","Impossible de modifier le fichier!")
                EndIf                                                           
            EndIf
            ;
            ButtonGadget(#bouton_Precedent,15,5,40,20,"<<")     
            ButtonGadget(#bouton_Suivant,Largeur_fenetre-50,5,40,20,">>")
     
            ButtonGadget(#bouton_valide,   10,PosYBouton+5,100,20,"Valider")     
            ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton+5,100,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=0                        ; 
                                Ref=ligne:ligne+1                  ;  OU AJOUTE une NOUVELLE à la LIGNE +1 
                            EndIf                   
                            For J=1 To Nb_Colonne           ; Récupère les données dans le tableau 
                                TableFichier(Ref,J)=GetGadgetText (J+IndiceString)     
                            Next J       
                            Modification=0
                            Fermer_window1=1 
                            ; -------------------------------------------------------------------  
                        Case #bouton_annule                     ; Annule l'entrée
                            Modification=0
                            Fermer_window1=1
                            ; -------------------------------------------------------------------    
                        Case #bouton_Suivant                   ; Suivant
                            If Ref+1<Ligne
                                PosY=PosYDep : Ok=1:Ref=Ref+1
                                Modification=1 :    AfficheModification()
                            EndIf    
                        Case #bouton_Precedent               ; Précédent
                            If Ref-1>1
                                PosY=PosYDep : Ok=1:Ref=Ref-1             
                                Modification=1 :    AfficheModification()
                            EndIf
                            ;
                    EndSelect
            EndSelect
        Until Fermer_window1=1
        CloseWindow ( #Fenetre_ajouter )                 ; Fermeture de la fenêtre ajoute...
     
    EndProcedure
    ;-----------------------------------------------------------------------------------------------------------------------
    ;                 Affiche sous forme de fiche ... 
    ;-----------------------------------------------------------------------------------------------------------------------
    Procedure AfficheModification()
     
        For J=1 To Nb_Colonne
            Enreg$=TableFichier(Ref,J)              ; Position dans ListGadget (0 pas utilisé ici + 1 pour première ligne des tires...          
            StringGadget(IndiceString+J, Milieu-10, PosY,120+Lg_Table(J),20,Enreg$)
            PosY+30
        Next J
        Ok=0                             ; Modification alors Affichage du contenu....
     
    EndProcedure
    ;----------------------------------------------------------------------------------------------------------------------
    ;                 Sauve l'état du fichier 
    ;----------------------------------------------------------------------------------------------------------------------
    Procedure Sauver()
     
        If CreateFile (#file ,Rep$+NomFile$) ;  Recréation du fichier 
            For i=0 To ligne-1
                Enreg$="":Ajout$=Separateur$
                For J=1 To Nb_Colonne-1
                     If i=0 And Left(TableFichier(0,J),1)=Chr(171)
                        TableFichier(0,J)=Mid(TableFichier(0,J),2)
                        TableFichier(0,J)=Left(TableFichier(0,J),Len(TableFichier(0,J))-1)
                    EndIf
                    Enreg$+TableFichier(i,J)+Ajout$  
                Next j
                Enreg$+TableFichier(i,J) 
                If i=0:ReplaceString(Enreg$,Chr(171),"",1):ReplaceString(Enreg$,Chr(187),"",1):EndIf
                WriteStringN(#file,Enreg$)
           Next
           CloseFile (#file)
        Else
            MessageRequester("Information","Impossible de créer le fichier!")
        EndIf
    EndProcedure
    ; ---------------------------------------------------------------------------------------------------------------------
    ;          Cette procédure de triage peut-être appelée pour insérer des données au fur et
    ;  à mesure qui viendra se placer directement à la place ou elle doit s'inscrire dans la 
    ;  table "TableFichier( Ligne, Colonne)" qui est ALPHANUMERIQUE.    POUR CELA :  
    ;  Il suffit d'ajouter la données à la dernière place (ligne) du tableau avant l'appel de cette 
    ;  procédure en ayant incrémenté le nombre de ligne "Ligne"....  
    ; **************************************************************************************************
    ;  Ligne=Nombre de ligne du tableau et Col_A_Trier=N° de la colonne sur laquelle on trie ! 
    ;
    Procedure TrieTable(Ligne, Col_A_Trier) 
     
        If Ligne-1>0:Ligne-1:Rt=1:EndIf                                                            ; Retire la ligne du titre.... 
       ;-----------------------
        If Ligne+1 >1 
            ;
            N1=Ligne-1                                                                                ; Compare et ordonne les deux derniers
            If TableFichier(Ligne,Col_A_Trier)<TableFichier(N1,Col_A_Trier) 
                For i=1 To Nb_Colonne
                    Swap TableFichier(Ligne,i),TableFichier(N1,i)                  ; échange des deux lignes 
                Next i
            EndIf 
            If  Ligne+1>2                                                                              ; Il n'y a que deux éléments c'est en ordre et on sort
                ;                                                                                                    SINON 
                For j=Ligne-2 To 1 Step -1                                                    ; Balaye à partir du dernier jusqu'au 1er (au lieu de 0 c'est le titre)
                    Mot$=TableFichier(j,Col_A_Trier)                                       ; Mots à comparer .......
                    For L=1 To Nb_Colonne:Tableaux(L)=TableFichier(j,L):Next L ; Mémorise la ligne ou se Trouve A$                        
                    If Mot$>TableFichier(j+1,Col_A_Trier)         
                        INF=j:SUP=Ligne+1
                        ;---------------------------------- Recherche la place de A$ dans le tableau trié 
                        Repeat 
                            k=Int((INF+SUP)/2)
                            If Mot$<TableFichier(k,Col_A_Trier) : SUP=k : Else : INF=k : EndIf   ;    A$<Table(i,k)
                        Until SUP-INF<2
                        ;----------------------------------  Insère A$ ou la ligne à sa place et décale le reste
                        For k=j To INF-1: 
                            For L=1 To Nb_Colonne
                                TableFichier(k,L)=TableFichier(k+1,L)                    ; Echange 
                            Next L
                        Next k 
                        For L=1 To Nb_Colonne:TableFichier(INF,L)=Tableaux(L):Next L 
                    EndIf
                Next j
                ;
            EndIf 
        EndIf
        ;
        If Rt=1:Ligne+1:Rt=0:EndIf
     
    EndProcedure
    ;
    ; =================================================================
    ;  -                                             SOUS ROUTINES !!!                -
    ; =================================================================
    CreeFichier:    ;{ Création de fichier ....
        IniX=ww-100:IniY=wh+60:KOk=0
        If OpenWindow(#Fenetre_Champ,IniX,IniY,330,110,"Création fichier",#PB_Window_BorderLess); Fenetre d'interrogation multibox ...                  						    
            SetWindowColor(#Fenetre_Champ, $0AFAF5) 
            StringGadget(#Saisie,IniX+10,IniY+10,300,20,"")
            StickyWindow(#Fenetre_Champ, 1) 
            Text1$="Nombre de champs":Reponse1$="":Text2$= "Séparateurs : ":Reponse2$="|"
            Gosub PointFenetre
            NombreChamps=Val(GetGadgetText (#NomDuChampsString))
            If NombreChamps>1                                                             ; Il y a bien un certains nombre de champs à gérer  
                ReDim PointCree.s(NombreChamps)                              ; Nombre de champs du fichier a creer
                Separateur$=GetGadgetText (#NomAchercherString)     ; Prise du séparateur 
                PremierLigneLibelle$=""                                                     ; Initialisation de la ligne d'entête du fichier
                ;  
                For i=1 To NombreChamps                                              ; Prise de l'identification des entêtes
                    Text2$="Champs N° "+Str(i)+" : ":Reponse1$=""         ; Ordre   
                    Text1$="Nom du champs "+Str(i)+":  "                          ; Puis le NOM de la colonne
                    Reponse2$="<<"+Str(i)+">>": Gosub PointFenetre
                    PremierLigneLibelle$+GetGadgetText (#NomDuChampsString)+"   "
                    If i<NombreChamps:PremierLigneLibelle$+Separateur$:EndIf
                    StringGadget(#Saisie,IniX+10,IniY+10,300,20,PremierLigneLibelle$)
                    Debug PremierLigneLibelle$                 
                    ;                            
                Next i
                Debug PremierLigneLibelle$                 
                Text1$="=A T T E N T I O N=":Reponse1$="> RIEN ICI <="
                Text2$="Nom du Fichier ==>> : ":Reponse2$="ICI"
                Gosub PointFenetre:Ok=0
                NomFichier$=GetGadgetText (#NomAchercherString)+".txt"
                Debug Rep$+NomFichier$
                ; Création du fichier 
                If Len(NomFichier$)<>0
                    If CreateFile(#file ,Rep$+NomFichier$)       ; Création du fichier NOUVEAU ... 
                        WriteStringN(#file,PremierLigneLibelle$) ;                                                  ...
                        CloseFile (#file)    
                    Else
                        MessageRequester("Information","Impossible de créer le fichier!")
                    EndIf
                EndIf    						                
            EndIf        
        EndIf
        CloseWindow(#Fenetre_Champ)
    Return
    ;}
    ;----------------------------------------------------------------------------------------------------------------------
    PointFenetre: ;{ fenêtre Commune de question  
        ;           
        KOk=0
        ;
        TextGadget(#NomDuChampsText,10,20,150,20,Text1$)            
        SetGadgetFont(#NomDuChampsText,LoadFont(#NomDuChampsText, "Arial", 12))
        SetGadgetColor(#NomDuChampsText,#PB_Gadget_BackColor, $0AFAF5)
        SetGadgetColor(#NomDuChampsText,#PB_Gadget_FrontColor, $E25048)
        StringGadget(#NomDuChampsString,160,20,140,20,Reponse1$)
        ;
        TextGadget(#NomAchercherText,10,50,150,20,Text2$)
        SetGadgetFont(#NomAchercherText, LoadFont(#NomAchercherText, "Arial", 12))
        SetGadgetColor(#NomAchercherText,#PB_Gadget_BackColor, $0AFAF5)
        SetGadgetColor(#NomAchercherText, #PB_Gadget_FrontColor, $E25048)
        StringGadget(#NomAchercherString,160,50,140,20,Reponse2$)
        ;
        ButtonGadget(#bouton_OK,100,80,60,20, "Continuer ?" )
        ;
        Repeat
            Event = WaitWindowEvent()
            Select Event
                Case #PB_Event_Gadget
                    Select EventGadget()
                        Case #bouton_OK       
                            KOk=1
                    EndSelect
            EndSelect
        Until KOk<>0
        ;
    Return ;}
    ;----------------------------------------------------------------------------------------------------------------------
    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 doivent 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$+Cr$+Cr$
            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"
            Text$+Cr$+Cr$
            Text$+"Mais personne ne vous empèche de créer avec un IDE quelconque y compris le bloc notes, deux lignes."+Cr$
            Text$+"L'une avec par exemple : Nom | Prénom | Adresse | Localité | Téléphone | Email ... Etc..."
            Text$+"et l'autre avec les infos correspondante d'un carnet d'adresse séparée de la même manière. Et à partir"
            Text$+" de ça vous avez un système de gestion de fichier tout prêt, et pouvez ajouter, supprimer et modifier ! "
    Return ;}
    ;----------------------------------------------------------------------------------------------------------------------
    message: ;{        Aides / Infos 
        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$+"     (ATTENTION de Valider la modification)"+Cr$
        Message$+"     ======================================="+Cr$
        Message$+" 2- Pour ordonner (trier) le fichier selon l'ordre croissant"+Cr$
        Message$+"     Clicker sur l'entête de colonne "+Cr$
        Message$+"     ======================================="+Cr$
        Message$+" 3- Faire votre choix selon les options du MENU"+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$+" 4- Pour ceux qui voudrait créer un fichier séquentiel avec"+Cr$
        Message$+"     séparateurs le point CREER est disponible dans 'Utilitaires'"+Cr$
        Message$+"     Il suffira de donner les noms des entêtes de champs et les "+Cr$
        Message$+"     inévitables séparateurs...  Après avoir fermé le fichier en"+Cr$
        Message$+"     cours forcément encoder des données :-) ! "+Cr$+Cr$
        Message$+"     OU au moment de l'ouverture du programme ne pas donner"+Cr$
        Message$+"     de nom de fichier, ce qui vous amène à la question si vous "+Cr$
        Message$+"     voulez en créer un... Si oui, idem ci-dessus sauf que l'encodage"+Cr$
        Message$+"     peux alors se faire directement ..."+Cr$
        Message$+"                                     "+Cr$
        Message$+"                                                                                  Merci"+Cr$
    Return ;}
    ;
    ResetVar: ;{
        Modification=0: NonOk=0: MaxL=10:  Ref=0: IndexFiltre=0
        Nbr_Enreg=0 : Nbr_Champs=0: Nb_Colonne=0: ligne=0: PremiereCol=0
        Lng_Enreg=0 : LgMax=0: nMax=0: PosX=0: PosY=0: PosYDep=0: IndiceString=0
        Hauteur_Fenetre=0: HauteurBouton=20: Milieu=0: i=0  : j=0
        AffRow=0: AffColumn=0:AffColPrecedent=0: LgAffichage=0
        OldWindowsWidth=0:OldWindowsHeigh=0          
        Rep$="": NomFile$="": RepData$="": FichierParDefaut.s=""
        Enreg$="": Separateur$="": TitreFichier$=""
    Return: ;}
    ; **********************************************************************************************************************
    Ben voilà, il y a là de quoi partir sur des bases pour explorer PureBasic.
    Cela avec un exemple concret et +/- fini sans entrer dans de trop grande complication et Documenté....

  5. #5
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 57
    Points
    57
    Par défaut Autre séquence de tri !
    Bonjour,

    Dans code précédent a caser a la place de ...

    Si PB possède un système permettant de trier a partir de n'importe quelle colonne partir d'une Structure
    via : "SortStructuredArray(ArrayName(), Mode, OffsetDuChamp, Type [, Debut, Fin])"

    Il n'en est rien en ce qui concerne les tableaux à plusieurs dimensions.... Seul SortArray(Table$(),#mode)
    Cette "routine" pouvant être procédure compense ce manque... A l'aide de ce Seul SortArray(Table$(),#mode)

    Note: La séquence la plus performante reste celle du premier code avec le code de Gnozal...
    Mais il faut télécharger la librairie : Voir http://purebasic.developpez.com/outi...gins#bibgnozal
    A++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ; ===============================================================================
    -----------------------------------------------------------------------------------------------------------------------------------------------
    ;   Triage d'un tableau TableFichier(i,j)  à partir d'une des colonnes... "AffColumn"
    ;     
    ;   ENTREE : TableFichier( i, j )        = Tableau "String" à trier 
    ;                     Ligne et Nb_Colonne= I et J du tableau 
    ;                     AffColumn         = Indice de la colonne devant servir de référence pour le triage
    ; -----------------------------------------------------------------------------------------------------------------------------
    ;   SORTIE  : TableFichier( i, j ) Ordonnée selon la colonne numéro "AffColumn"
    ; -----------------------------------------------------------------------------------------------------------------------------
    Triage: ;{
        ligne=ArraySize(TableFichier(),1)-1         ; Taille réelle des données rangées sans la ligne '0' qui peut contenir les entêtes... 
        Dim Table$(ligne)                                     ; Table qui devra recevoir la colonne à trier 
        Dim Copie_Table.s(ligne,Nb_Colonne)    ; Table pour servir d'attente pendant le tri et pour le transfert...  
        ;
        For i=1 To ligne                                        ; On ajoute à la colonne à trier la position initialie dans la forme avant tri 
            Table$(i)=TableFichier(i,AffColumn)+" /_"+Str(i)  ; <== ICI 
        Next i
        ;
        SortArray(Table$(),#PB_Sort_Ascending)  ; Utilisons la fonction Trie de PB 
        ;
        For k=1 To ligne
            NoEnreg=Val(Mid(Table$(k), FindString(Table$(k)," /_",1) +3))  ; Reprise de la position dans l'autre tableau
            For i=1 To Nb_Colonne                                                               ; Composition de la table intermédiaire complete à trier
                Copie_Table.s(k,i)=TableFichier(NoEnreg,i)                           ; a l'aide de la position mémorisé avant tri plus haut...
            Next  i            
        Next k
        ;
        For k=1 To ligne
            For i=1 To Nb_Colonne
                TableFichier(k,i)=Copie_Table.s(k,i)            ; Recomposition de la table d'origine mais cette fois trié 
            Next  i                                    
            ;Debug Str(k)+" -"+Copie_Table.s(k,1)+" : "+Copie_Table.s(k,3)
        Next k                                                                  ; Le trie est Terminé... 
     
    Return ;}

Discussions similaires

  1. OpenXML en VB6 Lire et Ecrire des fichiers .xlsx
    Par SfJ5Rpw8 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/03/2013, 12h47
  2. lire et ecrire un fichier binaire
    Par Ytech123 dans le forum Débuter
    Réponses: 12
    Dernier message: 06/11/2008, 19h00
  3. Lire et ecrire un fichier excel avec perl
    Par Bengeldim dans le forum Langage
    Réponses: 3
    Dernier message: 22/07/2008, 17h23
  4. Lire et ecrire dans fichier excel en c++
    Par FidoDido® dans le forum C++
    Réponses: 8
    Dernier message: 09/07/2007, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo