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

Composants FMX Delphi Discussion :

Aller à la dernière ligne d'un memo


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 288
    Points : 41 747
    Points
    41 747
    Billets dans le blog
    65
    Par défaut Aller à la dernière ligne d'un memo
    Bonjour,

    on est tous passés par le besoin d'une petite "moulinette" pour tracer des actions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // mise à jour
       TTask.Run(
               procedure
                   var nomimage : String;
                       log : string;
                  begin
                  while not datas.Query.EOF do
                   begin
                      //traitement plus ou moins long
                       log:='action faite';
                    end;
    
                    TThread.Synchronize(TThread.Current,
                        procedure
                        begin
                          memo1.Lines.Add(log);
                          memo1.ScrollToCenter();
                        end);
                       datas.Query.Next;
                      end;
                   end);
    Si memo1.ScrollToCenter(); donne une bonne illusion de défilement, il n'y a pas de ScrolltoBottom dommage
    une idée avant que je ne me lance dans des calculs ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 288
    Points : 41 747
    Points
    41 747
    Billets dans le blog
    65
    Par défaut
    Bon, finalement, calcul "simple"
    voilà le nouveau Synchronize
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TThread.Synchronize(TThread.Current,
    procedure
     var ay : single;
    begin
       memo1.Lines.Add(log);
     //                     memo1.ScrollToCenter();
      ay:=memo1.Lines.Count*(Memo1.Font.Size * 96/72 )-Memo1.ViewportSize.cy;
      memo1.ScrollTo(0,ay);
    end);
    et l'illusion est parfaite, reste plus qu'à intégrer le DPI plutôt que cette "constante" 96/72

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 720
    Points : 25 617
    Points
    25 617
    Par défaut
    En FMX, le TMemo, est-im un control dessiné ou il est tout de même mappé sur le composant Natif de l'OS ?

    As-tu essayé : GoToTextEnd ?
    Le déplacement du curseur est-il accompagné d'un défilement ?






    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TCustomPresentedScrollBox.ScrollToCenter(const AAnimated: Boolean);
    var
      ContentBoundsTmp: TRectF;
      ViewportSizeTmp: TSizeF;
      DestPoint: TPointF;
    begin
      ContentBoundsTmp := ContentBounds;
      ViewportSizeTmp := ViewportSize;
      DestPoint := TPointF.Create((ContentBoundsTmp.Width - ViewportSizeTmp.Width) / 2, (ContentBoundsTmp.Height - ViewportSizeTmp.Height) /2);
      ScrollBy(DestPoint.X - ViewportPosition.X, DestPoint.Y - ViewportPosition.Y, AAnimated);
    end;
     
    procedure TCustomPresentedScrollBox.ScrollToTop(const AAnimated: Boolean = True);
    begin
      ScrollBy(0, -ViewportPosition.Y, AAnimated);
    end;
    on peut en déduire ... code empirique
    Ce défile à ce que la dernière page soit visible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TCustomPresentedScrollBox.ScrollToBottom(const AAnimated: Boolean);
    begin
      ScrollBy(0, ContentBounds.Height - ViewportSize.Height, AAnimated);
    end;

    En VCL sur Windows

    Faudrait vérifier mais il me semble que le défilement était automatique sur le RichEdit mais l'utilisation de BeginUpdate\EndUpdate nuisait à ce comportement
    Faudra que je vérifie sur le TMemo mais j'ai l'impression qu'avec un certains jeux d'options, c'est sans effort le défilement auto, cela dépend peut-être de l'OS.


    Voir TRichEdit : défilement vertical automatique (autoscrolling) où j'utilise EM_LINESCROLL pour travailler en caractère et non en pixel.

    EDIT - Très bête : Memo1.Lines.Add, Delphi 10 Seattle, Win10, un TMemo sans aucune modif, et là le code Memo1.Lines.Add provoque un défilement auto sans aucun code supplémentaire, j'avoue avoir même été surpris pour m'en souvenir.

    Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      object Memo1: TMemo
        Left = 8
        Top = 39
        Width = 333
        Height = 241
        Lines.Strings = (
          'Memo1')
        TabOrder = 1
      end

    Absence de ScrollBars via ssNone, je pense qu'il offre dans ce cas un défilement automatique !

    Voir aussi le lien entre Lines.Add et ES_AUTOVSCROLL, voir si l'on peut pas faire que le TMemo fasse le scroll même si l'on active des ScrollBars.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 447
    Points : 5 868
    Points
    5 868
    Par défaut
    salut

    il n'existe plus la propriété SelStart ?

    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelStart := Length(Text);

  5. #5
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 480
    Points
    480
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    il n'existe plus la propriété SelStart ?

    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelStart := Length(Text);
    J'aurais dit pareil


    Je viens de tester en FMX avec un tout petit code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       Memo1.SelStart := length(Memo1.Lines.Text);
       Memo1.SetFocus
    end;
    J'ai mis le SetFocus juste pour tester avec l'entrée au clavier la position de mon curseur.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 288
    Points : 41 747
    Points
    41 747
    Billets dans le blog
    65
    Par défaut
    Memo1.SelStart Oui, je n'y avais même pas pensé , mais cela a un effet que mon code n'a pas : le défilement reprend au début avant d'aller à la fin, c'est un peu moche niveau effet.

    Citation Envoyé par ShaiLeTroll
    As-tu essayé : GoToTextEnd ?

    non, parce que j'étais obnubilé par le ScrollToEnd inexistant et je n'ai pas pensé un instant que cette procédure existait

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 447
    Points : 5 868
    Points
    5 868
    Par défaut
    salut


    tu ne ferait pas un selstart := 0 avant de réaffecter la valeur ?
    sinon tu peut faire un truc du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure UpdateTMemoPos(Editor : TMemo;Pos : Integer);
    var
      OnChange : TNotifyEvent;am;
    begin
       OnChange := Editor.OnChange;
       Editor.OnChange := nil;
       Editor.SelStart := Pos;
       Editor.OnChange := OnChange;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/07/2021, 16h57
  2. Aller à la dernière ligne
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/06/2008, 11h01
  3. l'identifiant unique de la dernière ligne insérée
    Par dim_italia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2004, 18h55
  4. Méthode donnant le numéro de ligne d'un Memo contenant un texte
    Par kilinette dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/06/2004, 11h16
  5. Comment aller a la ligne avec la commande ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 23/06/2004, 18h11

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