2013-07-24 26 views
4

在我的Delphi窗體中,我有一個ImageList和4張圖片。還有一個名爲ComboBox1的組合框和一個名爲Image9的TImage組件。使用組合框加載TImage中的ImageList圖片

我爲我的ComboBox創建了一個onChange,因爲我想要做這樣的事情:如果選擇了ComboBox項目1,然後在我的ImageList中加載圖像1。如果選擇ComboBox項目3(例如),則爲相同的情況,則加載ImageList的圖像3。

我寫的代碼是這樣的:

case ComboBox1.Items[ComboBox1.ItemIndex] of 
0: 
begin 
    ImageList1.GetBitmap(0,Image9.Picture); 
end; 
1: 
begin 
    ImageList1.GetBitmap(1,Image9.Picture); 
end; 
2: 
begin 
    ImageList1.GetBitmap(2,Image9.Picture); 
end; 
3: 
begin 
    ImageList1.GetBitmap(3,Image9.Picture); 
end; 
end; 

有了這個代碼,該IDE(我用Delphi XE4)是給我一個錯誤的case ComboBox1.Items[ComboBox1.ItemIndex] of,因爲它說,有序類型是必需的。我能做什麼?

+1

case ComboBox1.ItemIndex of – Darthman

回答

9

在德爾福工作case statementsOrdinal types

有序類型包括整數,字符,布爾,枚舉和子範圍類型。序數類型定義了一組有序的值,其中除第一個以外的每個值都具有唯一的前導符,除最後一個以外的每個值都具有唯一的後繼符。此外,每個值都有一個規律,它決定了類型的排序。在大多數情況下,如果一個值具有序數N,其前身具有序數n-1和它的後繼者具有序數N + 1

ComboBox.Items是字符串,因此不符合作爲序的要求。

此外,正如您在下面的comment中所述,您不能直接按原樣分配到Image9.Picture;您必須改用Image9.Picture.Bitmap。爲了使TImage正確地更新以反映這種變化,你需要調用它的Invalidate法)

更改case使用ItemIndex,而不是直接:

case ComboBox1.ItemIndex of 
    0: ImageList1.GetBitmap(0,Image9.Picture.Bitmap); 
    1: ImageList1.GetBitmap(1,Image9.Picture.Bitmap); 
end; 
Image9.Invalidate; // Refresh image 

或者只是直接去ImageList

if ComboBox1.ItemIndex <> -1 then 
begin 
    ImageList1.GetBitmap(ComboBox1.ItemIndex, Image9.Picture.Bitmap); 
    Image9.Invalidate; 
end; 
+0

最後的解決方案嚴重減少了代碼量。但不要忘記檢查'ItemIndex'是否爲'-1',也就是說,如果沒有選擇項目。或者將樣式設置爲DropDownList,並在顯示錶單之前設置itemindex,以確保無法選擇「-1」。 – GolezTrol

+0

@GolezTrol:好點。我將編輯添加該檢查,但如果用戶需要從ComboBox中選擇一個,我會希望該樣式已經是DropDownList。 –

+0

對不起,我遲到了。 +1的方式,非常有用和完整的答案:)謝謝! –