11

当您在表单设计器中编辑 TLabel 的标题时,它会为您调整 TLabel 的大小。有什么办法可以让 TMemo 在运行时做到这一点?

我希望能够获取一个 TMemo,为其 .lines.text 属性分配一些东西,然后告诉它自己调整大小并且不超过一定的宽度,尽管它可以达到它想要的高度。有谁知道该怎么做?

4

5 回答 5

8

这对我来说很好。添加的常量 (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;
于 2009-06-01T18:28:09.157 回答
6

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给出行高的属性。

-阿尔。

于 2009-06-01T18:44:51.530 回答
3

我已经实现了一个自我成长的 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,鲍勃·斯沃特

于 2011-11-04T14:49:35.497 回答
1
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;
于 2011-11-04T13:51:23.347 回答
1

为什么不只是:

Memo1.Height := Memo1.ContentBounds.Height + 5;
于 2014-04-16T08:51:51.807 回答