cs_philpas
Messages postés77Date d'inscriptionlundi 17 octobre 2005StatutMembreDernière intervention 4 septembre 2008
-
8 févr. 2006 à 16:19
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 2014
-
9 févr. 2006 à 16:27
bonjour,
j'ai un memo (Memo2_Reception) qui recoit des données d'un port série. Pour visualiser la réception j'utilise la fonction Memo2_Reception.Lines.Add(ligne reçu) les lignes défilent les unes derrière les autres. Seulement il faut que j'enlève les LF et CR de la ligne avant d'utiliser la fonction add. sinon à chaque ligne reçu j'ai une ligne vide en plus. La fonction Add ajoute automatiquement un LF et CR à ma ligne reçu. Supprimer des caractères pour les remettre c'est barbare.
Au lieu d'utiliser la fonction Add, je pourrais utiliser Memo2_Reception.Text:=Memo2_Reception.Text+ligne_reçu; mais je ne vois plus le défilement des lignes lorsque le nb de ligne dépasse la taille du memo. Je vois toujours à l'écran les 10ères lignes.
Ma question: Comment affiche t-on dans un memo la fin de son contenu?
exemple: memo contient 30 lignes, il peut afficher 10 lignes, comment on lui dit d'afficher les 10 dernières lignes et non les 10 premières?
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 9 févr. 2006 à 14:00
Salut,
c'est bien mais pour la demande de philpas " afficher les dernieres lignes " je pense que SB_BOTTOM et plus juste que SB_LINEDOWN puisque ce dernier ne scroll que d'une ligne vers le bas alors que SB_BOTTOM va jusqu'à la derniere ligne
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 8 févr. 2006 à 16:54
salut,
je pense que la solution "barbare" de supprimer les CR+LF des lignes est encore la plus simple en effet :
1) ta gestion d'affichage est simplifiée
2) il est plus facile de récupérer les données par lines[index] que de
les extraire de la ligne en comptant les séparateurs CR+LF
la fonction d'ajout est très simple:
Memo2_Reception.Lines.Add(copy(ligne_reçu,1,length((ligne_reçu)-2));//les caracteres CR LF étant toujours en fin de ligne il suffit de copier la ligne - 2 caracteres.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 9 févr. 2006 à 14:08
-->philpas petite precision delphi ne rajoute pas de CR LF C'est
uniquement à l'affichage qu'il les interprete comme une nouvelle ligne
(ce procédé est très utile pour afficher en multilignes dans un
caption ou une boite de dialogue même si ici il est plutot gênant)
D'autre part si tu reçois tes données par le port série la plupart des
composants permettent de supprimer automatiquement le caracteres de fin
de trame (par exemple le datapacket de TComport) il ne te reste plus
que la trame utile
cs_philpas
Messages postés77Date d'inscriptionlundi 17 octobre 2005StatutMembreDernière intervention 4 septembre 2008 9 févr. 2006 à 15:10
oui c'est bon, j'ai changé entre temps de composant d'un mémo, je suis passé à un richedit car memo est limité en taille à 64Ko en Win9*
donc j'ai transposé en
SendMessage(RichEdit1_Reception.Handle, WM_VScroll, SB_BOTTOM, 0);
et ceci me permet bien de faire défiler mes lignes au fur et ma mesure que je les reçois.
Merci à tous d'avoir résolu mon problème.
Nota:
Pour CR et LF comme j'enregistre le contenu de memo ou de richedit dans un fichier, j'avais bien une ligne vide entre chaque ligne dans le fichier. voilà pourquoi je dis qu'il m'ajoutait un CR LF.
Le composant Tcomport, je suis en train de le découvrir pour écrire ma liaison série. je ne maitrise pas encore. tu me parle de "datapacket". Je vais regarder à cela: Moi pour l'instant, ce que j'ai réussi à faire, c'est de réceptionner caractère par caractère et de reconstituer ma ligne jusqu'à ce que je réceptionne un LF avec
ComPort1.ReadStr(Car_Recu,1);
Ligne:=Ligne+Car_Recu;
la function ReadStr(var Str: String; Count: Integer): Integer;
cette fonction me demande une valeur à Count. Mais comme je ne connais pas la longueur d'une ligne que je vais réceptionner, j'impose count à 1.
C'est sans doute pas comme cela qu'il faut faire, mais je n'ai pas trouvé d'exemple de programme correctement écrit sur la liaison série (Je relie un PC à une commande numérique)
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 9 févr. 2006 à 15:21
ce n'est pas très bon de lire octet par octet (du point de vue
occupation C¨PU il vaut mieux bufferiser en utilisant la fonction
inputcount et ensuite extraire ta trame de cette chaine
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 9 févr. 2006 à 15:24
si c'est un transfert de CNC à PC où inversement il devrait y avoir un caractère de début et un de fin bin souvent c'est le même " % "
j'avais fait un prog similaire il y a quelques années déjà
@+
Cirec
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 9 févr. 2006 à 16:20
Très juste Cirec !
Je partais du principe que cette commande serait appelée à chaque fois qu'une ligne serait ajoutée, mais j'ai oublié la possibilité que le memo soit mis manuellement en position haute avec les ScrollBars, et à ce moment là, ça n'aurait pas marché correctement ! Donc merci de m'avoir corrigé !
@+
Nico { http://www.ni69.new.fr/ }
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !