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

Mas*_*ler 11 delphi tmemo

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

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

小智 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;
Run Code Online (Sandbox Code Playgroud)


小智 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); 
Run Code Online (Sandbox Code Playgroud)

如果绝对必须在运行时从对象中提取行高,那么您可以使用Someone的答案.或者,您可以使用TRichEdit,其SelAttributes属性包含Height提供行高的属性.

-Al.