5

私の Delphi フォームには、4 つの画像を含む ImageList があります。と呼ばれる ComboBox とComboBox1と呼ばれる TImage コンポーネントもありImage9ます。

onChange次のようなことをしたいので、ComboBox 用に を作成しました。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 型が必要であると表示されているためです。どうすればよいですか?

4

1 に答える 1

10

caseDelphi のステートメントは、序数型で機能します。

序数型には、整数型、文字型、ブール型、列挙型、部分範囲型があります。序数型は、最初の値を除く各値が一意の先行値を持ち、最後の値を除く各値が一意の後続値を持つ順序付けられた値のセットを定義します。さらに、各値には順序があり、それによって型の順序が決まります。ほとんどの場合、値の順序数が n の場合、その前の値の順序数は n-1 であり、後続の値の順序数は n+1 です。

ComboBox.Items文字列であるため、序数であるという要件を満たしていません。

また、以下のコメント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;
于 2013-07-24T22:11:28.730 に答える