2012-03-07 3 views
0

У меня есть TTntComboBox, и я устанавливаю itemindex в положительное значение, прежде чем показывать модальное диалоговое окно (к которому принадлежит комбинированное поле), но в первый раз в поле со списком отображается пустой элемент.TTntComboBox blank first row

Если я закрою диалог и снова открою его, он отобразит нужный элемент.

Элементindex не первый, прежде чем показывать диалог в первый раз, а стиль combobox - csDropDownList.

Edit->

Ввод в ключевых фрагментов кода В основной функции - форма инициализируется как

 Application->CreateForm(__classid(TChildDialog), &ChildDialog); 

в WinMain

Диалог родитель имеет ListBox и редактировать, добавлять и delete для редактирования, добавления, удаления записей в списке. При нажатии любой из кнопок данные записи отображаются соответствующей формой (я назову ее ChildDialog) . Действие, связанное с кнопкой редактирования выглядит следующим образом (родительская форма)

if (ListBox->ItemIndex >= 0) { 
    TTntListItem *Item = ListBox->Items->Item[ListBox->ItemIndex]; 
    ChildDialog->SetData(Item->Data); 
    if (ChildDialog->ShowModal() == mrOk) { 
     delete Item->Data; 
     TData *NewData = ChildDialog->GenerateData(); 
     PopulateData(Item, NewData); 
    } 
} 


void __fastcall ParentForm::PopulateData(TTntListItem *Item, TData *Data) { 
    Item->Data = Data; 
    Item->SubItems->Clear(); 
    Item->SubItems->Add(functionUsingSomeDatastruct(Data)); 
} 

И SetData из ChildDialog (форма вопроса) - который имеет EditBox, выпадающий выглядит следующим образом

void __fastcall TChildDialog::SetData(TData *Data) 
for (int i = 0; i < someDataStructLength(); i++) { 
    if (!strcmp(someDataStruct(i)->String, Data))  { 
    combobox->ItemIndex = i; 
    break; 
    } 
} 
EditBox->Text = SomeData.String2; 

CTOR из дочерний диалог определяется как

__fastcall ChildDialog::ChildDialog(TComponent* Owner) 
    : TForm(Owner) 
    { 
    combobox->Items->Clear(); 
    for (int i = 0; i < datacount(); i++) { 
     combobox->Items->Add(someDataStruct(i)->Sring); 
    } 
    combobox->ItemIndex = 0; 
    } 
+1

Как вы показываете форму? Вы каждый раз создаете новый экземпляр, или вы повторно используете один и тот же экземпляр? Когда вы устанавливаете индекс позиции? –

+0

Я использую тот же экземпляр. Я показываю форму как «if (Dialog-> ShowModal() == mrOk) {}". Перед отображением диалогового окна я установил индекс элемента в положительное значение. – dips

+0

У вас есть недостаток дизайна в вашем коде, но поскольку у нас нет доступа к нему, мы не можем сказать вам, что это такое. Одна из возможностей заключается в том, что вы устанавливаете индекс элемента * до *, который вы заполняете в списке с элементами. –

ответ

3

Наконец-то нашел ответ. Я использую gettext для локализации.

В FormShow - я звонил TranslateComponent, как

ChildDialog::FormShow() { 
    TranslateComponent(this); 
} 

который был сброс ItemIndex COMBOBOX в.

Теперь переместили его на ctor.

+1

+1 для поиска и публикации ответа здесь даже после всех отрицательных и закрытых голосов. –

+1

+1 по той же причине. –

+0

@ dips, вы можете пометить свой собственный ответ как правильный (нажмите галочку.) Это, вероятно, принесет вам значок или другой тоже :) –

Смежные вопросы