Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Lazarus и автовысота TMemo  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Элементарщина, но чё-то затупил. Хочу, чтобы memo само расширялось под содержимое. Как отследить, что текст вмещается? Либо, как вариант, что скроллбар имеет полоску прокрутки?

Поиск ничего путного не дал.
Надеялся, что Scrollbars := ssAutoVertical будет следить за наличием скроллбара - фиг там, он всегда присутствует.
Range у скроллбаров обсчитывается независимо от того, есть полоска или нет.
Всякие виндовые WM_* трюки мимо кассы - мультиплатформа.
18 июл 19, 19:18    [21929690]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Gator
Member

Откуда: Москва
Сообщений: 14906
memo.Align := alClient; ?
18 июл 19, 23:15    [21929799]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6510
а может

1) невидимый TextBox (или как он там) с AutoSize=true, если есть такое свойство, конечно
2) записать туда текст
3) вызвать Application.ProcessMessages
4) определить Height / Width
19 июл 19, 02:00    [21929839]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6510
другой способ нашел, через 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.


К сообщению приложен файл. Размер - 7Kb
19 июл 19, 02:38    [21929847]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6510


К сообщению приложен файл. Размер - 5Kb
19 июл 19, 02:38    [21929848]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 282
Прикинуть, какой требуется RECT для текста, функцией canvas.textrect с опциями tfCalcRect,tfWordBreak и тд?
19 июл 19, 03:09    [21929851]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
V.Borzov
Прикинуть, какой требуется RECT для текста, функцией canvas.textrect с опциями tfCalcRect,tfWordBreak и тд?

+1

При этом границы Memo привязать к краям формы и увеличивать ее высоту по мере увеличения высоты текста в Memo. Гарантированно будет работать на винде, но на линуксе могут быть проблемы в некоторых ОСях при уменьшении высоты формы с большей величины на меньшую (у меня такие траблы наблюдались в Дебиане 7-9 c GTK2, на Deb 10 GTK3 - надо будет проверить).
19 июл 19, 09:55    [21929994]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Gator
memo.Align := alClient; ?

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

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

Вариант с Canvas в итоге кое-как работает, хотя пришлось одалживать его у формы (до сих пор для меня загадка, по какой логике одним контролам выделили канвас, а другим шиш с маслом) и надеяться, что шрифты совпадают. Ну и добавить эмпирический интерлиньяж тупо константой, т.к. откуда его взять штатно я не нашел.
19 июл 19, 10:39    [21930022]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Василий 2
Всякие виндовые WM_* трюки мимо кассы - мультиплатформа.

зависит от....
Подключи в uses LCLType, LCLIntf, LMessages - будешь приятно удивлен :)
19 июл 19, 10:46    [21930027]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Василий 2
Вариант с Canvas в итоге кое-как работает, хотя пришлось одалживать его у формы... и надеяться, что шрифты совпадают.

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

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


К сообщению приложен файл (project1.zip - 105Kb) cкачать
19 июл 19, 12:01    [21930103]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60147
По сабжу:

RTFM EM_LINEFROMCHAR ?

Posted via ActualForum NNTP Server 1.5

19 июл 19, 12:03    [21930106]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Gator
Member

Откуда: Москва
Сообщений: 14906
Гаджимурадов Рустам> RTFM EM_LINEFROMCHAR ?

У него Лазарь на линухе
19 июл 19, 12:09    [21930111]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
alekcvp
Member

Откуда:
Сообщений: 1485
Василий 2
Вариант с Canvas в итоге кое-как работает, хотя пришлось одалживать его у формы (до сих пор для меня загадка, по какой логике одним контролам выделили канвас, а другим шиш с маслом) и надеяться, что шрифты совпадают

А сделать свой канвас с нужным шрифтом в Лазаре нельзя?..
19 июл 19, 12:09    [21930112]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Gator
Member

Откуда: Москва
Сообщений: 14906
Василий 2
Gator
memo.Align := alClient; ?

Это никак не поможет.
Это как бы намёк был.
Есть же там Ancors, вот и привяжись к ним.
Например, на панельке
19 июл 19, 12:12    [21930116]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60147
Gator> У него ... на линухе

А, тогда сорри.

Posted via ActualForum NNTP Server 1.5

19 июл 19, 12:31    [21930140]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Василий 2,

можно еще тут почитать
https://wiki.freepascal.org/Developing_with_Graphics
19 июл 19, 14:01    [21930244]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Док
где ты там нашел трудности? :)

Не трудности, а странное решение :) хотя, судя по всему, иначе никак. Забавно, что DrawText со всеми флагами - кросс-платформа. Но у тебя опять же расчет на то, что шрифт мемо = шрифту формы.
alekcvp
А сделать свой канвас с нужным шрифтом в Лазаре нельзя?..

Наверняка можно, но не хотелось целую систему придумывать из-за такой мелочи...
Гаджимурадов Рустам
По сабжу:

RTFM EM_LINEFROMCHAR ?

RichEdit же? Там-то и скроллбары нормально работают, можно тупо расширять контрол, пока скролл не исчезнет.
Gator
Это как бы намёк был.
Есть же там Ancors, вот и привяжись к ним.
Например, на панельке

Как-то не вкуриваю. Как anchors помогут расширить контрол, чтобы он вмещал текст без прокрутки?
19 июл 19, 14:36    [21930279]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Василий 2
Но у тебя опять же расчет на то, что шрифт мемо = шрифту формы.

хорошо, вот тебе с разными шрифтами
+
Картинка с другого сайта.

Но у такого подхода один минус - встроенные скроллы у TMemo работать не будут, так что все придется рисаовать ручками Картинка с другого сайта.

К сообщению приложен файл (project1.zip - 106Kb) cкачать
19 июл 19, 15:06    [21930322]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Док
Но у такого подхода один минус

а, нет. Я забыл про WordWrap :)
19 июл 19, 15:10    [21930329]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Ну и если самому включать скроллинг по горизонтали
+
Картинка с другого сайта.


К сообщению приложен файл (project1.zip - 106Kb) cкачать
19 июл 19, 16:14    [21930444]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60147
Василий 2> RichEdit же?

Не понял вопроса. Он работает и с Memo.
Другое дело, что у вас Linux и как там оно
(аналоги и пр.) лично мне искать лень.

Posted via ActualForum NNTP Server 1.5

19 июл 19, 16:18    [21930452]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3731
Всё можно сделать без кода. На панель бросить лейбл и мемо. У мемо выставить привязки в размерам панели, у панели выставить автосайз. Вордврап у мемо и лейбла привести к одиному значению. У лейбла выставить бордерспейсинг фраунд - 2 (вообще, бордерспейсинг можно потюнить). Потом в событии ОнЧендж присваивать лейблу содержимое мемо + sLineBreak; Это всё.

К сообщению приложен файл. Размер - 81Kb
19 июл 19, 17:10    [21930533]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Гаджимурадов Рустам
Василий 2> RichEdit же?

Не понял вопроса. Он работает и с Memo.
Другое дело, что у вас Linux и как там оно
(аналоги и пр.) лично мне искать лень.

В MSDN отнесли к richedit, на мемо не проверял, вот и озадачился.

Kazantsev Alexey, оригинально)

Док, ты почти пересоздал мемо, остановись)).
19 июл 19, 17:32    [21930565]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Василий 2
Док, ты почти пересоздал мемо, остановись)).

ты бы лучше спасибо сказал, я тут за тебя ненароком всю работ сделал, лентяй Картинка с другого сайта.

Kazantsev Alexey,

ну ты кудесник ;)
19 июл 19, 18:51    [21930659]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus и автовысота TMemo  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Док
ты бы лучше спасибо сказал, я тут за тебя ненароком всю работ сделал, лентяй Картинка с другого сайта.

Спасибо и всяческие респекты!
22 июл 19, 18:34    [21932026]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить