CComboBoxからすべてのアイテムを削除するには

MFCのサンプルプログラムが間違っている事がよくある。
このサンプルも間違ってはいないけど、サンプルとしてあまり良くない気がする。
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);
ASSERT(pComboBox);
// Delete every other item from the combo box.
for (int i=0;i < pComboBox->GetCount();i++)
{
   pComboBox->DeleteString( i );
}

Delete every other ites from the combo box.
直訳すると、1つ置きにアイテムを削除する。

となるけど、未だかつて、コンボボックスのアイテムを1つ置きに消したいことなど無かった。
消すとしたら、指定したアイテムまたは、すべてのアイテムを消すことが多い。
ComboBoxに関しては、すべてのアイテムを1発で消すことができる便利関数が用意されていない。
なので、このサンプルは、すべてのアイテムを削除するサンプルである方が、サンプルとしては有用の気がする。

そこで、コンボボックスの内容をすべて削除するサンプルを作ってみた。
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);
ASSERT(pComboBox);
if(pComboBox->GetCount())
{
    while(pComboBox->DeleteString(0));
}


DeleteString() は、インデックスに無効な数値を指定すると、CB_ERR = -1 という数値を返してしまうので、
while(pComboBox->DeleteString(0));
とやってしまうと、何も入っていないコンボボックスに対して、実行した場合に while の無限ループに陥ってしまう。
このサンプルの場合は、最初にアイテムがあるかどうか確認してから、DeleteString()を実行しているので、空のComboBoxに対しては処理しないようにしている。

にしても、.NET になってもう2年も経つけど、MFCから抜け出せるのはいつになる事やら。。。
(MFCも新しくなっているんですけどね ^^;)

あと、消したいアイテムのインデックスが複数ある場合は、後ろから消さないと、インデックスがずれて、別のアイテムを消してしまうので注意!

MSDNのCComboBox::DeleteString()
[PR]
by isoq | 2005-10-05 12:28 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< Visual Studio.N... SCSI機器のプラグアンドプレイ >>