Fichier accès direct avec un format propriétaire

md21 Messages postés 32 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 1 septembre 2015 - 25 mai 2011 à 14:10
md21 Messages postés 32 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 1 septembre 2015 - 8 juin 2011 à 09:56
Bonjour,

depuis de nombreuses années, j'utilise des fichiers à accès direct avec des formats propriétaires que je défini moi même. La démarche est la suivante :

je défini la structure puis les variables associées (les champs déclarés dans la structure le sont à titre d'exemple, on peut bien sûr faire ce que l'on veut)

Type FichierAccesDirect = Record
ID: Cardinal;
Champ1: String[10];
Champ2: integer;
Champ3: Boolean;
Champ4: array[0..2] of Byte;
end;
Type FichierAD = File of FichierAccesDirect;

var
MainFiche: TMainFiche;
FADEnreg: FichierAccesDirect;
FAD: FichierAD;

Ensuite pour écrire dans le fichier, j'utilise une structure du type :

AssignFile(FAD,'Fichier.dat'); (l'extension peut être différente bien sûr)
Reset(FAD); (ou ReWrite selon le cas)
Seek(FAD,indice de l'enregistrement à définir);
FADEnreg.ID := I + 1;
FADEnreg.Champ1 := 'Champ1_' + IntToStr(I);
FADEnreg.Champ2 := I;
FADEnreg.Champ3 := true;
FADEnreg.Champ4[0] := 5;
FADEnreg.Champ4[1] := 6;
FADEnreg.Champ4[2] := 7;
Write(FAD,FADEnreg);
CloseFile(FAD);

Et enfin pour lire dans le fichier :

AssignFile(FAD,'Fichier.dat');
Reset(FAD);
Seek(FAD,indice de l'enregistrement à définir);
Read(FAD,FADEnreg);
Identifiant := FADEnreg.ID;
variable1 := FADEnreg.Champ1;
variable2 := FADEnreg.Champ2;
variable3 := FADEnreg.Champ3;
variable4 := FADEnreg.Champ4[0];
variable5 := FADEnreg.Champ5[0];
variable6 := FADEnreg.Champ6[0];
CloseFile(FAD); {fermeture du fichier}

Le tout pouvant se combiner avec des boucles, etc ... (j'ai fait des copier-coller pour montrer le principe que j'utilise, je ne garanti pas qu'il n'y a pas d'erreurs dues aux manips)

Voici maintenant ma question : jusqu'alors la structure des fichiers dont j'avais besoin était figée, donc je la définissais par avance comme dans mon exemple avec l'instruction "type". J'aurais maintenant besoin de pouvoir définir une structure dynamiquement et créer les champs depuis une interface. Est-il possible de générer le bloc "type ...end;" de manière dynamique ? et comment faut'il procéder ?

merci

md21

5 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 mai 2011 à 15:39
Bonjour,

je sens que tu vas glisser tout doucement vers
une gestion de base de données ?

n'est-ce pas ?

cantador
0
tiho31 Messages postés 1 Date d'inscription jeudi 31 juillet 2008 Statut Membre Dernière intervention 2 juin 2011
2 juin 2011 à 15:41
Tu va réinventer la roue !
0
md21 Messages postés 32 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 1 septembre 2015 1
6 juin 2011 à 10:11
Bonjour,

merci de vos réponses, je croyais ne jamais en avoir, merci !! (c'est pour ça que je ne surveillais plus trop).
Je ne souhaite pas basculer vers une base de données car :
- j'ai besoin de vitesse et les moteurs moteurs de bases de données sont généralement bien plus lent que mon système (moi j'ai une réponse quasi immédiate même sur des gros fichiers et sur des requêtes assez lourdes)
- mes codes sont simples, je maitrise bien mieux ce que je fais. Avec un moteur de base de données je contrôle moin ce qui se passe.

Seulement voilà, pour un cas particulier, j'aurais besoin de pouvoir dimensionner dynamiquement le bloc de déclaration de format, et ça je ne sais pas faire mais je reconnais humblement que j'ai beaucoup encore à apprendre. Par ailleurs je n'ai rien trouvé sur les forums. Si vous saver comment faire je suis vraiment intéressé ?


md21
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 juin 2011 à 11:01
Motclé : stream

cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
md21 Messages postés 32 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 1 septembre 2015 1
8 juin 2011 à 09:56
merci

effectivement, stream a l'air très puissant, mais aussi très compliqué ...

En fait, pour être plus précis, j'aurais besoin de passer des tableaux dynamiques de longueurs variables dans mes blocs de déclaration de format. J'ai trouvé ceci dans l'aide de delphi (v6):

"Les types ne peuvent pas être des chaînes longues, des tableaux dynamiques, des types Variant, des interfaces ou des types structurés contenant ces mêmes types.
Par contre, ce peut être des pointeurs sur ces types."

apparemment il y a une solution, le problème c'est que j'ai toujours eu du mal avec les pointeurs, même avec le tuto très bien fait de Bactérius. Mais en m'accrochant un peu je decvrais réussir

md21
0
Rejoignez-nous