こんばんは。
私は現在Firemonkey FM2
(delphi) で Twitter と Facebook 用のソーシャル ネットワーキング クライアントを設計していますが、イライラする問題が発生しています。現時点では、Twitter のコードしか処理していませんが、問題はビジュアル オブジェクトの [再] 描画に関連しています。
、、などの複数の子コンポーネントで構成されるスタイルブックで、カスタム スタイルのTListboxItem
レイアウトを作成しました。Twitter への接続とフィードの詳細の取得については既に説明しました。取得した各アイテムは に追加され、カスタム ListboxItem スタイル レイアウトを使用してスタイル設定されます。TText
TButton
TImage
TListbox
現在、この問題は、表示されていないリスト内のアイテムの情報を更新することに関連しています。たとえば、スクロールせずにリストに表示される項目は、その情報を正しく表示します。リストの最後のアイテム以外に表示されないものには、設定されていない/表示されていない詳細がいくつかあります。リストを下にスクロールしてから元に戻すと、最初に表示されていた項目の 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 で変更されたことは理解していますが、エンバカデロがこのようなことを見落としていなかったことは確かです。スタイルブック リソースを使用する代わりに、実行時に親内に各アイテムを作成する (したがって、アライメントなどを処理する) ことは期待されていませんよね?
任意の支援や洞察をいただければ幸いです。