cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 2018
-
24 oct. 2007 à 09:56
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 2018
-
25 oct. 2007 à 18:31
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
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 24 oct. 2007 à 16:26
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...
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 24 oct. 2007 à 18:08
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...
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 24 oct. 2007 à 13:25
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.
"ç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 .
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 24 oct. 2007 à 16:55
«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.
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 24 oct. 2007 à 17:28
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;
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 24 oct. 2007 à 18:48
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
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 25 oct. 2007 à 09:20
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.
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 25 oct. 2007 à 10:48
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
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 25 oct. 2007 à 14:40
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) .