Tmemo Sans Defilement Auto

Résolu
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012 - 14 août 2009 à 11:54
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 20 août 2009 à 21:01
Bonjour,

petite question: est-il possible d'ajouter des lignes(append) a un TMemo sans avoir le scroll automatique à la fin du memo.
En d'autres termes, si je charge des données à la volé dans un Tmemo, est il possible de faire un Arret Defilement?


Bonne weekend a tous!

11 réponses

cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012
17 août 2009 à 09:27
Il semble que Memo.BeginUpdate et Memo.EndUpadte me permette de faire.

Bonne journée
3
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
14 août 2009 à 13:10
Salut,

oui, c'est possible

bon w-e à toi.
0
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012
17 août 2009 à 08:58
Et comment fait-on cela, svp?
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 août 2009 à 09:43
Alors deux solutions se présentent à toi, ayant chacune un effet différent :

1) une solution qui consiste à mettre Visible à False avant l'ajout de données, puis le remettre de nouveau à true par la suite. Ainsi l'affichage ne change pas du tout.
Memo.Visible := false;
Memo.Lines.Add('...');
Memo.Visible := true;


2) une solution qui consiste à repositionner le curseur au tout début du Memo à la fin de l'ajout de texte, ce qui fait revenir l'affichage aux premières lignes.
Memo.Lines.Add('...');
SendMessage(Memo.Handle, EM_SETSEL, 0, 0);
SendMessage(Memo.Handle, EM_SCROLLCARET, 0, 0);


@+
Nico { www.ni69.info }
0

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

Posez votre question
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 août 2009 à 09:46
Oh, je n'avais pas eu le temps de voir ton post.
Dans ma version de Delphi (2005), les procédures :
Memo.BeginUpdate;
Memo.EndUpdate;

n'existent pas !
Peut-être est-ce un ajout de versions ultérieures ? (A confirmer...)


@+
Nico { www.ni69.info }
0
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012
17 août 2009 à 09:49
en faite, c'est Memo.lines.BeginUpdate; et Memo.lines.EndUpdate;
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 août 2009 à 09:49
Je pense que tu voulais dire :
Memo.Lines.BeginUpdate;
Memo.Lines.EndUpdate;

à la place !

@+
Nico { www.ni69.info }
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 août 2009 à 09:50
Nous nous sommes donc finalement compris
Et c'est en effet une bonne solution.

@+
Nico { www.ni69.info }
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
19 août 2009 à 20:26
@ni69 : Mettre Visible à False puis à True revient à faire de manière moins élégante un BeginUpdate et un EndUpdate. En effet, lorsque tu mets Visible à False, la VCL suppose que tu n'as pas besoin de redessiner le contrôle (puisqu'il est pas visible). Il appelle donc BeginUpdate. Puis quand tu mets Visible à True, la VCL met à jour et réaffiche, ce qui revient à un EndUpdate. C'est la même chose ... sauf qu'on a un léger clignotement avec la méthode des Visible ? Non ?

Cordialement, Bacterius !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
20 août 2009 à 20:57
@ Bacterius : Effectivement. Cependant, le "clignotement" dont tu parles n'est pas visible en pratique car dans le cas du code suivant :
Memo.Visible := false;
Memo.Lines.Add('...');
Memo.Visible := true;

Le Memo n'est en fait redessiné que lorsque le programme rend la main, c'est à dire après la remise à true de la propriété Visible du Memo (cet effet est d'ailleurs caractéristique de tous les effets de freeze des applications qui exécutent un code long sans inclure des "Application.ProcessMessages"...)

Reste que l'emploi de BeginUpdate/EndUpdate est préférable, nous sommes d'accord là dessus.


@+
Nico { www.ni69.info }
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
20 août 2009 à 21:01
Effectivement, bien vu

Cordialement, Bacterius !
0
Rejoignez-nous