FireMonkey小ネタ5つ(未解決ネタも含む)
1.WinとOSXでMouseUpイベントの引数の値が違う
VCLやWinのFMXだとMouseUpイベントのShiftにはUpしたボタンの情報が含まれませんがOSXでは含まれます。
(例えば左ボタンのUPイベントなのにssLeftがShiftに含まれる)
なので以下のようなコードでMouseUp時に他のマウスボタンが押されていないことを確認する処理があるとWin/OSXで異なった結果になります
仕方ないので、こう書いて回避
2.自作コンポーネントにTBitmap型のプロパティを持たせて、画像をシリアライズしようとすると画像がだんだんと劣化する
どうやらα値が無いBitmapの場合はjpegで格納するようです。
jpegで格納されても全然うれしくないのでTBitmapを派生した次のようなクラスのインスタンスをTBitmap型のプロパティに突っ込んで回避。必ずPNGでシリアライズされるようになります
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にしてリソースに含ませるのかなと思いますが方法がわからない。ご存じの方教えてください。
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でのショートカット(Windows)(2011.10.21)
- FireMonkey小ネタ その2(2011.10.15)
- FireMonkey小ネタ5つ(未解決ネタも含む)(2011.10.14)
- FireMonkey TPopupを使いやすくする(2011.10.11)
- FireMonkey/OSX メニューアイテムのショートカット(2011.10.02)
「Delphi」カテゴリの記事
- FireMonkeyでのショートカット(Windows)(2011.10.21)
- FireMonkey小ネタ その2(2011.10.15)
- FireMonkey小ネタ5つ(未解決ネタも含む)(2011.10.14)
- FireMonkey TPopupを使いやすくする(2011.10.11)
- FireMonkey/OSX メニューアイテムのショートカット(2011.10.02)
「FireMonkey/Delphi XE2」カテゴリの記事
- FireMonkeyでのショートカット(Windows)(2011.10.21)
- FireMonkey小ネタ その2(2011.10.15)
- FireMonkey小ネタ5つ(未解決ネタも含む)(2011.10.14)
- FireMonkey TPopupを使いやすくする(2011.10.11)
- FireMonkey/OSX メニューアイテムのショートカット(2011.10.02)
この記事へのコメントは終了しました。
コメント