在表单设计器中编辑 TLabel 的标题时,它会自动调整 TLabel 的大小。有没有办法让 TMemo 在运行时也做到这一点?
我想能够取一个 TMemo,给其 .lines.text 属性赋值,然后告诉它调整自己的大小并且不超过一定的宽度,但它可以尽可能的高。有人知道如何实现吗?
我想能够取一个 TMemo,给其 .lines.text 属性赋值,然后告诉它调整自己的大小并且不超过一定的宽度,但它可以尽可能的高。有人知道如何实现吗?
这对我来说完全有效。添加的常量(8)可能会因您是否使用边框和/或斜面而有所不同,请进行尝试。
procedure TForm1.Memo1Change(Sender: TObject);
var
LineHeight: Integer;
DC: HDC;
SaveFont : HFont;
Metrics : TTextMetric;
Increase: Integer;
LC: Integer;
begin
DC := GetDC(Memo1.Handle);
SaveFont := SelectObject(DC, Memo1.Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(Memo1.Handle, DC);
LineHeight := Metrics.tmHeight;
Increase := Memo1.Height;
LC := Memo1.Lines.Count;
if LC < 1 then
LC := 1;
Memo1.Height := LC * LineHeight + 8;
Increase := Memo1.Height - Increase;
Memo1.Parent.Height := Memo1.Parent.Height + Increase;
end;
TMemo
的 WordWrap
属性设置为 true,将文本倾倒到其中,计算行数,并将高度设置为行数和行高的乘积,但您需要知道行高。
TMemo
没有公开的行高属性,但如果您在运行时不更改字体或字体大小,则可以在设计时通过实验确定行高。TMemo
高度的代码。我还发现我需要一个小常量来解释 TMemo
的顶部和底部边框。我将高度限制为 30 行(396 像素),以使其保持在表单上。// Memo.WordWrap = True (at design time)
Memo.Text := <ANY AMOUNT OF TEXT>;
Memo.Height := Min(19 + Memo.Lines.Count * 13, 396);
TRichEdit
,它具有包含行高度的Height
属性的SelAttributes
属性。
-Al.
procedure TTmpMessage.edMsgChange (Sender: TObject);
var
LineHeight : Integer;
DC : HDC;
SaveFont : HFont;
Metrics : TTextMetric;
begin
DC := GetDC ( TRxRichEdit (Sender).Handle );
SaveFont := SelectObject ( DC, TRxRichEdit (Sender).Font.Handle );
GetTextMetrics (DC, Metrics);
SelectObject (DC, SaveFont);
ReleaseDC ( TRxRichEdit (Sender).Handle, DC );
LineHeight := Metrics.tmHeight;
Height := TRxRichEdit (Sender).Lines.Count * LineHeight + 32;
end;
Memo1.Height := Memo1.ContentBounds.Height + 5;