Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как выровнять текст в TMemo по центру по вертикали?


Alex7wrt

Вопрос

Здравствуйте.

Интересует, как выставить в TMemo вертикальное выравнивание текста по центру. В ObjectInspector этого свойства нет. В RunTime оно есть, но не работает. StyledSettings сброшены, при

TextSettings.VertAlign:=TTextAlign.Center; 

текст все равно выравнивается по верху. 

Изменено пользователем Alex7wrt
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Нельзя.

Что логично - не известна высота текста заранее, т.к. количество строк в TMemo зависит от многих факторов и далеко не всегда равно TMemo.Lines.Count. Если бы свойство работало, то memo пересчитывало бы все после каждого введенного символа, что сделало бы его еще более тормозным.

Изменено пользователем Error
Ссылка на комментарий
  • 0

По клику на TText, в котором текст центрован по вертикали, этот текст отображается в TMemo и его можно редактировать. Вот здесь желательно, чтобы и в TMemo тоже текст был центрован по вертикали, чтобы внешний вид текста совпадал. 

 

Я вот думаю, если в TMemo нельзя отцентровать текст во вертикали, то может быть выбрать у него Align = VertCenter по отношению к родителю. И при появлении новой строки увеличивать высоту TMemo на высоту строки. Но это подойдет при свойстве WordWrap = False. Если же оно True, то количество строк в Tmemo так не узнаешь. А мне бы хотелось, чтобы WordWrap было активно. В старой версии FMX было свойство GetPositionPoint(ACaretPos :  TCaretPosition):  TPointF для определения координат любого символа, но в новых его нет. Поэтому вот не знаю, как решить вопрос с центровкой по вертикали.

 

UPD. Только что заметил, что даже при WordWrap=False слова все равно переносятся на новую строку при достижении границ TMemo. И новая Line при этом не добавляется. Поэтому вышеописанный способ с WordWrap=False не сработает.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Нашел немного похожий вопрос на http://stackoverflow.com/questions/21836579/can-i-make-a-tmemo-size-itself-to-the-text-it-contains-firemonkey

 

Используя код определения высоты TMemo:

function get_memo_height(amemo:tmemo):single;
var i:integer;
    astring: string;
    layout: ttextlayout;
begin
    Layout := TTextLayoutManager.DefaultTextLayout.Create;
    astring:='';
    for i:=0 to amemo.lines.count-1 do astring:=astring+amemo.lines[i]+chr(10);
    Layout.BeginUpdate;
    Layout.Text :=astring;
    Layout.WordWrap:= amemo.wordwrap;
    Layout.HorizontalAlign:= amemo.TextAlign;
    Layout.MaxSize:= PointF(amemo.width,maxint);
    Layout.VerticalAlign := TTextAlign.Leading;
    Layout.Font := amemo.Font;
    Layout.TopLeft := pointf(0,0);
    Layout.EndUpdate;
    result:=layout.textrect.bottom-amemo.Font.Size;;
    Layout.free;
end; 

Memo.Height:=get_memo_height(Memo);

в сочетании с 

Memo.Align:= TAlignLayOut.VertCenter;

Получаем эффект выравнивания текста Memo по центру вертикали родительского контрола

Изменено пользователем Alex7wrt
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...