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のプロパティを true に設定しTMemo、テキストをそこにダンプし、行数を数え、高さを行数と行の高さの積に設定しますが、行の高さを知る必要があります。

は行の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); 

実行時にオブジェクトから行の高さを絶対に抽出する必要がある場合は、Someone's answerを使用できます。または、行の高さを指定するプロパティを含むプロパティをTRichEdit持つを使用できます。SelAttributesHeight

-アル。

于 2009-06-01T18:44:51.530 に答える
3

LiveBinding の良い例として、自己成長する TMemo を実装しました (VCL の LiveBinding で思いつく数少ない有用な例の 1 つです)。

私の Delphi XE2 Development Essentials コースウェア マニュアルからの引用:

「この例を作成するには、VCL フォームに TMemo コンポーネントを配置し、LiveBindings プロパティを開き、[新しい LiveBinding] オプションを選択します。TBindExpression を選択します。オブジェクト インスペクタで BindExpressionMemo11 を開き、SourceComponent を Memo1 に、SourceExpression を Lines に設定します。 Count * 22. 実行時により良い結果を得るには、SourceExpression をより正確な式に設定します。

Font.Size - 4 + (Lines.Count + 1) * -1 * (Font.Height - 3)

最後に、TMemo の OnChange イベント ハンドラで、次の 1 行のコードを記述します。

BindingsList1.Notify(送信者, '');

それでおしまい。コンパイルして実行し、成長するメモの動作を確認します。

[スクリーンショット]

最初、TMemo コントロールの高さは 2 行 (コンテンツのある行と次の行) で、Enter キーを押すかワード ラップで次の行に進むたびに、TMemo コントロールの高さが伸びます (実際には下に伸びます)。そのため、TMemo が拡張するのに十分なスペースをフォームに残してください)。」

グローチェス、ボブ・スワート

于 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 に答える