2017-11-26 45 views
2

固定幅で動的に作成されたチェックボックスとラジオボタン(FMXではVCLではない)を使用して、含まれるテキストに基づいて高さを変更します。 マイチェックボックスとラジオボタンでワードラップが有効になっています。 AutoSizeとWordWrapを有効にすると、TLabelのようなものを得たいと思っています。Delphi FMX TCheckbox/TRadiobuttonオートサイズ

は、私はすでにこれに近づくことができた:

procedure TFMenu.Button1Click(Sender: TObject); 
var 
    ctr: Integer; 
    hostingComponent: TComponent; 
begin 
    hostingComponent := Form1; { in my case a Frame or Panel or sth. } 
    for ctr := 0 to pred(hostingComponent.ComponentCount) do 
    begin 
    if hostingComponent.Components[ctr] is TRadioButton { or TCheckBox } then 
    begin 
     with (hostingComponent.Components[ctr] as TRadioButton) do 
     begin 
     Height := 0; { if text or text Width changes this is useful } 
     while (Height) * (Width - 32) 
     <= 
     (Canvas.TextHeight(Text) * 1.25) * Canvas.TextWidth(Text) do 
     begin 
      Height := Height + 1; 
     end; 
     end; 
    end; 
    end; 
end; 

これは、20と150文字の間でテキストの許容よう何かを作品しかし、私は、これは非常に間違っている知っていると私にはわかりません私がここで紛失しているもの Canvas.TextHeight1.25を掛け合わせると、上記の長さのテキストが見えるようになりましたが、理由はわかりません。 Width - 32は、チェックボックス/ラジオボタンの画像のサイズのためです。これは処理したいテキストではありません。だから私の質問は含むテキストに基づいて、それらのコンポーネントのHeigthを変更する方法ある

(私は32が正しいだろう、それは現実には異なる可能性が推測しました)。

また、コードを期待どおりに変更するにはどうすればよいですか。その背後にある数学(推測値1.25の乗算を除く)は正しいはずですが、チェックボックス/ラジオボタンの領域がテキストを完全には含みませんが、テキストとしていくらか空き領域があるため、私が使用する領域は間違っているようですブロックではなく単に左ぶれですが、これが重要かどうか、それをどのように処理するかはわかりません。

答えて

3

Canvas.MeasureText()メソッドを使用してテキストを測定し、TRadioButtonのサイズを設定できます。例えば

procedure TForm22.Button1Click(Sender: TObject); 
var 
    r: TRectF; 
begin 
    rb1:= TRadioButton.Create(self); 
    rb1.Parent := self; 
    rb1.Position.X := 100; 
    rb1.Position.Y := 8; 
    rb1.Size.Height := 17; 
    rb1.Size.Width := 260; 

    rb1.StyledSettings := []; 
    rb1.TextSettings.Font.Size := 18; 
    rb1.TextSettings.WordWrap := True; 
    rb1.Canvas.Font.Size := rb1.TextSettings.Font.Size; 

    r := RectF(0, 0, rb1.Size.Width-24, 10000); 
    rb1.Canvas.MeasureText(r, s, True, [], TTextAlign.Leading, TTextAlign.Leading); 

    rb1.Size.Height := r.Bottom; 
    rb1.Text := s; 
end; 

ARect(VAR)パラメータは、テキストの境界の矩形を指定します。この関数は、(可能であれば)矩形内のテキストにフィットします。幅の制限を指定しても十分な高さを指定することによって、関数は幅に従い、必要な高さを返します(返されるTRectFで変更されます)。

私の例では、実際のラジオボタンを補うために、TRadioButtonの幅から24を引いた。デフォルトのスタイルデータは21で十分であることを示していますが、計算の安全面に3を追加しました。他のスタイルでは、この数字は異なる場合があります。 TRadioButton/TCheckBoxのスタイルデータのtextメンバのPosition.Xプロパティを参照してください。

私のコード例に見られるように、使用した1.25要素で何か調整する必要はありませんでした。私のシステムは100%DPIです。もしあなたが125%であれば、あなたが経験したことを説明することができます。それでも問題が解決しない場合は、プログラムが実行されているシステムを確認し、必要に応じて修正する必要があります。

最後に幅= 260、幅= 400の2つのラジオボタンを含むフォームの画像。

enter image description here

+0

ありがとうございました。これは私のために働く。興味のある方:元のRadioButtonイメージの幅が24であることをどうでしたか? 私のDPIは100%です。私はHeigthが低すぎると1であったのを見て、要因1.25は推測数でした。Heigthはより多くのテキストが含まれていましたが、大きなテキストの場合、ラジオボタンはテキストのサイズを大きくし、テキストのサイズはたった3文字のラジオボタンを使用していましたほんの数ピクセルでした。しかし、あなたの解決策が私の問題を首尾よく解決したので、その情報は関係ありません。 – qGold

+0

あなたは大歓迎です。 *あなたはどのように知っていましたか?* TRadioButton/TCheckBoxのスタイルデータで見ることができます。テキストメンバーの 'Position.X'プロパティは21です。計算の安全面に3を追加しました。使用したスタイルがデフォルトと異なる場合は、これらの尺度が異なる可能性があるので、私はその答えを編集したことをあなたの質問は思い出しました。 –

+0

よろしくお願いいたします。私があなたが幅を見つけたかどうかについて尋ねた理由は、私のアプリが異なるプラットホームで動くということでした。ユーザーはいくつかの設定を有効にしてサイズを多少変えることができるので、実行時にこれを理想的に取得する必要があります。あなたの答えはこれをカバーしているようです。私はいくつかの誤動作が発生した場合、私はあなたに知らせるでしょう。 – qGold

関連する問題