Я вижу проблему, я думаю, что все строки в TMemo равны по высоте, но некоторые могут быть пустыми ...
Таким образом, получение высоты пустых даст ноль, в то время как они не равны нулевой высоте наTMemo.
Так что решение, возможно, делает что-то вроде Memo.Lines.Count * LineHeight
Остерегайтесь того, что Lineheight не может быть получен Canvas.TextHeight, поскольку Canvas.TextHeight даст более или менееточная высота минимальной высоты для текста ... я имею в виду, что он не даст такую же высоту для текста 'ABC', как для 'ABCp' и т. д. *
Я бы рекомендовал (если не хотите вызывать WindowsAPI), чтобы использовать Font.Height, но если он отрицательный, внутреннее начало каждой строки не измеряется ...
Поэтому я бы рекомендовал сделать следующие шаги (проверено):
- Назначьте положительное значение для Memo.Font.Height в событии OnCreate или в любом месте, где вы хотите, с этой линией высотой TMemo будет такое значение, которое вы присвоили
- Общая высота теперь может быть получена непосредственно Memo.Lines.Count* LineHeight, так как вы присвоили Memo.Font.Height положительное значение (помните, что Memo.Font.Size должно быть отрицательным)
Лично я делаю это для события TForm OnCreate (дляубедитесь, что это сделано только один раз), просто чтобы убедиться, что размер визуального шрифта не изменился, а MyMemo.Font.Height включает внутреннее начало каждой строки:
MyMemo.Font.Height:=Abs(MyMemo.Font.Size*MyMemo.Font.PixelsPerInch div Screen.PixelsPerInch);
Убедитесь, что предыдущее будет выполнено только один раз, в противном случаеразмер текста будет все больше и больше, сколько бы раз вы его не запускали ... это вызвано тем, что не всегда MyMemo.Font.PixelsPerInch равно Screen.PixelsPerInch ... в моем случае они равны 80 и 96 соответственно.
Затем, когда мне нужно узнать высоту строки, я просто использую:
Abs(MyMemo.Font.Height*Screen.PixelsPerInch div 72)
Это дает точную высоту одной строки TMemo, поскольку все строки имеют одинаковую высоту, общая высота будет:
MyMemo.Lines.Count*Abs(MyMemo.Font.Height*Screen.PixelsPerInch div 72)
Итак, чтобы сделать высоту TMemo такой же большой, как и содержащийся в ней текст, я делаю это (прочитайте комментарий к каждой строке, они очень важны):
MyMemo.Font.Height:=Abs(MyMemo.Font.Size*MyMemo.Font.PixelsPerInch div Screen.PixelsPerInch); // I do this on the Tform OnCreate event, to ensure only done once
MyMemo.Height:=1+MyMemo.Lines.Count*Abs(MyMemo.Font.Height*Screen.PixelsPerInch div 72); // I do this anywhere after adding the text and/or after editing it
I, вы делаетене хочу Чтобы поиграть с Screen.PixelsPerInch, вы можете просто сделать это (прочитайте комментарий к каждой строке, они очень важны):
MyMemo.Font.Height:=Abs(MyMemo.Font.Height); // This may make text size to visually change, that was why i use the corrector by using MyMemo.Font.PixelsPerInch and Screen.PixelsPerInch
MyMemo.Height:=1+MyMemo.Lines.Count*Abs(MyMemo.Font.Height*MyMemo.Font.PixelsPerInch div 72);
Надеюсь, это может кому-нибудь помочь.