Demande d'éclaircissement

[Résolu]
Signaler
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
Bonjour à tous,

Je turbine dans tous les sens, mais je n'y vois plus clair. Merci pour ceux qui voient! Mon pb est le suivant:
1. J'ai besoin de faire une gestion de fichier dont les paramètres (Type des champs :string, integer, real, datetime...) sont définis par l'utilisateur.
    Cette partie fonctionne. J'ai créé un fichier de structure des champs.
2. Je créé ensuite les divers composants de manière dynamique et gère la saisie. ça fonctionne aussi.
3. Je suis bloqué lorsque je veux enregister les données car je n'arrive pas à déclarer le type de fichier à déclarer.
    Je déclare un Fichier du Type F : File of TFiche;
    mais
    - Type TFiche = array[0..NChamp] of Variant; n'est pas accepté et le message est : demande une finalisation non autorisé dans type Fichier
    - J'ai essayé également avec Type TFiche = array of TVarRec de l'unité System, mais le prob est le même. cela vien du fait que Fichier ne semble pas accepter les types Variants.
4. Question : Quel type de Fichier dois-je utiliser? les Stream ? File of Byte?
Bien à vous!
Jean_Jean

21 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut Jean_Jean,

Moi, j'utiliserais des routines de mise en flux de composants.

Renseigne-toi sur WriteComponentResFile et ReadComponentResFile.

Des tutos
ici
et

.
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut Jean_Jean,

"Type des champs :string, integer, real, datetime..."
"50 à 60 champs par fiche, quelques centaines de fiches..."

Pourquoi ne pas utiliser des Structures que tu peux manipuler dans un array et enregistrer et lire depuis un fichier ?
Attention seulementde définir la longueur des chaînes (string[50] par exemple) si tu
veux les stocke dans un fichier.

type
  TFiche = record
    Chaine: string[50];  // longueur = 50
    Entier: Integer;
    Reel: Extended;
    DateTime: TDateTime;
  end;

var
  TableauDeFiches: array[0..500] of TFiche;
  // ou tableau dynamique, à toi de voir...
  FichierDeFiches: File of TFiche;

Tout à fait d'accord avec Caribensila, les Variants sont à éviter.

Bonne prog'

"Je ferai remarquer au trolleur professionnel que le Kinder Suicide ne constipe pas!"
ah ouais... les effets du beurre de cacao je suppose...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Hmmm...

Et, en plus, tu crées des composants de manière dynamique qu'il te faut aussi sauvegarder, je suppose.
Je crois qu'un fichier binaire s'impose...
Tu pourras ainsi le faire sur mesure.

Ouais, Francky est tout petit, petit, petit, il paraît... 
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Ah, aussi...

« cela vient du fait que Fichier ne semble pas accepter les types Variants.»

Evite les variants qui provoquent souvent des erreurs d'exécution non détectées à la compilation!

Utilise plutôt la redéfinition des procédures et des fonctions avec 'overload'.
C'est plus propre, je trouve.

@+
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Merci Caribensila,


Tes propositions sont intéressantes, j'étudie et vous dis ce que ça donne.

Jean_Jean
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Ah!


Encore un conseil, Jean_Jean...


Si tu ne veux pas perdre de temps avec les repas pour programmer un max, fais comme moi:


-Tu prends un Kinder Surprise

-Tu l'ouvres en deux (tu donnes la saloperie qu'on trouve à l'intérieur au petit d'un voisin chiant)

-Tu remplis une moitié avec du Nutella, l'autre avec du beurre de cacao

-Et tu gobes le tout


Et hop! T'as bouffé en 5 sec !

(ça s'appelle un Kinder Suicide)  
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
 Merci cari pour tes conseils. Cela m'arrive d'oublier de bouffer, mais j'aime bien faire un break.
Chacun a sa recette! ça m'arrive de programmer la nuit quand je n'ai pas de femme dans mon lit bien sûr, sinon, c'est un motif de divorce. C'est même d'après les statistiques, l'objet n°1 de divorce : l'ordinateur.
 Le souci de bien programmer, c'est de programmer. Et actuellement je le fais entre deux dossiers d'entreprise afin de me reposer les neurones, c'est pas vraiment une bonne idée, mais c'est une passion!

Bon, ton code répond bien à un plus dans mon problème, mais ne répond pas à ma question.
Le code auquel tu te réfères est parfait pour garder en mémoire une présentation (préférences) des composants. En l'occurence, j'ai une zone de saisie TEdit.
Mais mon souci est ailleurs, ce sont les données saisies dans les TEdit que je veux sauvegarder. Au maximum, j'aurais 50 à 60 champs à sauvegarder.
Et quelques centaines de fiches de données.
Le Type record est incompatible semble t-il avec un tableau de variants. Pourtant, ce sont bien des variants que je dois utiliser. si ça n'est qu'à la compilation, ça n'est pas un problème.
Bien à toi.

Jean_Jean
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
ah oui, excuse moi, je n'ai pas étudié la directive 'overload' pour solutionner. Je ne vois pas à priori.




Jean_Jean

"ça m'arrive de programmer la nuit quand je n'ai pas de femme dans mon
lit bien sûr, sinon, c'est un motif de divorce. "  : j'imagine bien le tableau Jean_Jean entrain de faire joue joue avec son portable au lit pendant que Madame tricotte .

Et moi qui pensait qu'il y avait que Cari qui se trimballait avec son PC un peu partout .

Pour la directive il y a aussi celle préférée de Cari : WaterClosed . Mais là aussi on se rend  parfois compte des trucs, après constipation .
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Je ferai remarquer au trolleur professionnel que le Kinder Suicide ne constipe pas!
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
(je me relis, oups ! quel maladroit !)
Et salut à tous, mais je m'adresse en particulier à Jean_Jean...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
«50 à 60 champs par fiche, quelques centaines de fiches...»
J'avais pas vu (du Nutella sur mon écran). 

Effectivement, ma méthode donnerait un fichier un peu lourdingue.
La solution de Japee est bien préférable, si les ShortStrings (255 caractères maxi) ne constituent pas une limitation rédhibitoire.



«ah ouais... les effets du beurre de cacao je suppose...»
C'est ça! La glycérine, ça marche bien aussi, mais c'est moins bon.
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Merci à vous deux. Je ne suis pas sûr d'être sur la bonne piste encore, mais ça va viendre!
Bon OK, si j'élimine les variants, cela m'oblige à créer un record Figé disons de 50 champs maximum. Le problème, c'est que je limite les possibilités de choix de l'utilisateur. il y a en a un qui voudra en exagérant 40 champs d'integer et 10 champs de strings et l'autre 40 champs de strings et 10 champs d'integer. See You ? Comment je gère? It's impossible sans variant. Je m'explique:
Je pars de l'idée de Japee. Je créé un record général de tableaux de type :
type
  TFiche = record
    LesChaines : array[0..50] of string[50];
    LesEntier  : array[0..50] of integer;
    LesReel    : array[0..50] of Extended;
    DateTime   : array[0..50] of TDateTime;
    ...
  end;

var
  FichierDeFiches: File of TFiche;

Piste 1. Le problème que je voulais éviter, même si la taille du fichier final n'est pas critique dans ce cas, c'est d'enregistrer des fiches avec 40 zones vides de strings sur les 50 ou de valeurs flotantes dans le cas où l'utilisateur n'a besoin que de 10 champs de données, soit sur l'ensemble des types de l'exemple, 190 zones qui ne servent à rien et qui vont prendre de la place en mémoire lors de l'enregistrement. Ou alors, les fichiers qui ne sont pas de type texte ne réserve de la place que pour les données existantes. Est-ce que je dis une connerie?

Piste 2. Je n'enregiste que les champs décidés par l'utilisateur. Mais le problème reste la déclaration du fichier. c'est là que les variants ou tableaux ouverts me paraissaient utiles. Toujours ma question : dois-je déclarer comme fichier pour optimiser? Je ne vais quand même pas enregistrer un fichier par type de champ.
Est-ce qu'une déclaration générale est faisable?
var
  FichierDeFiches: File; (ça doit être du Binaire)
   ou
  FichierDeFiches: File of byte;

Il doit y avoir une solution adaptée;

Jean_Jean
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Ah pendant que je tricottai mes fichiers, je n'avais pas vu Francky!

Jean_Jean
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Il a réponse à tout ce Caribensila!
Heureusement que ses codes sont gratos.
Merci en tout cas pour toutes tes idées.
j'va les tricoter un peu!
Jean_Jean
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Bein, s'ils étaient payants, je ne mettrais pas du Nuttela mais du foie gras avec le beurre de cacao...
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

comme je comprend le problème, tu ne peux pas utiliser le type fichier ( File of TType) avec un type de taille variable.
Logique, si tu pense que le "but" de ce type de fichier est de permettre un acces indexé.

Pour ton problème:

Si j'étais toi, je serrais partie sur un fichier XML avec un noeud par valeur. (attribut : name(user defined), type(int id), value (string auto convertie par la la lib xml))
Les avantage du xml sont multiple: pas de limit de taille de champs (ou disont très grande), portable, pas de problème d'accent, extensible, structure flexible et extensible/modifiable facilement. Note aussi que seul les élément nécessaire sont sauvgarder.

il te faut juste une poignée de méthode pour "convertire" les données en/depuis un noeud et pour faire les parcours. rien de sorcier. (demande moi si t'as des blem avec cette part, j'ai quelles lib d'exemple. j'ai fait pas mal de sauvegarde en xml dans mes prog.)

Note que les donnée dans le xml sont traitée d'une manière similaire au variant (ie: en string), mais avec bcp moins de problème.

bon code,

Loda

PS:
"Ou alors, les fichiers qui ne sont pas de type texte ne réserve de la place que pour les données existantes. Est-ce que je dis une connerie?" oui ;o) la lib ne fait pas la différence entre les "donnée" et les "zéros". elle enregistre tout ce que tu lui demande d'enregistrer.

ps2: si la taille sur disque est un problem: les xml se zip très bien :)

<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Merci Loda pour ta suggestion!
Je pense que ça serait pas mal que j'étudie ce fameux Xml d'autant que j'ai l'intention de me programmer un site internet.
Mais au fait avec D7 verso perso, j'ai les unités qu'il faut pour utiliser le Xml?
Bon en attentant de tricoter Xml, je tricote TfileStream pour combiner les idées de Japee et Caribesnsila. ça semble fonctionner bien que ça soit lourd du fait que les paramètres à passer dans la méthode WriteBuffer(Champ,SizeOf(Champ)) diffèrent selon le type.
Bien à vous
Jean_Jean
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
re,

si tu te met a l'xml, envoie moi un mp. je te filerais quelques trucs/lib.

sinon,
"les paramètres à passer dans la méthode WriteBuffer(Champ,SizeOf(Champ)) diffèrent selon le type"

il vas te faloir ajouter un "header" (de taille fix) avec un typeID. Ce typeID te permet de connaitre la taille du type que tu doit lire. pour les string, prevoit une taille fix (burk) ou un extra header qui indique la longeur.

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.

 Jean jean utilise le code a Cari sinon il va se vexer .. faut faire gaffe avec ce mec là, il a pas fait
partis d'un groupe de punk pour rien: The Kinders Suicidal Tendences (Ze me demande si j'ai pas une photo qui traine quelque part ).  Des vrais barbares ces types, ils massacraient des kinders surprises sur scène, se lancait du Chili en pleines poires.  Enfin un truc de malade. A ce qu'il parait il y a vait un message subliminal contre Tatcher dans leur chanson
"the kinder bursts when you run over
"  (peut etre une légende) .