Delphi 10.3 + WinRT APIで ブログのRSSフィードを取得するプログラムを作ってみた。
WinRTでRSSを取得するにはSyndicationClientクラスからRetrieveFeedAsyncメソッドをコールすればいいだけなので、C#などで実装すると3行で済むのですが、Delphiで実装する場合WinRTの戻り値をIInterface継承のインターフェイスで受けるので3行ということでは済みそうにないです。然し、Delphi 10.3はWinRT APIの一部は揃っていますので不自由はありません。
SyndicationClientのクラスを使うにはTSyndication_SyndicationClientがWinapi.WebRT.pasに存在します。それでインスタンスを作ります。其の場合、変数はSyndication_ISyndicationClientというインターフェイスである必要があります。これはDelphiでWinRT使う場合このパターンが殆どです。Syndication_ISyndicationClient.RetrieveFeedAsyncにURLを渡すのですがこれもIUriRuntimeClassを作成する必要がありDelphiのStringでは渡せません。Delphi StringからHSTRINGへ変換してからURLを作成します。
procedure TForm1.kansu; begin end; procedure TForm1.Button1Click(Sender: TObject); var SyndicationClient: Syndication_ISyndicationClient; UrlStr: TWindowsString; hs1 : HSTRING; Url: IUriRuntimeClass; syndicationFeed: IAsyncOperationWithProgress_2__Syndication_ISyndicationFeed__Syndication_RetrievalProgress; begin UrlStr := TWindowsString.Create('http://rssblog.ameba.jp/mojeld/rss20.xml'); hs1 := UrlStr; SyndicationClient := TSyndication_SyndicationClient.Create; Url := TUri.CreateUri(hs1); syndicationFeed := SyndicationClient.RetrieveFeedAsync(Url); Await(syndicationFeed, kansu); //第2引数はnilでもOK?かな? OutputDebugString( PChar(TWindowsString.HStringToString( syndicationFeed.GetResults.Title.Text)) );
//上記OutputDebugStringは、RSSのタイトル部の文字列です。 for var i:Integer := 0 to syndicationFeed.GetResults.Items.Size-1 do begin OutputDebugString( PChar( TWindowsString.HStringToString(syndicationFeed.GetResults.Items.GetAt(i).Title.Text) )); //ここでRSSのタイトル一覧を出力しています。 end;
WinAPI.WinRT.Utils.pasには、Await()という関数もあるので使うと便利です。
コメント