長年にわたり、Fire-Monkey(FMX)フレームワークには多くの変更が加えられ、当初から非常に生で信頼性の低いものであった場合、はるかに安定した信頼性の高いプラットフォームになりました。
このメモは、このフレームワークを使用する開発者にとって役立ついくつかのヒントのコレクションです。
コミュニティに投稿が好意的に受け取られた場合、この形式でFMXに関するメモを定期的に発行します。
テキストサイズの計算
テキストサイズに関する質問は非常に一般的です。次の関数を使用してテキストサイズを計算できます。
function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF;
この関数は、単一行テキストが占める長方形のサイズを計算するためのものです。
パラメータ:- テキスト-テキスト
- Font-テキストが表示されるフォント。
- サイズ-0の場合、Font.SizeがFontから使用され、それ以外の場合はこのパラメーターから使用されます
ソースコード: uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.Text := Text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.Free; end; end;
指定された長方形に内接するテキストの最大可能フォントサイズ
function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer;
この関数は、指定された長方形に内接するテキストの最大可能フォントサイズを返します。
パラメータ:- テキスト-テキスト
- Font-テキストが表示されるフォント。
- 幅、高さ-長方形の幅と高さ
- MaxFontSize-可能な最大フォントサイズ
ソースコード: uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; const cMaxFontSize = 512; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; var Size, Max, Min, MaxIterations: Integer; Current: TSizeF; begin Max := Trunc(MaxFontSize); Min := 0; MaxIterations := 20; repeat Size := (Max + Min) div 2; Current := CalcTextSize(Text, Font, Size); if ((Abs(Width - Current.Width) < 1) and (Width >= Current.Width)) and ((Abs(Height - Current.Height) < 1) and (Height >= Current.Height)) then break else if (Width < Current.Width) or (Height < Current.Height) then Max := Size else Min := Size; Dec(MaxIterations); until MaxIterations = 0; Result := Size; end;
FindStyleResourceの問題点と対処方法
よくある質問:私が出会った「bagofich」について説明します。
TStyledControlから継承するコンポーネント(または
TStyledControlから継承する他のコンポーネント)を記述すると仮定します。それらは通常、
FindStyleResource( 'ResourceName')を使用してスタイル要素にアクセスします(
FindStyleResource <Class>( 'ResourceName'変数) )、たとえば、
TImageControlコンポーネントは次のような
Imageオブジェクトを受け取ります:
procedure TImageControl.ApplyStyle; begin inherited; if FindStyleResource<TImage>('image', FImage) then UpdateImage; end;
FindStyleResourceは、
問題のオブジェクトが
TStyledControls (およびその子孫)以外にある
限り正常に機能します。つまり、
FindStyleResourceは
TRectangleにあるオブジェクトを正常に検出できますが、
TPanelにはありません。
例:ApplyStyleプロシージャのコード:
procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; if FindStyleResource<TControl>('selection', T) then ShowMessage('"selection" founded!'); end;
このコードは何をしますか? -スタイルオブジェクトが見つかると、対応するメッセージが表示されます。
スタイルを考慮してください:オプション
Aでわかるように、
「選択」は
TStyledControl の継承者ではあり
ません 。 プログラムを実行することにより、
FindStyleResource <TControl>( 'selection'、T)が
Selectionオブジェクトを確実に見つけることができます。
オプション
Bでは、起動時に
FindStyleResource <TControl>( 'selection'、T)が
Selectionオブジェクトを見つけられないことに驚くかもしれません!
なぜそうソースコードから判断すると、埋め込まれた
TStyledControlsの検索
は特別に壊れているため、さらにグリッチや問題が発生することはありません(ただし、この問題を詳細に調査しませんでした。 )
どうすれば問題を回避できますか?FindStyleResourceとは異なり、いくつかの反復を通じて
EsFindStyleResource関数が記述され、目的のスタイルオブジェクトを検索します。
function EsFindStyleResource(Self: TStyledControl; StyleName: string): TFmxObject;
パラメータ:- 自己-TStyledControl
- StyleName-検索されたオブジェクトの名前
ソースコード: type TOpenStyledControl = class(TStyledControl); function EsFindStyleResource(Self: TStyledControl; StyleName: string): TFmxObject; var StyleObject: TFmxObject; begin
TTrackBarでのリスク(ティック)
Fire-Monkeyでは 、
TTrackBarコンポーネントに
は 「リスク」を描画する機能が組み込まれて
いませんが、この機能が必要な場合があり
ます。DrawTicks関数を使用
すると、この機能を
FMXに「戻す」ことができ
ます 。
この関数は、
TTrackBarコンポーネントの
OnPaintingハンドラで
呼び出す必要があります。
関数の結果: procedure DrawTicks(Control: TTrackBar; Offset: Single; PageSize: Single; DrawBounds: Boolean; LineKind: TLineKind; LineWidth, LineSpace: Single; Color: TAlphaColor);
パラメータ:- コントロール-リスクを引き出すTTrackBar
- オフセット-オフセット
- PageSize-リスクの間隔
- DrawBounds-境界リスクを描画するかしないか
- LineKind-線の種類(TLineKind =(上、下、左、右、両方))
- LineWidth-ラインの長さ
- LineSpace-コンポーネントの中心から行の先頭までの距離
- 色-線の色
ソースコード: type TLineKind = (Up, Down, Left, Right, Both); procedure DrawTicks(Control: TTrackBar; Offset: Single; PageSize: Single; DrawBounds: Boolean; LineKind: TLineKind; LineWidth, LineSpace: Single; Color: TAlphaColor); var Obj: TFmxObject; Cnt: TControl; L: TPointF; Coord, RealCoord: Single; function GetCoord(Value: Single): Single; begin if Control.Orientation = TOrientation.Horizontal then Result := Ceil(THTrackBar(Control).GetThumbRect(Value).CenterPoint.X)
この記事がお役に立てば幸いです。
投票することを忘れないでください:)