我可以根据它包含的文本制作TMemo大小吗?

时间:2009-06-01 17:38:45

标签: delphi tmemo

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

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

5 个答案:

答案 0 :(得分:7)

这对我来说很好。添加的常数(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;

答案 1 :(得分:6)

WordWrap的{​​{1}}属性设置为true,将文本转储到其中,计算行数,并将高度设置为行数和行高的乘积,但是您需要知道线高。

TMemo不会显示行高属性,但如果您未在运行时更改字体或字体大小,则可以在设计时通过实验确定行高。

这是我用来设置行高为13像素的TMemo高度的代码。我还发现我需要一个小常数来说明TMemo的顶部和底部边框。我将高度限制为30行(396像素)以保持形式。

TMemo

如果绝对必须在运行时从对象中提取行高,则可以使用Someone's answer。或者,您可以使用// Memo.WordWrap = True (at design time) Memo.Text := <ANY AMOUNT OF TEXT>; Memo.Height := Min(19 + Memo.Lines.Count * 13, 396); ,其TRichEdit属性包含SelAttributes属性,给出行高。

-Al。

答案 2 :(得分:2)

我已经实现了一个自我增长的TMemo作为LiveBindings的一个很好的例子(我可以在VCL中为LiveBindings提供的几个有用的例子之一)。

引自我的Delphi XE2开发基础课程手册:

“要构建此示例,请将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(发件人,'');

就是这样。编译并运行以查看正在增加的备忘录。

[屏幕快照]

最初,TMemo控件将是两行高(带有内容的行,下一行),每当我们点击输入或自动换行将我们推进到下一行时,TMemo控件的高度会增加(增长)实际上,请确保在表单上留出足够的空间让TMemo自行扩展。“

Groetjes,Bob Swart

答案 3 :(得分: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;

答案 4 :(得分:0)

为什么不呢:

Memo1.Height := Memo1.ContentBounds.Height + 5;