フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: TPlatformServices と TPlatformService (XE3 以降)
DEKO
管理者
投稿数: 2691
TPlatformServices と TPlatformService (XE3 以降)
on: 2013/04/15 06:19 Mon

例えば 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

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.021 sec.