2013-01-15 56 views
1

晚上好。FM2對象重新打印問題

我目前正在爲Firemonkey FM2(delphi)中的Twitter和Facebook設計一個社交網絡客戶端,我正在經歷一個令人沮喪的問題。目前,我只有Twitter代碼正在處理中,但問題與[重新]繪製可視對象有關。

我創建一個自定義風格的TListboxItem佈局的範本:由多個子組件,如TTextTButtonTImage的。我已經處理了連接到Twitter和檢索提要的詳細信息。檢索到的每個項目都被添加到TListbox,並使用我自定義的ListboxItem樣式佈局進行樣式設置。

現在,問題與更新列表中不可見項目的信息有關。例如,沒有滾動的列表中可見的項目正確顯示其信息。那些不可見的除了列表中的最後一項沒有設置/可見它們的一些細節。當我向下滾動列表,然後再進行備份時,通常會有一個最初可見的項目會丟失它的信息。

爲了解釋這一點,我有一個TImage (被稱爲照片)這是用來顯示發佈'推文'的人的照片。我有用於顯示推文本身的內容/文本的標準文本文件(稱爲文本)。我有兩個按鈕(稱爲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的Bitmaps設計意圖發生了變化,但是Embarcadero肯定不會忽略這樣的事情。當然,我們不希望我們在運行時在父項內創建每個項目(並因此處理對齊等)而不是使用樣式表資源,是嗎?

任何幫助或見解將不勝感激。

回答

1

FireMonkey可以隨時加載和卸載控件的樣式。它在FM1中相當鬆懈,但在FM2下,當控件不可見時,樣式元素將被刪除,並且當它再次變爲可見時(爲了節省內存,主要是爲了準備Mobile Studio),將重新應用樣式元素。

你需要做的是重寫ApplyStyle方法。在它中查找和設置你的風格元素的數據。這可能意味着您的控件需要緩存將傳遞給樣式的內容。

另請注意,如果您要緩存對樣式元素的引用(即您從FindStyleResource返回的內容),那麼當樣式被卸載並且指針無效時,這些元素將被釋放。如果是這樣,你需要重寫FreeStyle,並且你可能沒有緩存任何指針。