当您在表单设计器中编辑 TLabel 的标题时,它会为您调整 TLabel 的大小。有什么办法可以让 TMemo 在运行时做到这一点?
我希望能够获取一个 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;
将WordWrap
属性设置TMemo
为 true,将文本转储到其中,计算行数,并将高度设置为行数和行高的乘积,但您需要知道行高。
TMemo
不公开行高属性,但如果您没有在运行时更改字体或字体大小,则可以在设计时通过实验确定行高。
这是我用来设置TMemo
行高为 13 像素的高度的代码。我还发现我需要一个小常数来说明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
,它的SelAttributes
属性包含一个Height
给出行高的属性。
-阿尔。
我已经实现了一个自我成长的 TMemo 作为 LiveBindings 的一个很好的例子(我可以为 VCL 中的 LiveBindings 想出的几个有用的例子之一)。
引用我的 Delphi XE2 Development Essentials 课件手册:
“要构建此示例,请将 TMemo 组件放置在 VCL 表单上,打开 LiveBindings 属性,然后选择“New LiveBinding”选项。选择 TBindExpression 选项。在 Object Inspector 中打开 BindExpressionMemo11 并将 SourceComponent 设置为 Memo1 并将 SourceExpression 设置为 Lines。 Count * 22。要在运行时获得更好的结果,请将 SourceExpression 设置为更精确的表达式
Font.Size - 4 + (Lines.Count + 1) * -1 * (Font.Height - 3)
最后,在 TMemo 的 OnChange 事件处理函数中,编写一行代码:
BindingsList1.Notify(Sender, '');
就是这样。编译并运行以查看不断增长的备忘录。
[截屏]
最初,TMemo 控件将有两行高(包含内容的行和下一行),每当我们按下回车键或自动换行将我们推进到下一行时,TMemo 控件的高度就会增加(实际上是向下增长,所以请确保在表格上留出足够的空间让 TMemo 自行扩展)。”
Groetjes,鲍勃·斯沃特
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;