2009-06-01 8 views
11

フォームデザイナーでTLabelのキャプションを編集すると、TLabelのサイズが変更されます。 TMemoに実行時にそれをさせる方法はありますか?TMemoサイズ自体に含まれるテキストを作成することはできますか?

私はTMemoを使って、.lines.textプロパティに何かを割り当ててから、自分のサイズを変更し、特定の幅を超えないようにしたいと思っています。 。誰でもそのことを知っていますか?

答えて

6

、行を数え、それにあなたのテキストをダンプし、行数と行の高さの製品に高さを設定しますが、行を知っている必要があります高さ。

TMemoは、行の高さプロパティを公開しませんが、実行時にフォントやフォントサイズを変更しない場合は、設計時に実験的に行の高さを決定できます。

ここでは、高さを13ピクセルに設定したTMemoの高さを設定するために使用したコードを示します。私はまた、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プロパティが含まれ、行の高さを指定します。

-A1。

+0

私はそれを考えていたはずです。私はあまりにもCRLFで改行を行うTStringListsを使って作業するのに慣れているので、WordWrapプロパティは実際には異なる.Lines文字列に折り返し線を置くことはなかった。ありがとう! –

+0

Font.Heightは、テキスト行のピクセル数をカウントする負の数を保持します。また、Canvas.TextExtentを呼び出して、テキストの高さを計算することもできます。 –

7

これは私のためにうまく動作します。追加された定数(8)は、ボーダーやベベルを使用しているかどうかによって異なる場合があります。 trueにTMemoWordWrapプロパティを設定し

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; 
+0

良い答え。私はそれがより簡単だったので、もう一つを選んだが、これはかなりうまくいく。あなたは+8について心配する必要はありません。 ClientHeightを割り当てて、システムに境界線を処理させることができます。 –

+0

私はこれが古いと知っていますが、私は@MasonWheelerの提案を試みましたが、それは正しく機能しませんでした。私は、ClientHeightにはメモが持つ内部の埋め込みが含まれているためだと思います。 ClientHeightを設定しても、サイズ調整を実際に計算するにはEM_GETRECTを呼び出す必要があります。 – Tony

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; 
2

私はLiveBindingsの良い例(私はVCLでLiveBindingsのために思い付くことができ、いくつかの有用な例の一つ)としての自己成長TMemoオブジェクトを実装しました。

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

「、この例を構築VCLフォームにTMemoオブジェクトのコンポーネントを配置し、LiveBindingsプロパティを開き、選択するには、 『新しいLiveBinding』オプションを選択してくださいTBindExpression選択オブジェクトインスペクタで開くBindExpressionMemo11と、実行時に、より良い結果を得るためにLines.CountにMEMO1とSourceExpressionに* 22 をSourceComponentを設定し、設定しSourceExpressionより正確な表現に

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

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

BindingsList1.Notify(Sender、 '');

これだけです。コンパイルして実行することで、増えつつあるメモを実際に見ることができます。

[スクリーンショット]

最初に、TMemoオブジェクト制御が高い二行(内容に沿って、次の行)になり、いつでも私たちはEnterキーを押すか、ワードラップは、次の行に私たちを進めますTMemoオブジェクトコントロールは、(実際にはダウン成長しているので、TMemoオブジェクト自体を拡大するためのフォームに十分なスペースを残してください)の高さに成長するだろう「

Groetjes、ボブSwart

+0

私はこの答えに本当に興奮しましたが、XE10 Berlinのようにもうオプションではないようです。 – Tony

0

そして、なぜだけでなく:。

Memo1.Height := Memo1.ContentBounds.Height + 5; 
+0

これはfmxではないためです –

関連する問題