Lazarus и автовысота TMemo

Василий 2
Дата: 18.07.2019 19:18:54
Элементарщина, но чё-то затупил. Хочу, чтобы memo само расширялось под содержимое. Как отследить, что текст вмещается? Либо, как вариант, что скроллбар имеет полоску прокрутки?

Поиск ничего путного не дал.
Надеялся, что Scrollbars := ssAutoVertical будет следить за наличием скроллбара - фиг там, он всегда присутствует.
Range у скроллбаров обсчитывается независимо от того, есть полоска или нет.
Всякие виндовые WM_* трюки мимо кассы - мультиплатформа.
Gator
Дата: 18.07.2019 23:15:06
memo.Align := alClient; ?
Кроик Семён
Дата: 19.07.2019 02:00:39
а может

1) невидимый TextBox (или как он там) с AutoSize=true, если есть такое свойство, конечно
2) записать туда текст
3) вызвать Application.ProcessMessages
4) определить Height / Width
Кроик Семён
Дата: 19.07.2019 02:38:06
другой способ нашел, через Label

UNIT Unit1;

{$mode objfpc}{$H+}

INTERFACE

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    LabelForCalculation: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

IMPLEMENTATION

{$R *.lfm}

type
   TLabelCracker = class(TLabel);

//-----------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
   LabelForCalculation.Visible := false;
   LabelForCalculation.AutoSize := true;
   LabelForCalculation.Font.Assign(Memo1.Font);

   Memo2.Font.Assign(Memo1.Font);
end;
//-----------------------------------------------------------
procedure TForm1.Memo1Change(Sender: TObject);
var
   sText : string;
begin
   sText := TrimRight(Memo1.Text);

   Memo2.Text := sText;
   LabelForCalculation.Caption := sText;

   //без этого принудительного вызова невидимый Label не пересчитает свой размер
   TLabelCracker(LabelForCalculation).DoAutoSize(); 

   Memo2.Width := LabelForCalculation.Width + 10;
   Memo2.Height := LabelForCalculation.Height + 10;
end;
//-----------------------------------------------------------

END.
Кроик Семён
Дата: 19.07.2019 02:38:22
V.Borzov
Дата: 19.07.2019 03:09:15
Прикинуть, какой требуется RECT для текста, функцией canvas.textrect с опциями tfCalcRect,tfWordBreak и тд?
Док
Дата: 19.07.2019 09:55:09
V.Borzov
Прикинуть, какой требуется RECT для текста, функцией canvas.textrect с опциями tfCalcRect,tfWordBreak и тд?

+1

При этом границы Memo привязать к краям формы и увеличивать ее высоту по мере увеличения высоты текста в Memo. Гарантированно будет работать на винде, но на линуксе могут быть проблемы в некоторых ОСях при уменьшении высоты формы с большей величины на меньшую (у меня такие траблы наблюдались в Дебиане 7-9 c GTK2, на Deb 10 GTK3 - надо будет проверить).
Василий 2
Дата: 19.07.2019 10:39:18
Gator
memo.Align := alClient; ?

Это никак не поможет.

Кроик Семён, мда, варианты оригинальные, видимо я давно не сталкивался с вынужденной проктостоматологией

Вариант с Canvas в итоге кое-как работает, хотя пришлось одалживать его у формы (до сих пор для меня загадка, по какой логике одним контролам выделили канвас, а другим шиш с маслом) и надеяться, что шрифты совпадают. Ну и добавить эмпирический интерлиньяж тупо константой, т.к. откуда его взять штатно я не нашел.
Док
Дата: 19.07.2019 10:46:47
Василий 2
Всякие виндовые WM_* трюки мимо кассы - мультиплатформа.

зависит от....
Подключи в uses LCLType, LCLIntf, LMessages - будешь приятно удивлен :)
Док
Дата: 19.07.2019 12:01:59
Василий 2
Вариант с Canvas в итоге кое-как работает, хотя пришлось одалживать его у формы... и надеяться, что шрифты совпадают.

где ты там нашел трудности? :)
+
Картинка с другого сайта.

Картинка с другого сайта.