フォームデザイナでTLabelのキャプションを編集すると、TLabelのサイズが変更されます。実行時にTMemoにそれを実行させる方法はありますか?
TMemoを取得し、その.lines.textプロパティに何かを割り当ててから、サイズを変更し、特定の幅を超えないように指示したいと思います。ただし、必要な高さになる可能性があります。誰もがそれを行う方法を知っていますか?
これは私にとってはうまくいきます。追加される定数 (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;
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
持つを使用できます。SelAttributes
Height
-アル。
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 が拡張するのに十分なスペースをフォームに残してください)。」
グローチェス、ボブ・スワート
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;
そして、なぜそれだけではないのですか:
Memo1.Height := Memo1.ContentBounds.Height + 5;