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 :

[D7] positionnement dans un Memo


Sujet :

Delphi

  1. #1
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut [D7] positionnement dans un Memo
    Bonjour, et joyeuses fêtes à tous,

    J'aimerais récupérer le numéro de la première ligne affichée (ou visible) en haut d'un TMemo.

    Puis en ré-affichant le Memo avec un nombre de lignes identiques, repositionner le Memo à la même place (ligne de même numéro visible en haut)

    Je sais me déplacer et scroller dans le mémo, mais je n'arrive pas à faire cela.

    Quelqu'un a t il une solution ?

    Le but est de comparer facilement 2 affichages successifs.

    Merci
    A+
    Charly

  2. #2
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    J'ai trouvé le n° de la première ligne visible, mais je n'arrive toujours pas à la repositionner après le nouvel affichage du Memo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    { =========================================================== }
    function FirstVisibleLine(const aMemo:TMemo) :Integer;
    const
      EM_GETFIRSTVISIBLELINE = 206;
    begin
      Result := -1;
      if Assigned(aMemo) then
        Result := SendMessage(aMemo.Handle,EM_GETFIRSTVISIBLELINE,0,0);
    end;
    { =========================================================== }
    A+
    Charly

  3. #3
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    Bon, j'ai fait ceci qui fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    { =========================================================== }
    procedure TF_Princ.Lb_FichierClick(Sender: TObject);
    Var
      i : Integer ;
    begin
      Memo1.Lines.BeginUpdate ;
      Ligne := SendMessage(Memo1.Handle,EM_GETFIRSTVISIBLELINE,0,0);
      Btn_LireExifClick(Self) ;
      Memo1.Perform( Em_linescroll, 0, Ligne - Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0));
      Memo1.Lines.EndUpdate ;
    end;
    { =========================================================== }
    Reste à régler le problème d'un nouvel affichage qui a moins de lignes que le précédent.

    (je peux ajouter des lignes vierges pour compléter, mais c'est un peu bourrin ...)

    A+
    Charly

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 201
    Points : 2 256
    Points
    2 256
    Billets dans le blog
    6
    Par défaut
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics, Vcl.dialogs,
      Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ComCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        procedure FormActivate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
     
    TYPE
      TMemoHelper = class helper for TMemo
      private
        function GetLineNo: integer;
        procedure SetLineNo(NewLineNo: INTEGER);
      public
        property LineNo : integer Read GetLineNo Write SetLineNo;
      END;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    function TMemoHelper.GetLineNo: integer;
    BEGIN
      Result := Perform(EM_LINEFROMCHAR, SelStart, 0)
    END;
     
    PROCEDURE TMemoHelper.SetLineNo(NewLineNo: INTEGER);
    BEGIN
      IF NewLineNo < 0 THEN
        NewLineNo := 0;
      IF NewLineNo > Lines.Count THEN
        NewLineNo := Lines.Count;
      SelStart := Perform(EM_LINEINDEX, NewLineNo, 0);
      Perform(EM_SCROLLCARET, 0, 0);
    END;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Memo1.LineNo := Memo1.Lines.Count;
      Memo1.LineNo := 15;
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      Memo1.Lines.LoadFromFile('ex01a.pas');
    end;
     
    end.

  5. #5
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    Merci Alweber,

    mais dans cette appli je suis en D7. Je vais tester ta solution en 10.3

    A+
    Charly

  6. #6
    Membre éclairé
    Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 385
    Points : 894
    Points
    894
    Par défaut
    Bonjour,

    et Bonnes Fêtes à toutes et à tous.

    je sais pas si j'ai bien saisi le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
     FirstVisibleLine: Integer = 15;
     
    // retrouve l'index de la première ligne affiché
    procedure TForm6.Button2Click(Sender: TObject);
    begin
      FirstVisibleLine := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // repositionne l'affichage à la ligne souhaitée
    procedure TForm6.Button3Click(Sender: TObject);
    begin
      Memo1.Perform(EM_LINESCROLL, 0, FirstVisibleLine - Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0));
    end;
    Cordialement,

    @+

    ps: Testé sous D6

    [EDIT] je viens de voir le positionnement avec "EM_LINESCROLL" est relatif
    problème corrigé [/EDIT]

  7. #7
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    Merci Cirec et bon Noël à toi aussi,

    Oui, cela fonctionne bien, mais mon code me satisfait aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    { =========================================================== }
    procedure TF_Princ.Lb_FichierClick(Sender: TObject);
     
    begin
      Memo1.Lines.BeginUpdate ;
      Ligne := SendMessage(Memo1.Handle,EM_GETFIRSTVISIBLELINE,0,0);  // Stocke le n° de la ligne visible en haut
      Btn_LireExifClick(Self) ;   // Effectue un traitement qui réaffiche le Memo avec d'autres données 
      Memo1.Perform( Em_linescroll, 0, Ligne - Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0));  // réaffiche la même ligne visible en haut et donc le memo reste à la même position
      Memo1.Lines.EndUpdate ;
    end;
    Mon problème est solutionné !

    A+
    Charly

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/05/2005, 18h43
  2. forcer le curseur à ce positionner dans une zone texte
    Par caton dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/04/2005, 15h17
  3. Réponses: 14
    Dernier message: 08/01/2005, 17h53
  4. Couleurs dans un memo
    Par steph_1 dans le forum Composants VCL
    Réponses: 11
    Dernier message: 18/11/2004, 15h15
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 14h31

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