1

ここでは VCL コンポーネントの初心者なので、これがばかげた質問である場合はご容赦ください...

フォームにドロップしたときにデフォルトのアイテムを含む TComboBox コンポーネントを作成しようとしています。つまり、フォームにドロップしたときにアイテム リストに月のリストを持つ TMonthComboBox を作成しようとしています。

このようなコンボボックスをフォームにドロップしようとすると、作成中に Items プロパティにアクセスしようとすると、「Control '' has no parent window 」エラーが発生することがわかりました。

ここにコンストラクタ(の一部)があります:

__fastcall TMonthCombo::TMonthCombo(TComponent *Owner):TComboBox(Owner)
{
    this->Style = csDropDownList; // this is okay
    this->Items->Add("January"); // This is causing problem
}

この問題は、構築のこの時点では Items プロパティがまだ利用できないという事実に起因していると考えました。

コンポーネントのソース コード内で、コンポーネントが Items プロパティに値を受け入れる準備ができていることを確認する方法はありますか (つまり、設計時にプロパティ エディタにリスト項目を追加しないでください)。

「実行時にアプリケーション コードにアイテムを追加するだけ」と誰かに言われる前に、この ComboBox が多くの場所で非常に頻繁に使用されることを説明する必要があります。月の選択は、問題を説明するために使用した単純な例にすぎません。 ComboBox に入れたい実際の値はもっと多様で、ほとんどの場合、本質的に動的です。また、さまざまな方法でユーザーの選択に応答する必要があります。

実行時の方法を試しましたが、非常に面倒です。そのため、ComboBox に入力するためだけに複数のバージョンのコードを繰り返し入力しなくても、それ自体を処理できるように、コンポーネントにしています。

助けてくれてありがとう。

編集: manlio のソリューションを試した後、ComboBox は実行時に奇妙な外観になります:ここに画像の説明を入力

ComboBox は、実行時に 2 つのイメージを持ちます。私は何を間違えましたか?

__fastcall TYearCombo::TYearCombo(TComponent* Owner) : TComboBox(Owner), init_items(true)
{

}
//---------------------------------------------------------------------------
void __fastcall TYearCombo::CreateWnd()
{
    unsigned short yr, mn, dy;

    this->Width = 90;
    this->Style = csDropDownList;
    this->DropDownCount = 11;
    TDate d = Today();
    d.DecodeDate(&yr, &mn, &dy);
    year = yr;

    if (init_items)
    {
        init_items = false;
        TComboBox::CreateWnd();
        Items->BeginUpdate();
        for(int i=year-5; i<=year+5; i++)
        {
            Items->Add(IntToStr(i));
        }
        this->ItemIndex = 5;
        Items->EndUpdate();
    }
}
//---------------------------------------------------------------------------
4

1 に答える 1