在表单设计器中编辑TLabel的标题时,它会为您调整TLabel的大小。有没有办法在运行时让TMemo做到这一点?
我希望能够获取TMemo,为其.lines.text属性分配一些东西,然后告诉它自己调整大小并且不超过一定的宽度,尽管它可以达到它想要的高度。有谁知道怎么做?
答案 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;