Question TMemo avec affichage automatique / masquer les barres de défilement


J'ai besoin de TMemo simple qui n'affiche PAS les barres de défilement lorsqu'elles ne sont pas nécessaires (c.-à-d. Texte insuffisant), mais quand elles le sont. quelque chose comme ScrollBars = ssAuto ou comme le TRichEdit HideScrollBars.

J'ai essayé de sous-classer un TMemo et d'utiliser le ES_DISABLENOSCROLL dans les CreateParams comme dans le TRichEdit mais ça ne marche pas.

Edit: Cela devrait fonctionner avec ou sans WordWrap activée.


13
2018-04-18 15:17


origine


Réponses:


Si votre mémo est placé sur le formulaire, le formulaire sera notifié avec un EN_UPDATE lorsque le texte a été modifié et que le contenu sera redessiné. Vous pouvez décider ici s'il y aura des barres de défilement. Je suppose que nous jouons avec la barre de défilement verticale et qu'il n'y a pas de barre de défilement horizontale:

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMCommand(var Msg: TWMCommand); message WM_COMMAND;
  public

...

procedure SetMargins(Memo: HWND);
var
  Rect: TRect;
begin
  SendMessage(Memo, EM_GETRECT, 0, Longint(@Rect));
  Rect.Right := Rect.Right - GetSystemMetrics(SM_CXHSCROLL);
  SendMessage(Memo, EM_SETRECT, 0, Longint(@Rect));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.ScrollBars := ssVertical;
  Memo1.Lines.Text := '';
  SetMargins(Memo1.Handle);
  Memo1.Lines.Text := 'The EM_GETRECT message retrieves the formatting ' +
  'rectangle of an edit control. The formatting rectangle is the limiting ' +
  'rectangle into which the control draws the text.';
end;

procedure TForm1.WMCommand(var Msg: TWMCommand);
begin
  if (Msg.Ctl = Memo1.Handle) and (Msg.NotifyCode = EN_UPDATE) then begin
    if Memo1.Lines.Count > 6 then   // maximum 6 lines
      Memo1.ScrollBars := ssVertical
    else begin
      if Memo1.ScrollBars <> ssNone then begin
        Memo1.ScrollBars := ssNone;
        SetMargins(Memo1.Handle);
      end;
    end;
  end;
  inherited;
end;


La chose avec la définition de la bonne marge est que, supprimer / mettre la barre de défilement verticale semble complètement laid si le texte doit être restructuré pour tenir dans.


Notez que l'exemple ci-dessus suppose un maximum de 6 lignes. Pour savoir combien de lignes pourraient figurer dans votre mémo, consultez cette question: Comment puis-je déterminer la hauteur d'une ligne de texte dans un TMemo par programmation?.


5
2018-04-18 16:04