2011-08-13 16 views
3

使用するフォントの高さに合わせてTStringGrid行(DefaultRowHeight)のサイズを自動的に変更する方法は? 私はTStringGrid行のサイズを自動的に変更する方法

Grid.DefaultRowHeightのようなもの:= Grid.Canvas.TextHeight( 'X')+ 4。

しかし、動作しません。小さなフォントの場合、行の高さが大きすぎます。


更新:

実際にはプログラムのロジックに問題があるようです。フォントを複数回変更すると、行の現在の高さが前のフォント変更イベントのフォントのサイズと一致します(これは一歩前です)。

私は、フォントのサイズ変更を傍受するために、このコードを使用します。

procedure TStrGrid.CMFontChanged(var Message: TMessage); 
begin 
    inherited; // let TControl react first 
    DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4; 
end; 

手続きがされるかのように動作します

begin 
    DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4; 
    inherited; 
end; 

(最初のように、それは高さを変更し、それが実際に設定します正しいフォントサイズなので、高さは一歩前です)

答えて

5

これは、この注文とは関係ありません。継承されたCMFontChangedメッセージハンドラとDefaultRowHeightプロパティーセッターの呼び出しは無効です。

procedure TStrGrid.CMFontchanged(var Message: TMessage); 
begin 
    Canvas.Font := Font; 
    DefaultRowHeight := Canvas.TextHeight('Ap') + GridLineWidth + 3; 
end; 

説明:

無効化のみフラグウィンドウはウィンドウ(グリッド)を再描画するためにどこかに将来的には、原因はまだ更新されていない現在のフォント設定にあります。それは確かにテキストの高さを取得した後に起こります。別の方法として、新しいテキストの高さの要求の前にRepaintを呼び出すことができますが、その場合は二重の再描画が行われるため、Canvas.Fontを設定します。

2

イベント関連の問題について言えば、最も簡単で簡単な解決策は、PostMessage(ここではCMFontChangedハンドラーから)メッセージを投稿し、投稿されたメッセージを受け取ったときに更新を行うことでした。

これは、内部状態を更新するためにグリッドが行う必要のあることを妨げないという利点があります。

+0

あなたのソリューションに感謝します。 NGLNのハックは余分なペイントを必要としますが、フォントがめったに変更されないので(大したことはないので)大丈夫です。 – Ampere

+0

@Altar私は確かに私の答えを_hack_として記述するつもりはなく、余分なペイントは必要ありません。 – NGLN

+0

@Heinrichあなたの提案は実際にこれらの問題の多くの種類を解決します。しかし、私はちょうどそれをテストし、この状況では動作しません。残念。 – NGLN

関連する問題