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

cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 8 févr. 2006 à 16:19 - Dernière réponse : jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention
- 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?
Afficher la suite 

14 réponses

Répondre au sujet
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 févr. 2006 à 14:00
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 8 févr. 2006 à 16:31
0
Utile
Salut,

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

@+
Cirec
Commenter la réponse de Cirec
Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 8 févr. 2006 à 16:41
0
Utile
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
Commenter la réponse de Nicolas___
cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 8 févr. 2006 à 16:44
0
Utile
oui, il m'affiche bien les dernières lignes mais seulement lorsque ma réception est terminé. Il ne le fait pas en continu.

@+
Commenter la réponse de cs_philpas
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 8 févr. 2006 à 16:48
0
Utile
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
Commenter la réponse de Cirec
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 8 févr. 2006 à 16:54
0
Utile
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
Commenter la réponse de jlen100
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 9 févr. 2006 à 13:40
0
Utile
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 !
Commenter la réponse de ni69
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 9 févr. 2006 à 14:08
0
Utile
-->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
Commenter la réponse de jlen100
cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 9 févr. 2006 à 15:10
0
Utile
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)

@+
Commenter la réponse de cs_philpas
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 9 févr. 2006 à 15:21
0
Utile
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
Commenter la réponse de jlen100
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 févr. 2006 à 15:24
0
Utile
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
Commenter la réponse de Cirec
cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 9 févr. 2006 à 15:53
0
Utile
pour l'instant je plane sur le port série, mais je m'accroche.
Commenter la réponse de cs_philpas
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 9 févr. 2006 à 16:20
0
Utile
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 !
Commenter la réponse de ni69
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 9 févr. 2006 à 16:27
0
Utile
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
Commenter la réponse de jlen100

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.