2013-01-15 1 views
1

안녕하세요.FM2 객체 수정 문제

저는 현재 트위터와 페이스 북을위한 소셜 네트워킹 클라이언트를 Firemonkey FM2 (델파이)로 디자인하고 있습니다. 나는 좌절감을 느끼고 있습니다. 현재 트위터 코드 만 처리 중 이었지만이 문제는 시각적 객체의 [재] 그림과 관련되어 있습니다.

가 나는 등 TText, TButtonTImage 여러 하위 구성 요소로 구성된 stylebook에서 사용자 지정 스타일 TListboxItem 레이아웃을 만들었습니다. 이미 트위터에 연결하고 피드 세부 정보를 검색하는 방법을 다루었습니다. 검색된 각 항목은 TListbox에 추가되고 내 사용자 정의 ListboxItem 스타일 레이아웃을 사용하여 스타일이 지정됩니다.

이제는 표시되지 않는 항목의 정보를 업데이트하는 것과 관련이 있습니다. 예를 들어 스크롤하지 않고 목록에 표시되는 항목은 정보를 올바르게 표시합니다. 표시되지 않는 항목은 외에도입니다. 목록의 마지막 항목에는 세부 정보가 설정/표시되지 않습니다. 목록을 아래로 스크롤 한 다음 다시 올리면 원래 있던 항목 중 1 개가 이제는 정보가 누락됩니다.

좀 더 설명하기 위해 TImage (사진이라고도 함)이 있는데 'tweet'을 게시 한 사람의 사진을 보여주는 데 사용됩니다. 표준 TText (텍스트로 알려짐)을 사용하여 트윗 자체의 내용/텍스트를 표시합니다. 두 개의 버튼이 있습니다 (Like 및 Share)이 각각의 기능을 수행하는 데 사용되었습니다. 그런 다음 마침내 다른 TText (NameDate라고도 함)이 트위터의 이름과 트윗이 게시 된 날짜를 표시하는 데 사용되었습니다.

이 코드를 사용하여 개체를 만들고 표시되는 데이터를 수정합니다. TwitObj 내 트위터의 구성 요소입니다 동안

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 클라이언트 구성 요소입니다. 사진을 스트리밍하는 대신 디렉토리에 저장한다는 것을 알 수 있습니다. 이것은 단순히 스트림과 관련된 문제인지 확인하는 것이었지만 어쨌든 어떤 종류의 캐시를 사용하는 것이 좋습니다.

이미지가 올바르게 다운로드되고 사용자 지정 ListBoxItem 레이아웃의 관련 StyleResources에 대한 정보가 예상대로 업데이트되지만 스크롤하지 않고 표시되는 항목에 대해서만 업데이트됩니다. 목록을 아래로 스크롤하면 각 항목의 Text 만 정확하며 런타임에 설정 한 다른 리소스는 스타일북에서 디자인 한 방식 (예 : 빈 텍스트, 이미지 등)으로 돌아갑니다.

여기에 뭔가가 있습니까? 성능 향상을 위해 비트 맵의 ​​디자인 의도가 XE3에서 변경되었음을 이해합니다. 그러나 분명 Embarcadero는 이와 같은 것을 간과하지 않았습니다. 당연히 stylebook 리소스를 사용하는 대신 런타임에 부모 내부에 각 아이템을 생성 할 필요가 없다는 것입니다 (정렬을 처리하는 등).

도움이나 통찰력이 있으면 크게 감사하겠습니다.

답변

1

FireMonkey는 언제든지 컨트롤의 스타일을로드 및 언로드 할 수 있습니다. FM1에서는 다소 느슨하지만 FM2에서는 컨트롤이 보이지 않을 때 스타일 요소가 제거되고 다시 볼 때 다시 적용됩니다 (주로 Mobile Studio를 준비하기 위해 메모리를 절약하기 위해).

당신이해야 할 일은 ApplyStyle 메서드를 재정의하는 것입니다. 그것에서 귀하의 스타일 요소에 데이터를 찾아 설정합니다. 이것은 아마도 컨트롤이 스타일에 전달 될 내용을 캐시해야한다는 것을 의미합니다.

스타일 요소에 대한 참조를 캐싱하는 경우 (즉, FindStyleResource에서 다시 얻은 것) 스타일이 언로드되고 포인터가 유효하지 않을 때 해제됩니다. 그렇다면 FreeStyle을 덮어 쓰고 캐시 한 모든 포인터를 없애야합니다.