2012-01-26 9 views
8

में एक ListBox के लिए एक स्ट्रिंग के अलावा एनिमेट निम्नलिखित कोड अच्छी तरह से एक ListBoxFireMonkey

procedure TForm6.AddItem(s: string); 
var 
    l : TListBoxItem; 
    OldHeight : Single; 
begin 
    l := TListBoxItem.Create(Self); 
    l.Text := s; 
    OldHeight := l.Height; 
    l.Height := 0; 
    l.Parent := ListBox1; 
    l.Opacity := 0; 
    l.AnimateFloat('height', OldHeight, 0.5); 
    l.AnimateFloat('Opacity', 1, 0.5); 
end; 

आइटम फैलता है और में fades के अंत के लिए एक नया स्ट्रिंग जोड़ने एनिमेट। हालांकि मैं करने में सक्षम होना चाहता हूँ स्ट्रिंग को सूची बॉक्स में एक मनमानी स्थान में जोड़ें - वास्तव में वर्तमान आइटम इंडेक्स पर। क्या कोई यह जानता है कि यह कैसे करें?

उत्तर

4

तथ्य हल करने के लिए है कि ListBox1.InsertObject और ListBox1.Items.Insert आप कर सकते हैं काम नहीं करते निम्नलिखित

procedure TForm1.AddItem(s: string); 
var 
    l : TListBoxItem; 
    OldHeight : Single; 
    I: Integer; 
    index : integer; 
begin 
    l := TListBoxItem.Create(nil); 
    l.Text := s; 
    OldHeight := l.Height; 
    l.Height := 0; 
    l.Opacity := 0; 
    l.Index := 0; 
    l.Parent := ListBox1; 

    Index := Max(0, ListBox1.ItemIndex); 
    for I := ListBox1.Count - 1 downto Index + 1 do 
    begin 
    ListBox1.Exchange(ListBox1.ItemByIndex(i), ListBox1.ItemByIndex(i-1)); 
    end; 
    ListBox1.ItemIndex := Index; 
    l.AnimateFloat('height', OldHeight, 0.5); 
    l.AnimateFloat('Opacity', 1, 0.5); 
end; 

लेकिन थोड़ा हास्यास्पद है। यदि कोई आइटम नहीं चुना गया है, तो यह (अंत में) स्थिति 0 में स्ट्रिंग जोड़ता है, अन्यथा इसे चयनित आइटम से पहले जोड़ता है। यह समाधान मुझे Bubble Sort का बहुत अधिक याद दिलाता है। काम करने के लिए अधिकतम फ़ंक्शन के लिए आपको गणित इकाई को अपने उपयोग खंड में जोड़ना होगा।

यह वास्तव में फ़ायरमॉन्की में एक बग प्रतीत होता है (चेक गुणवत्ता केंद्रीय #102122), हालांकि मुझे संदेह है कि भविष्य में फ़ायरमॉन्की अपडेट इसे ठीक करेगा। यदि कोई ऐसा करने का बेहतर तरीका देख सकता है ....

मेरे पास रुचि रखने वालों के लिए made a movie भी है, जो चीजों को और स्पष्ट रूप से दिखाता है।

+0

यह ठीक काम करता है। सूची को शफल करना बहुत तेज़ है जब तक कि आपके पास बहुत बड़ी सूची न हो। –

0

l.Parent := ListBox1; 

उपयोग

ListBox1.InsertObject(Index, l); 

जहां सूचकांक प्रविष्टि स्थिति है के बजाय

(अनचाहे लेकिन स्रोतों को पढ़ने से इसे काम करना चाहिए)।

+1

ListBox1.InsertObject (0, l) काम नहीं करता है और एक प्रवेश उल्लंघन देता है, हालांकि अगर मैं एनीमेशन से संबंधित कोड को हटा देता हूं, तो listbox1.count बढ़ता है लेकिन कुछ भी स्पष्ट रूप से बदलता नहीं है। ListBox1.AddObject (एल) ठीक काम करता है (हालांकि मेरा मूल कोड के समान परिणाम देता है)। – Alister

2

यह काम करना चाहिए, लेकिन यह कुछ नहीं करता है:

l := TListBoxItem.Create(ListBox1); 
ListBox1.InsertObject(Max(ListBox1.ItemIndex, 0), l); 

मैं फिर निम्न कॉल करते हैं, मैं एक पहुँच उल्लंघन मिलती है:

ListBox1.Realign; 

वास्तव में, यहां तक ​​कि यह मेरे लिए एक ए वी देता है:

ListBox1.Items.Insert(0, 'hello'); 
ListBox1.Realign; 

लेकिन यह एक कहते हैं, निश्चित रूप से:

ListBox1.Items.Add('hello'); 

शायद एक बग?

+0

हाँ, मुझे एक ही परिणाम मिल रहा है - मैं सहमत हूं - संभवतः एक बग – Alister

+0

जैसा ऊपर बताया गया है, Listbox.items.Insert वर्तमान में टूटा हुआ है। शायद अद्यतन 4 में ठीक हो? –

संबंधित मुद्दे