IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Comment connaître le n° de la premère ligne affichée dans un mémo ?


Sujet :

Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 194
    Points : 127
    Points
    127
    Par défaut Comment connaître le n° de la premère ligne affichée dans un mémo ?
    Bonjour à tous,
    Ma question est dans le titre : comment faire pour avoir le n° de la 1ere ligne affichée dans un mémo (sachant que pour scroller un mémo on n'a pas besoin de cliquer dedans, un coup de molette en se positionnant dessus fait aussi défiler le contenu...)

    Dans mon programme, je peux changer dynamiquement la taille de caractère du RichEdit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         RichEdit2.Font.Size:= RichEdit5.Font.Size+1;
    Mais l'affichage pert le formatage du texte (couleur, style), je dois alors recharger le composant de son texte (clear puis add) et l'affichage redébute à la 1ere ligne (normal)
    J'aimerai repositionner le texte à la ligne où il était avant le changement de taille.

    J'ai trouvé ce code qui permet de connaitre la position de la scrollbar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      RichEdit2.WindowProc := Memo2ScrollCatcher;
    end;
     
    procedure TForm3.Memo2ScrollCatcher(var message: TMessage);
    begin
         TMyControl(RichEdit2).WndProc(message);
         if ((message.Msg = WM_VSCROLL) or (message.Msg = WM_MOUSEWHEEL))
         then begin
             RE2LineIndex := GetScrollPos(RichEdit2.Handle, SB_VERT); // RE2LineIndex = integer contient la position de la scrollBar verticale
         end;
    end;
    Mais après le changement de taille de texte, la valeur de RE2LineIndex ne correspond plus


    J'ai beau chercher, je ne trouve rien.
    Si quelqu'un à une solution ou peut me renvoyer sur un post ...
    Merci d'avance

  2. #2
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 194
    Points : 127
    Points
    127
    Par défaut
    Bon, j'ai trouvé, je me réponds à moi même ça peut servir à d'autres :
    il suffit d'utiliser EM_GETFIRSTVISIBLELINE
    Le code renvoie un integer = 1ere ligne affichée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Var
    LineIndex:Integer;
    begin
    LineIndex:=RichEdit2.perform(EM_GETFIRSTVISIBLELINE,0,0);;
    end;
    Maintenant, il faut faire l'inverse, c'est à dire positionner la ligne comme 1ere ligne affichée dans le memo.
    j'ai essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         SendMessage(RichEdit2.Handle,WM_VScroll,LineIndex,0);
    Et béh ça ne fonctionne pas ...

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 806
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 806
    Points : 13 497
    Points
    13 497

  4. #4
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 194
    Points : 127
    Points
    127
    Par défaut
    Merci Andnotor,
    J'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RichEdit2.Perform(EM_LINESCROLL,LineIndex,0);
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(LineIndex.Handle,EM_LINESCROLL,LineIndex,0);
    il a fallu que je mette un RichEdit2.SetFocus avant, sinon, rien ne se passait.
    Et là, curieux, le texte devrait bien se déplacer de LineIndex lignes, mais non, le comportement est bizarre, il positionne le texte dernière ligne affichée = dernière ligne du texte

    J'ai donc résolu par ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         RichEdit2.SetFocus;
         //RichEdit2.Perform(EM_LINESCROLL,LineIndex,0);
         //SendMessage(RichEdit2.Handle,EM_LINESCROLL,LineIndex,0);
         RichEdit2.SelStart := RichEdit2.Perform(EM_LINEINDEX, LineIndex, 0);
         RichEdit2.Perform(EM_SCROLLCARET, 0, 0); // cette ligne n'est pas indispensable à priori, je n'ai pas vu de différence de comportement avec/sans
    Pour moi c'est résolu, mais quand même ... le comportement avec EM_LINESCROLL me laisse perplexe...

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Pourquoi ne pas utiliser les composants Synedit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SynEdit1.PixelsToRowColumn(3, 3)).Row
    donne par exemple 6 si la sixième ligne est affichée en première position "visible".

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 806
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 806
    Points : 13 497
    Points
    13 497
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    J'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RichEdit2.Perform(EM_LINESCROLL,LineIndex,0);
    Regarde une nouvelle fois l'aide sur EM_LINESCROLL, le défilement vertical correspond à LPARAM, pas WPARAM.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/10/2010, 13h47
  2. Réponses: 2
    Dernier message: 09/04/2008, 14h21
  3. Réponses: 1
    Dernier message: 23/08/2006, 14h57
  4. Module Chat : atteindre la dernière ligne affiché dans un DIV
    Par hatembr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/06/2006, 13h17
  5. [MySQL] Supprimer une ligne afficher dans une base de donnée
    Par julienchpt dans le forum PHP & Base de données
    Réponses: 31
    Dernier message: 14/10/2005, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo