代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

我可以根据它包含的文本调整tmemo的大小吗?

  •  11
  • Mason Wheeler  · 技术社区  · 16 年前

    在表单设计器中编辑tlabel的标题时,它会为您调整tlabel的大小。在运行时,有没有任何方法可以让tmemo做到这一点?

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

    5 回复  |  直到 16 年前
        1
  •  6
  •   Triber A. I. Breveleri    7 年前

    设置 WordWrap 性质 TMemo 若要为true,请将文本转储到其中,计算行数,并将高度设置为行数和行高的乘积,但您需要知道行高。

    这个 到文本框 不公开行高属性,但如果在运行时不更改字体或字体大小,则可以在设计时通过实验确定行高。

    这是我用来设置 到文本框 线条高度为13像素。我还发现我需要一个小常数来解释 到文本框 的上下边框。我将高度限制为30行(396像素),以使其保持在窗体上。

    // Memo.WordWrap = True (at design time)
    Memo.Text := <ANY AMOUNT OF TEXT>;
    Memo.Height := Min(19 + Memo.Lines.Count * 13, 396); 
    

    如果必须在运行时从对象中提取行高,则可以使用 Someone's answer . 或者,你可以使用 TRichEdit ,它有 SelAttributes 包含 Height 提供行高的属性。

    - Al。

        2
  •  7
  •   someone    16 年前

    这对我来说很好。添加的常量(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;
    
        3
  •  2
  •   Bob Swart    13 年前

    我已经实现了一个自我成长的tmemo,它是LiveBindings的一个很好的例子(我可以为VCL中的LiveBindings提供的几个有用的例子之一)。

    我的Delphi XE2开发要点课件手册中的一句话:

    “要构建此示例,请将tmemo组件放在VCL窗体上,打开LiveBindings属性,然后选择__new LiveBinding_选项。选择tbindexpression选项。在对象检查器中打开bindExpressionMemo11,并将sourceComponent设置为Memo1,将sourceExpression设置为Lines.Count*22。 要在运行时获得更好的结果,请将sourceExpression设置为更精确的表达式

    font.size-4+(lines.count+1)*-1*(font.height-3)

    最后,在tmemo的onchange事件处理程序中,编写一行代码:

    bindingList1.notify(发送方“”);

    就是这样。编译并运行以查看不断增长的备忘录。

    [屏幕截图]

    最初,tmemo控件将是两行高(包含内容的行和下一行),每当我们按Enter或换行键时,tmemo控件将向下一行前进,它将在高度上增长(实际上是向下增长,因此请确保在窗体上留有足够的空间,以便tmemo自行扩展)。

    格罗杰斯,鲍勃·斯瓦特

        4
  •  1
  •   Brian Reichle    13 年前
    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;
    
        5
  •  0
  •   Pavel Å těrba Allen    11 年前

    为什么不仅仅是:

    Memo1.Height := Memo1.ContentBounds.Height + 5;
    
    推荐文章