Affichage d'après un fichier

Signaler
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006
-
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
-
bjr,
j'ai un fichier repertoire qui contient nom,prénom....
en cliquant sur le bouton afficher,toutes lé données s'affichent dans un listbox.
mais je n'arrive pas a faire que,sur le listboxClick, les données se réaffichent dans la zone de saisie.
comment faire?

34 réponses

Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut,

si ta zone de saisie est un Tedit

on affiche dans edit1.text le string contenu dans l'item pointé par itemindex:

Edit1.text:=listbox1.items[listbox1.itemIndex];

@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

je fait quelque chose dans ce style ,mais voici un morceau de ma procédure :

a:=0;
while a<filesize(fbiblio) do
begin
seek(fbiblio,a);
read(fbiblio,xbiblio);
a:=a+1,
zs_num.text:=xbiblio.code;
zs_titre.text:=xbiblio.titre;
zs_nom.text:=xbiblio.nom;
zs_prenom.text:=xbiblio.prenom;
zs_date_sortie:=strtodate(xbiblio.date_sortie);
if xbiblio.rendu='non rendu' then
zs_retour.checked:=false
else
zs_retour.checked:=true;
end;

Lorsque je clic sur un des item de la listbox, je voudrai que les info du fichier se mettent dans les zones de saisie Tedit, or dans ce que tu me dit,comment afficher toutes les infos dans sa propre zone de saisie? et est ce que ma procédure est correcte?
merci
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
je ne comprends pas .

Que contient ta listbox? Parce que dans le code que tu donnes je ne la trouve pas

tu charges un fichier mais à chaque lecture tu surcharge tes Tedit mais tu ne conserves pas les enregistrements.

petit détails tu peux remplacer:

while a<filesize(fbiblio) do

par

while not EOF(fbiblio) do

ceci t'évites de gérer un pointeur.

@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

peut importe ce que contient la listbox puisque seul l'index est important, mais dans la listbox,j'affiche toutes les info du fichier, est dans les zones tedit, je voudrais que ce mettent les informations du tampon de l'index, de l'item séléctionné, mais au mieu,je peux afficher le dernier enregistrement meme si ce n'est pas celui séléctionné.

pour la listbox, dans la procédure afficher:
while not eof(fbiblio) do
begin
seek(fbiblio)
read(fbiblio,xbiblio)
listbox.Items.add(xbiblio.code+''+xbiblio.titre......
end
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

de plus, pour ne not EoF, je suis de toutes facons obligé de gardé a:integer car seek(fbiblio,a), je doit le gardé pour me positionner sur le pointeur
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
si tu mets toute tes infos dans la listbox alors elle est le miroir de
ton fichier, tu peux donc utiliser l'itemindex de la listbox comme
pointeur sur le fichier

plusieurs solutions:

1) utiliser directement l'itemindex dans le seek et charger tes edit

seek(fbiblio,listbox1.itemIndex);

read(fbiblio,xbiblio);
zs_num.text:=xbiblio.code;
zs_titre.text:=xbiblio.titre;
zs_nom.text:=xbiblio.nom;
zs_prenom.text:=xbiblio.prenom;
zs_date_sortie:=strtodate(xbiblio.date_sortie);
if xbiblio.rendu='non rendu' then
zs_retour.checked:=false
else
zs_retour.checked:=true;
end;

ceci t'oblige à accéder au HD à chaque fois

autre solution lors du chargement tu crées une Tlist et tu y range tes enregistrements:

type

PMyList = ^xbiblio;

xbiblio = record

la tu mets la description

end;



var



MyList: TList;

ARecord: PMyList;

B: Byte;

Y: Word;

begin

MyList := TList.Create;

try

while not EOF(fbiblio) do

begin

New(ARecord);

MyList.Add(ARecord); {Ajoute l'enregistrement la liste}

New(ARecord);

read(fbiblio,ARecord^)

listbox.Items.add(Arecord^.code+''+Arecord^.titre......

end;

comme les listes ont les même items il suffit de faire Mylist.itemindex:=listbox.itemindex;

tu extrais les éléments en faisant

zs_num.text:=Arecord^.code ......

@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

Voici donc ma procédure actuelle aprés les modif:
Procédure tfrm_principal.listboxclick(sender:tobject);
begin
be_modifier.visible:=true;
while not eof(fbiblio) do
seek(fbiblio,listbox.itemindex);
read(fbiblio,xbiblio);
zs_'blabla':=xbiblio.'blabla';.....
end;
end;

la logique et le coté algo me paraissent corrects, et pourtant ,les zones tedit ne prennent tjs pas le xbiblio.'blabla'. je ne pense pas me tromper en disant que tout me parait correct? pourquoi n'y atil pas d'affichage? il manque peut etre un if..then..else apré le read? je ne sais pas...
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
il manque les begin end;

while not eof(fbiblio) do

begin
seek(fbiblio,listbox.itemindex);
read(fbiblio,xbiblio);
zs_'blabla':=xbiblio.'blabla';.....

end;
sinon seul le seek() est execute



@+

jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
en plus pour lire un enregistrement il ne faut pas faire while not
EOF.. qui oblige le programme à lire le fichier jusqu'à la fin

il faut juste converser

seek(fbiblio,listbox.itemindex);
read(fbiblio,xbiblio);
zs_'blabla':=xbiblio.'blabla';.....

explications

le seek positionne le fichier sur l'enregistrement à lire et read le lit.



@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

pour le begin,javais juste oublié de l'écrir sur le forum,il est dans mon programme.
et en supprimant le while, ce que je voulais que fasse la procédure est fait, c'est parfait,je te remerci.
maintenant,j'ai un autre probleme, j'avais posé la question sur le forum,mais je n'ai pas eu de réponse,peut etre peux tu m'aider:
voila,donc comme tu le sais mtnt,j'ai un fichier fbiblio de type biblio, j'ai plusieus boutons Ajouter, Afficher, modifier...
sur le click de ajouter, l'ajout se fait correctement, mais j'aimerais que l'ajout, ou l'affichage, se fasse trié par odre alphabétique sur le titre: voici ma structure:
biblio:record
code:string[];
titre:string[];
nom:string[]....
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
le probleme c'est que ton fichier est séquenciel il faudra donc
que tu ajoutes un index (N° d'enregistrement ) à ton record qui gardera
sa position dans le fichier

ensuite tu mets le titre en premier dans l'item de la listbox et tu
mets la propriété "sorted" de la listbox à true elle triera
automatiquement par ordre alphabétique

pour afficher un élément tu récupères l'index pour recharger l'enregistrement.

@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

en fait, j'ai essayé , en changeant la position du titre dans l'affichagedu list box, et en mettant sorted a true, et le tri est bon, j'espere que cela ne génere pas de bug due au fichie seq, mais en tout cas,je te remerci,je pense qe pour ce matin,j'ai de quoi fignolé tout ca!
merci
@++
guigui265
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
le probleme c'est que tu n'as plus directement la relation itemindex et seek;

une autre solution pour l'affichage dans les Tedit est d'extraire les
données de l'item de la listbox (en utilisant des séparateurs et la
fonction Pos());

@+

jlen
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

enfin,il y a juste un probleme, c'est que lorsque l'on affiche trié, sur le clic d'un item, les zones de text qui s'affichent ne sont plus celle voulues puisque l'on tri sur le nom,pas sur le numéro!!
c'était prévisible...
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
c'est ce que je te disais dans le post prédédent

@+

jlen
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,
pour résoudre ton problème d'index essaye ceci :

procedure TForm1.Button4Click(Sender: TObject);
Function AddObject(s: String):TObject;
Begin
Result := TObject(LongInt(s));
End ;
begin
ListBox1.Items.AddObject('TestItem', AddObject('Position 2')); // pour enregistrer la position directement dans l'item mais il reste invisible à l'utilisateur
end;



procedure TForm1.ListBox1Click(Sender: TObject);
Const Txt = '%s %s';
begin // et pour récupérer la position
ShowMessage(Format(Txt, [ListBox1.items[ListBox1.itemindex], String(ListBox1.items.objects[ListBox1.itemindex])]));
end;

@+
Cirec
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

je ne comprend pas du tout comment ce servir de cela, et a quoi correspond le bouton4
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Bon,
le bouton 4 il est juste là pour tester il me sert à ajouter un Item dans la listBox


au lieu de faire LisBox1.Items.add(Arecord.......
tu fait
procedure TForm1.Button4Click(Sender: TObject); // le nom de la procedure n'est pas important
Function AddObject(s: String):TObject; // AddObject est une sous procédure qui te permet d'ajouter une information supplémentaire à l'Item
Begin
Result := TObject(LongInt(s));
End ;
begin
ListBox1.Items.AddObject('TestItem ', AddObject('Position 2')); // et ici c'est la combinaison des deux
end;

TestItem étant le nom que tu désires voir affiché dans la ListBox et à la place de Position 2 tu mets la position exacte dans le fichier biblio cette fameuse position qui ne correspondais plus après un trie là elle sera toujours correcte

procedure TForm1.ListBox1Click(Sender: TObject); // et celle ci te permet de récuperer les informations à chaque clique sur un Item
Const Txt = '%s %s';
begin // et pour récupérer la position
ShowMessage(Format(Txt, [ListBox1.items[ListBox1.itemindex], String(ListBox1.items.objects[ListBox1.itemindex])]));
end;

en Bleu ça te donne le nom de l'Item
et en rouge pour récuperer les informations supplémentaires

@+
Cirec
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
bien cirec la solution un objet contenant l'index a chaque item mais je
pense que tu devrais donner un peu plus d'explications à guigui265 sur
la finalité.

-->guigui265 le bouton et le showmessage ne sont là que pour le test.



@+

jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
-->cirec tu as répondu aavant que j'ai eu le temps de poster.

une remarque toutefois dans le cas d'une liste triée donnée par l'aide DELPHI :

Remarque : Dans le cas
d'une liste triée, AddObject déclenche une exception EListError si la
chaîne S existe déjà dans la liste alors que Duplicates a la valeur
dupError. Si Duplicates a la valeur dupIgnore, une tentative d'ajout
d'une chaîne dupliquée provoque le renvoi par la méthode AddObject de
l'indice de l'entrée existante.

il faudra donc gérer ce genre d'erreur



@+

jlen