« FireMonkey TPopupを使いやすくする | トップページ | FireMonkey小ネタ その2 »

2011年10月14日 (金)

FireMonkey小ネタ5つ(未解決ネタも含む)

1.WinとOSXでMouseUpイベントの引数の値が違う
VCLやWinのFMXだとMouseUpイベントのShiftにはUpしたボタンの情報が含まれませんがOSXでは含まれます。
(例えば左ボタンのUPイベントなのにssLeftがShiftに含まれる)

なので以下のようなコードでMouseUp時に他のマウスボタンが押されていないことを確認する処理があるとWin/OSXで異なった結果になります

  if Shift*[ssLeft,ssMiddle,ssRight] = [] then
    ...

仕方ないので、こう書いて回避

  case Button of
    TMouseButton.mbLeft  : Shift := Shift - [ssLeft];
    TMouseButton.mbRight : Shift := Shift - [ssRight];
    TMouseButton.mbMiddle: Shift := Shift - [ssMiddle] ;
  end;

  if Shift * [ssLeft, ssMiddle, ssRight] = [] then
    ...


2.自作コンポーネントにTBitmap型のプロパティを持たせて、画像をシリアライズしようとすると画像がだんだんと劣化する

どうやらα値が無いBitmapの場合はjpegで格納するようです。

jpegで格納されても全然うれしくないのでTBitmapを派生した次のようなクラスのインスタンスをTBitmap型のプロパティに突っ込んで回避。必ずPNGでシリアライズされるようになります
interface
  TESXBitmap = class(TBitmap)
  protected
    procedure DefineProperties(Filer: TFiler); override;
    procedure ReadBitmap(Stream: TStream);
    procedure WriteBitmap(Stream: TStream);
  end;
  
implementation
{ TESXBitmap }

procedure TESXBitmap.DefineProperties(Filer: TFiler);
begin
  Filer.DefineBinaryProperty('PNG', ReadBitmap, WriteBitmap, Width * Height > 0);
end;

procedure TESXBitmap.ReadBitmap(Stream: TStream);
begin
  LoadFromStream(Stream);
end;

procedure TESXBitmap.WriteBitmap(Stream: TStream);
var
  Filter: TBitmapCodec;
  this : TBitmap;
begin
  filter := DefaultBitmapCodecClass.Create;
  this := self;
  filter.SaveToStream(Stream, this, 'png');
  filter.Free;
end;

3.自作コンポーネント内部で動的に生成したサブコンポーネントもシリアライズされてしまう

内部で生成したサブコンポーネントのParentに自作コンポーネントを指定すると、.fmxにシリアライズされます。シリアライズされる前提で設計すれば問題ないかもしれないですが、interface部に公開したくないワンオフのサブコンポーネントまで シリアライズしようとするので困りもの。

今の所回避方法がわかってないので、デザイン時はサブコンポーネントを生成しないようにして回避してます。
回避方法について情報をお持ちの方、教えてください。

20111015: @onimaro2010さんから情報をいただきました。サブコンポーネントを生成した後に、Storedプロパティをfalseにすれば良いようです。ありがとうございます。


4.非VisualコンポーネントはTComponentから派生しないと、TDataModuleに置けない

例えばFireMonkeyアプリでしか使わないからと、TFmxObjectを派生してコンポーネントをつくると、フォームには配置できるのにDataModuleには配置できなくなります。

20111018: @lynatanさんから情報をいただきました。DelphiQ&Aに投稿されていた記事によると、DataModuleのClassGroupプロパティを変更すればようようです。上の例だとFMX.Types.TFmxObjectにすればOK


5.自作コンポーネント用のstyleをパッケージに含ませる方法がわからない
styleファイルをrcdataにしてリソースに含ませるのかなと思いますが方法がわからない。ご存じの方教えてください。

|

« FireMonkey TPopupを使いやすくする | トップページ | FireMonkey小ネタ その2 »

プログラミング」カテゴリの記事

Delphi」カテゴリの記事

FireMonkey/Delphi XE2」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: FireMonkey小ネタ5つ(未解決ネタも含む):

« FireMonkey TPopupを使いやすくする | トップページ | FireMonkey小ネタ その2 »