例えば Clipboard を使うには、以下のようなコードになるのですが、
// 現在のクリップボードの内容を Edit1 に表示 var ClipboardService: IFMXClipboardService; begin ClipboardService := IFMXClipboardService(TPlatformServices.Current.GetPlatformService(IFMXClipboardService)); Edit1.Text := ClipboardService.GetClipboard.AsString; end;
// Edit1 の内容をクリップボードに入れる var ClipboardService: IFMXClipboardService; begin ClipboardService := IFMXClipboardService(TPlatformServices.Current.GetPlatformService(IFMXClipboardService)); ClipboardService.SetClipboard(Edit1.Text); end;
コード記述が冗長に感じます…キャストがウザいです。Delphi Haven (http://delphihaven.wordpress.com/2012/09/06/and-the-prize-for-ugliest-api-goes-to/) にある解決方法をユニットにしたのが以下になります。
unit uPlatformService;
interface
uses FMX.Platform;
type TPlatformService = record class function Available<IntfType: IInterface>(out Service: IntfType): Boolean; static; class function Get<IntfType: IInterface>: IntfType; static; end;
implementation
uses System.TypInfo;
class function TPlatformService.Available<IntfType>(out Service: IntfType): Boolean; var Guid: TGUID; begin Guid := PTypeInfo(TypeInfo(IntfType)).TypeData.Guid; Result := TPlatformServices.Current.SupportsPlatformService(Guid, IInterface(Service)); end;
class function TPlatformService.Get<IntfType>: IntfType; var Guid: TGUID; begin Guid := PTypeInfo(TypeInfo(IntfType)).TypeData.Guid; Result := IntfType(TPlatformServices.Current.GetPlatformService(Guid)); end;
end.
先程のコードが簡潔に書けます。
uses ..., uPlatformService;
// 現在のクリップボードの内容を Edit1 に表示 var ClipboardService: IFMXClipboardService; begin ClipboardService := TPlatformService.Get<IFMXClipboardService>; Edit1.Text := ClipboardService.GetClipboard.AsString; end;
// Edit1 の内容をクリップボードに入れる var ClipboardService: IFMXClipboardService; begin ClipboardService := TPlatformService.Get<IFMXClipboardService>; ClipboardService.SetClipboard(Edit1.Text); end;
変数なしで記述してもそこまで見づらく (読みづらく) ありません。
// 現在のクリップボードの内容を Edit1 に表示 Edit1.Text := TPlatformService.Get<IFMXClipboardService>.GetClipboard.AsString;
// Edit1 の内容をクリップボードに入れる TPlatformService.Get<IFMXClipboardService>.SetClipboard(Edit1.Text);
FMX.Platform にあるのは TPlatformServices で、高度なレコード型の方は TPlatformService です。
See Also:
[And the prize for ugliest API goes to… (Delphi Haven)]
http://delphihaven.wordpress.com/2012/09/06/and-the-prize-for-ugliest-api-goes-to/
[uPlatformService.pas]
http://ht-deko.minim.ne.jp/software/uPlatformService.pas
|