Перейти к содержанию
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 пользователей онлайн

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