Affiché la dernière ligne dans un memo [Résolu]

Signaler
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008
-
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
-
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

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
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
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
Salut,

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

@+
Cirec
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

oui, il m'affiche bien les dernières lignes mais seulement lorsque ma réception est terminé. Il ne le fait pas en continu.

@+
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
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
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
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 !
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
-->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
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

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)

@+
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
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
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
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
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

pour l'instant je plane sur le port série, mais je m'accroche.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
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 !
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
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