u_c_file_of - John COLIBRI. |
- mots clé:utilitaire - gestion de fichier - fiche de taille fixe
- 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
- uses: u_c_basic_file, u_c_display, (u_c_basic_object,
u_c_file_name, u_loaded, u_dir, u_c_log, u_strings,
u_types_constants)
- plan:
1 - Introduction
La classe c_file_of encapsule la gestion des fichiers FILE OF. Elle permet surtout les manipulations globales d'ouvertures, fermeture, changement de nom.
Pour cela, la classe dérive de c_basic_file. Cette classe ne contient pas le RECORD final: seul l'utilisateur sait ce
qu'il placera dans son enregistrement. C'est pourquoi cette classe est essentiellement destinée à être surchargée, comme le montreront les exemples ci dessous. 2 - Utilisation 2.1 Interface
L'interface cd c_file_of est la suivante:
type c_file_of= class(c_basic_file)
public
m_pt_record: Pointer;
m_record_size: Integer;
m_current_position: Integer;
Constructor create_file_of(p_name, p_file_name: String;
p_pt_record: Pointer; p_record_size: Integer); Virtual;
function f_file_size: Integer; Override;
function f_file_position: Integer; Override;
procedure seek_file(p_position: Integer); Override;
function f_seek_end_of_file: Integer; Override;
procedure write_record;
procedure read_record;
function f_display_record: String; Virtual;
function f_list: Boolean;
Destructor Destroy; Override;
end; |
Cette classe descend de c_basic_file qui gère toutes les ouvertures, fermetures, dupplications etc. Pour les attributs: - m_pt_record: un pointeur qui sera initialisé vers le RECORD que la classe
c_file_of écrira ou lira. Le pointeur sera initialisé par le descendant lorsqu'il appellera le constructeur de c_file_of.
- m_record_size: la taille du RECORD du descendant. Initialisé de même par le descendant
- m_current_position: une variable qui sera utilisée au besoin (NON mise à jour automatiquement dans cette version)
Et pour les méthodes:
- create_file_of: appelle le CONSTRUCTOR de c_basic_file, et initialise m_pt_record et m_record_size
- les fonctions suivantes sont les versions dérivées de c_basic_file, mais
adaptées à la gestion par RECORD (et non pas par octet):
- f_file_size: le nombre d'enregistrement
- f_file_position: la position (en RECORD)
- seek_file et f_seek_end_of_file: positionnement
- write_record: écriture de m_pt_record^ (dans le RECORD de la classe descendante)
- read_record: écriture de m_pt_record^;
- f_display_record: affichage standard de mise au point
- function: ouverture, affichage standard, fermeture
- Destroy: libération de la classe (PAS du record utilisateur)
2.2 Exemple d'utilisation simple C'est quasiment toujours une classe dérivée de celle-ci qui est utilisée. En effet, cette classe ne contient pas le RECORD. Voici tout d'abord un exemple de classe dérivée permettant de gérer des
Integer: unit u_c_file_of_integer;
interface uses u_c_file_of;
type t_integer_record= Record
m_integer: Integer;
end;
c_file_of_integer= class(c_file_of)
public
m_integer_record: t_integer_record;
Constructor create_file_of_integer(p_name, p_file_name: String); Virtual;
function f_display_record: String; Override;
end;
implementation
uses SysUtils, Windows, u_c_display;
// -- c_file_of_integer
Constructor c_file_of_integer.create_file_of_integer(p_name, p_file_name: String);
begin
Inherited create_file_of(p_name, p_file_name,
@ m_integer_record, SizeOf(m_integer_record));
end; // create_file_of_integer
function c_file_of_integer.f_display_record: String;
begin
with m_integer_record do
Result:= IntToStr(m_integer);
end; // f_display_record
begin // u_c_file_of_integer end. // |
Notez que: - l'unité définit le type de RECORD t_integer_record
- la classe c_integer_file:
- descend bien de c_file_of
- contient un attribut pour le champ, m_integer_record
- n'a que deux méthodes:
- le CONSTRUCTOR, dont le code appelle le CONSTRUCTOR de c_file_of
en lui fournissant l'address du champ m_integer_record et sa taille
- la procédure d'affichage qui dépend du contenu du RECORD
2.3 Utilisation générale
Le plus simple est de partir de u_c_integer_file, et de changer "integer" par le nom correspondant à votre application. 2.4 - Répertoires et Directives de Compilation L'unité est prévue pour être placée dans: C:
programs colibri_helpers classes Vous pouvez naturellement changer cette organisation par Projet | Options | Directories
Les directives de compilation sont: - R+ (vérification des intervalles)
- S+ (vérification de la pile)
- pas d'optimisation
3 - Programmation
Rien de particulier. La classe s'appuie essentiellement sur la classe u_c_basic_file. 4 - Améliorations Cette classe est surtout utilisée:
- car elle bénéficie des traitements de test d'existence, changement de nom etc présents dans c_basic_file
- elle est le point de départ pour l'encapsulation d'organisations de fichier
plus complexes (voir c_string_file: l'exemple d'encapsulation d'un fichier de taille variable).
5 - Télécharger le source
Vous pouvez télécharger: - u_c_file_of.zip: l'unité de gestion de fiches de taille fixe (1 K)
- test_u_c_file_of.zip le projet de test (18 K) qui contient:
- l'unité
- toutes les unités qu'elle utilise
- le projet de démonstration
Avec les mentions d'usage: - j'apprécie tous les commentaires, remarques ou critiques
- signalez-moi les bugs que vous trouverez.
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. |