Affiché la dernière ligne dans un memo

Résolu
cs_philpas Messages postés 77 Date d'inscription lundi 17 octobre 2005 Statut Membre Dernière intervention 4 septembre 2008 - 8 févr. 2006 à 16:19
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 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?

14 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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

SendMessage(Memo1.Handle, WM_VScroll, SB_BOTTOM, 0);

@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 févr. 2006 à 16:31
Salut,

en mettant dans l'inspecteur d'objets la propriété ScrollBars de ton memo à ssBoth

@+
Cirec
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
8 févr. 2006 à 16:41
exemple pour afficher les 10 dernieres lignes d'un texte recuperer ds un t memo ds un autre t memo

procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
debut,fin:integer;
begin
debut:=memo1.Lines.Count-1 - 10;
fin:=memo1.Lines.Count-1;


for x:=Debut to fin do


begin
memo2.Lines.Add(memo1.Lines.Strings[x]);
end;


end;

memo1 etant le memo avec le texte

Est ca que tu veux
Ciao
0
cs_philpas Messages postés 77 Date d'inscription lundi 17 octobre 2005 Statut Membre Dernière intervention 4 septembre 2008
8 févr. 2006 à 16:44
oui, il m'affiche bien les dernières lignes mais seulement lorsque ma réception est terminé. Il ne le fait pas en continu.

@+
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 févr. 2006 à 16:48
dans ce cas ça provient certainement de ton code , de la methode utilisé
moi j'ai fait le teste et ça s'affiche en temps réel

@+
Cirec
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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.

pas de quoi casser 3 pattes à un canard!



@+

jlen
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
9 févr. 2006 à 13:40
Voici une alternative intéressante (code à utiliser pour faire scroller vers le bas un Memo) :
SendMessage(Memo1.Handle, WM_VScroll, SB_LINEDOWN, 0);

@+
Nico { http://www.ni69.new.fr/ }


N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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



@+

jlen
0
cs_philpas Messages postés 77 Date d'inscription lundi 17 octobre 2005 Statut Membre Derniè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)

@+
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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

@+

jlen
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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
0
cs_philpas Messages postés 77 Date d'inscription lundi 17 octobre 2005 Statut Membre Dernière intervention 4 septembre 2008
9 févr. 2006 à 15:53
pour l'instant je plane sur le port série, mais je m'accroche.
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
9 févr. 2006 à 16:27
pour le port serie c'est pour cela que datapacket est utile il permet
de dédecter un debut et une fin de trame et de ne garder que la partie
utile

mais les formats de trame dépendent des protocoles utilisés

@+

jlen
0
Rejoignez-nous