1

こんばんは。

私は現在Firemonkey FM2(delphi) で Twitter と Facebook 用のソーシャル ネットワーキング クライアントを設計していますが、イライラする問題が発生しています。現時点では、Twitter のコードしか処理していませんが、問題はビジュアル オブジェクトの [再] 描画に関連しています。

、、などの複数の子コンポーネントで構成されるスタイルブックで、カスタム スタイルのTListboxItemレイアウトを作成しました。Twitter への接続とフィードの詳細の取得については既に説明しました。取得した各アイテムは に追加され、カスタム ListboxItem スタイル レイアウトを使用してスタイル設定されます。TTextTButtonTImageTListbox

現在、この問題は、表示されていないリスト内のアイテムの情報を更新することに関連しています。たとえば、スクロールせずにリストに表示される項目は、その情報を正しく表示します。リストの最後のアイテム以外に表示されないものには、設定されていない/表示されていない詳細がいくつかあります。リストを下にスクロールしてから元に戻すと、最初に表示されていた項目の 1 つが、その情報が欠落していることがよくあります。

これをもう少し説明すると、「ツイート」を投稿した人の写真を表示するために使用される TImage (写真)があります。ツイート自体の内容/テキストを表示するために使用される標準の TText (テキストと呼ばれる)を取得しました。それぞれの機能を実行するために使用される2 つのボタン(Like と Share として知られています)があります。最後に、ツイーターの名前とツイートが投稿された日付を表示するために使用される別の TText (NameDate と呼ばれる) を取得しました。

このコードを使用してオブジェクトを作成し、表示されるデータを変更しています。

 for i := 0 to TwitObj.Statuses.Count-1 do
  begin
    FeedItem := TListBoxItem.Create(LBFeed);
    FeedItem.Parent := LBFeed;
    FeedItem.StyleLookup := 'FeedItem';
    FeedItem.WordWrap := True;
    FeedItem.StyledSettings := [TStyledSetting.ssFamily, TStyledSetting.ssSize, TStyledSetting.ssStyle, TStyledSetting.ssFontColor, TStyledSetting.ssOther];
    NameDate := Feeditem.FindStyleResource('txtnamedate') as TText;
    Photo := FeedItem.FindStyleResource('photo') as TImage;
    Like := FeedItem.FindStyleResource('btnlike') as TButton;
    Share := FeedItem.FindStyleResource('btnshare') as TButton;
    Share.Text := 'Retweet';
    Like.Text := 'Favorite';
    NameDate.Text := Twitobj.Statuses.Items[i].User.Name +
                     '(@'+TwitObj.Statuses.Items[i].User.ScreenName+
                     ') - '+DateTimeToStr(TwitObj.Statuses.Items[i].CreatedAt);
    FeedItem.Text := TwitObj.Statuses.Items[i].Text;

    begin
      if DirectoryExists('imagecache\') = false then CreateDir('imagecache\');
      if FileExists('imagecache\'+TwitObj.Statuses.Items[i].User.ScreenName+'.jpg') = False then
      begin
        try
          rcv := TMemoryStream.Create;
          GtPhoto.URL := TwitObj.Statuses.Items[i].User.ImageURL;
          GtPhoto.RcvdStream := rcv;
          GtPhoto.Get;
          rcv.SaveToFile('imagecache\'+TwitObj.Statuses.Items[i].User.ScreenName+'.jpg');
        finally
          Rcv.Free;
        end;
      end;
    end;
    Photo.Bitmap.LoadFromFile('imagecache\'+TwitObj.Statuses.Items[i].User.ScreenName+'.jpg');

GTPhotoは標準の ICS HTTP クライアント コンポーネントであり、TwitObj は私の Twitter コンポーネントです。写真をストリーミングするのではなく、ディレクトリに保存していることがわかります。これは単にストリームに問題があるかどうかを確認するためのものでしたが、とにかく何らかのキャッシュを使用することをお勧めします。

画像は正しくダウンロードされ、カスタム ListBoxItem レイアウト内の関連する StyleResources の情報は期待どおりに更新されますが、スクロールせずに表示される項目についてのみです。リストを下にスクロールすると、Text各項目の のみが正しく、実行時に設定されたその他のリソースはスタイルブックで設計された方法 (つまり、空白のテキスト、画像など) に戻ります。

ここで何か不足していますか?ビットマップの設計意図がパフォーマンスのために XE3 で変更されたことは理解していますが、エンバカデロがこのようなことを見落としていなかったことは確かです。スタイルブック リソースを使用する代わりに、実行時に親内に各アイテムを作成する (したがって、アライメントなどを処理する) ことは期待されていませんよね?

任意の支援や洞察をいただければ幸いです。

4

1 に答える 1

1

FireMonkey は、いつでもコントロールのスタイルをロードおよびアンロードできます。これは FM1 ではかなり緩いものでしたが、FM2 では、コントロールが表示されていないときにスタイリング要素が削除され、再び表示されるときに再適用されます (主に Mobile Studio の準備でメモリを節約するため)。

ApplyStyle メソッドをオーバーライドする必要があります。その中で、スタイル要素のデータを検索して設定します。これはおそらく、コントロールがスタイルに渡されるものをキャッシュする必要があることを意味します。

また、スタイル要素への参照 (つまり、FindStyleResource から返されるもの) をキャッシュしている場合、これらはスタイルがアンロードされたときに解放され、ポインターが無効になることに注意してください。その場合は、FreeStyle をオーバーライドし、キャッシュした可能性のあるポインターを nil にする必要があります。

于 2013-01-15T20:23:50.690 に答える