menu
  Home  ==>  articles  ==>  colibri_skelettons  ==>  p_select_files   

p_select_files - John COLIBRI.

  • mots clé:utilitaire - selection de fichiers - utilitaires - template - modèle
  • logiciel utilisé: Windows 98, Delphi 5.0
  • matériel utilisé: Pentium 500Mhz, 128 M de mémoire
  • champ d'application: Delphi 1 à 6 sur Windows, Kylix
  • niveau: débutant en Pascal et Delphi
  • plan:


1 - Introduction

Nous avons présenté dans l'articles u_handle_files_in_dirs une procédure permettant de réaliser un traitement sur des fichiers se trouvant dans une arborescence.

La procédure handle_files_in_dirs reçoit comme paramètre le chemin de départ et appelle, pour tous les fichiers dans cette arborescence une procédure de traitement.

Si nous connaissons le répertoire de départ, cette procédure est fort pratique.

Toutefois des utilitaires très généraux (correcteur orthographique, liste de référence de variables, pretty-printers etc.) doivent pouvoir travailler sur n'importe quel répertoire, y compris des répertoires qui seront créés après la compilation de l'utilitaire.

Pour désigner le répertoire de départ, plusieurs solutions s'offrent à nous:

  • taper le répertoire dans un tEdit, ce qui est fastidieux et risqué
  • utiliser un tOpenDialog: ce composant standard est effectivement normalisé, mais son but est de sélectionner à la fois le répertoire et le chemin. La navigation dans l'arborescence est devenue un automatisme pour tout utilisateur Windows, mais ne présente pas l'arborescence en permanence
  • employer un tDirectoryListBox: ce composant nous paraît le plus adapté, et c'est lui que nous retiendrons.
Il arrive aussi que nous ne souhaitions effectuer le traitement que sur certains fichiers d'un répertoire. Pour cela, il est utile d'ajouter un tFileListBox ainsi que son tFilterComboBox, et le Clic sur un fichier permet de lancer le traitement.

Finalement, lors de la mise au point d'utilitaires, il nous arrive d'avoir à utiliser pendant un ou deux jours le même fichier de test, avant de verrouiller le projet.

Par conséquent nous souhaitons:

  • avoir un fichier par défaut, sélectionner par un tButton ayant la propriété Default à True
  • pouvoir naviguer dans une arborescence et afficher les fichiers qui nous intéressente dans une tListBox:
    • la sélection d'un fichier lance le traitement sur ce fichier
    • la sélection d'un tButton "tous" et "tous récursivement" lance le traitement sur tous les fichiers de ce répertoire, récursivement ou non

2 - Utilisation

2.1 - Un exemple simple

A titre d'exemple, nous allons simplement afficher le contenu de fichiers:
  • le fichier par défaut sera u_select_file.pas
  • le répertoire initial sera le répertoire de tous nos programmes
Dans ces conditions:
  • la procédure qui affiche les fichiers est la suivante:

        procedure list_file_call_back(p_levelIntegerp_dirp_file_nameString;
              p_pt_dataPointer);
          var l_lineInteger;
          begin
            with tStringList.Create do
            begin
              LoadFromFile(p_dirp_file_name);

              for l_line:= 0 to Count- 1 do
                display(Strings[l_line]);

              Free;
            end// with tStringList
          end// list_file_call_back

  • la procédure qui appelle le traitement pour le fichier par défaut est:

        procedure TForm1.default_Click(SenderTObject);
          begin
            list_file_call_back(0, k_default_pathk_default_file_nameNil);
          end// default_Click

  • le click dans la tFileListBox correspond au traitement suivant

        procedure TForm1.FileListBox1Click(SenderTObject);
          var l_file_nameString;
          begin
            with FileListBox1 do
              l_file_name:= Items[ItemIndex];

            list_file_call_back(0, DirectoryListBox1.Directory'\'l_file_nameNil);
          end// FileListBox1Click

  • et le traitement récursif de tous les fichiers est provoqué par:

        procedure TForm1.all_recursive_Click(SenderTObject);
          var l_pathl_extensionString;
          begin
            l_path:= DirectoryListBox1.Directory;
            l_extension:= Copy(FilterComboBox1.Mask, 2, 4);
            handle_all_files_recursive(1, l_pathl_extension,
                [e_dir_recursivee_dir_handle_file], list_file_call_backNil);
          end// all_recursive_Click

2.2 - Présentation

La forme a l'aspect suivant:


2.3 - Répertoires

L'unité est prévue pour être placée dans:

C:
  programs
    colibri_skelettons
      colibri_project_skelettons
        p_select_files

Vous pouvez naturellement changer cette organisation par Projet | Options | Directories

2.4 - Directives de compilation

Les directives de compilation sont:
  • R+ (vérification des intervalles)
  • S+ (vérification de la pile)
  • pas d'optimisation

3 - Programmation

Quelques petites remarques:
  • notre sélection utilise handle_all_files_recursive. Pour le détail concernant cette procédure, voyez u_handle_files_in_dirs
  • le traitement de tous les fichiers ayant une certaine extension dans un répertoire pourrait se faire en analysant les fichiers contenus dans tFileListBox. Comme handle_all_files_recursive fait le même traitement, nous avons préféré utiliser cette procédure
  • nous avons choisi de lire l'extension dans la tFilterComboBox. C'est la propriété Mask qui contient le masque sélectionné. Ainsi le masque DOS pour les fichiers .PAS est *.PAS. Nous obtenons .PAS en supprimant le premier caractères. Notons que la version actuelle de handle_all_files_recursive ne reconnaît pas *.*. Comme nos utilitaires ne traitent jamais TOUS les fichiers, nous avons conservé cette version
  • plus ennuyeux: pour que les programmes fonctionnent dans n'importe quel répertoire, nous avons opté depuis quelques semaines pour des répertoires relatifs, alors que depuis plus de 10 ans nous utilisions l'immuable "c:\programs\".
    Et naturellement ce changement a fait surgir quelques bugs:
    • le fichier de log est ouvert et fermé pour chaque ligne écrite. En cas de problème, les tampons mémoire sont censées être purgés.
    • si le répertoire de l'application change entre la création du log et son ouverture pour écriture plus tard, cela provoque des erreurs (le fichier "log\mon_log.txt" est dans un sous répertoire de celui contenant l'EXE, mais plus tard, le répertoire courant ne contiendra pas en général de sous-répertoire "log\'
    • autre problème: l'erreur d'ouverture du log se faisait par les fichiers de base c_basic_file. Lorsque l'ouverture se passe mal, un message est affiché. Et naturellement mis dans le log: c'est bien pour cela qu'il y a un log. Mais le log ne peut être ouvert. Etc.
    Pour éviter ces problèmes de chemin relatif et de récursion dans l'affichage des erreurs, nous avons donc modifié la classe c_log. Cette classe ne fait plus aucun appel désormais à u_c_display. Voyez u_c_log.

4 - Améliorations


5 - Télécharger le source

Vous pouvez télécharger:
  • u_handle_files_in_dirs.zip: l'unité de sélection (2 K)
  • select_files.zip: le projet de test (14 K) qui contient:
    • la forme et l'unité principale
    • toutes les unités qu'elle utilise
    • le projet de démonstration


Comme d'habitude:
  • nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
  • tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
  • plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
    Nom :
    E-mail :
    Commentaires * :
     

  • et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.

6 - L'auteur

John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le conseil (composants, architecture, test) et la formation. Son site contient des articles avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client.
Created: jan-04. Last updated: mar-2020 - 250 articles, 620 .ZIP sources, 3303 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2020
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
    + services_web_
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
    + uml_design_patterns
    + graphique
    + delphi
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
      – p_memo
      – u_c_tlist
      – u_c_tstringlist
      – p_select_files
    + admin
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog