在我的Delphi表单中,我有一个包含4张图片的ImageList。还有一个名为ComboBox1
的ComboBox和一个名为Image9
的TImage组件。
我为我的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
上给出了一个错误,因为它表示需要Ordinal类型。我该怎么办?
答案 0 :(得分:9)
case
statements处理Ordinal 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;