2013-08-30 3 views
-1

Я пытаюсь установить combobox на панели инструментов в Delphi 2010. Приложение представляет собой текстовый редактор MDI. Если я разместил на панели инструментов комбобокс и запустил приложение, когда я нажму на combobox, он откроет новое дочернее окно и не выпадает для выбора. Я попытался поместить панель инструментов и combobox как в панель управления, так и в кулер, с одинаковыми результатами. Справедливости ради, я не воссоздал панель инструментов, просто переместил ее на другие элементы управления.Delphi- combobox на панели инструментов

Кто-нибудь видел это раньше и как мне обойти его? Я просто попробовал снова с теми же результатами. Вот код для combobox1.

procedure TMainForm.ComboBox1Change(Sender: TObject); 
begin 
    exec_sql(combobox1.Text); 
end; 

На панели инструментов нет щелчка, и ни одна кнопка в настоящее время не открывает нового ребенка.

exec_sql выглядит следующим образом:

procedure TMainForm.exec_sql(MachName:string); 
var 
    sql_str: string; 
    parm_str: string; 
begin 
    mach.Free; 
    parm_str := MachName; 
    sql_str := 'Select * from machines where MACHINE_NAME = :parm_str'; 
    with adoquery1 do 
    begin 
    close; 
    sql.Text := sql_str; 
    with Parameters.ParamByName('parm_str') do 
    begin 
     DataType := ftString; 
     Value := parm_str; 
    end; 
    open; 
    mach := TMachineData.get_record_data(ADOQuery1); 
    end; 
    ShowMessage('Current Machine Is ' + mach.MACHINE_NAME); 
end; 
+0

Нет никакого способа, чтобы стандартный TComboBox на TToolBar открывал новое дочернее окно. Какой у вас код, который обрабатывает клики на ComboBox? Или сам ToolBar? TComboBox не знает о ваших дочерних окнах и никогда не создает «новое дочернее окно». (Я только что подтвердил это в быстром тесте: новое приложение, новый TToolBar, добавило несколько кнопок, добавило combobox, несколько элементов в combobox.items и запустило приложение. Щелчок по выпадающему списку корректно опускает список и позволяет мне выбрать элемент.) –

+0

У меня есть приложение в широком использовании с ванильным комбо в панели инструментов ванили, без проблем. –

+0

Итак, я голосую, чтобы закрыть как вне темы, потому что нет SSCCE. Покажите нам SSCCE, и это реальный вопрос. –

ответ

0

Проблема заключалась в том, что combobox запускает событие Form1.OnActivate, которое создало новый дочерний mdi. OnActivate был установлен в ActionFirstChildExecute. Когда приложение открылось, я создавал нового пустого ребенка. Это имело описанный нежелательный эффект. Я удалил OnActivate и переместил ActionFirstChildExecute в OnShow.Затем приложение и комбобокс работали, как ожидалось. В ActionFirstChildExecute ничего не было, чтобы вызвать поведение, как показано в приведенном ниже коде. Проблема заключалась в том, что нажатие на поле со списком вызывало событие Form1.OnActivate, вызывающее код ниже.

procedure TMainForm.ActionFirstChildExecute(Sender: TObject); 
var 
ChildForm: TMDIChild; 
begin 
Inc (Counter); 
ChildForm := TMDIChild.Create (Self); 
ChildForm.Caption := ('NONAME' + IntToStr(MDIChildCount)); 
ChildForm.Show; 
(ActiveMDIChild as TMDIChild).FormCreate(Application); 
if ParamStr(1) <>'' then open_mru_item(ParamStr(1)); 
end; 
+0

Если вы прочтете объяснение, почему это произошло, вы увидите, что код не имеет к этому никакого отношения. Код показал, что в нем ничего не было, чтобы вызвать поведение. – user2662392

1

Я не могу воспроизвести вашу проблему. Вот шаги, которые я взял, чтобы попытаться сделать так:

  1. File-> New-> Другие-> Delphi работы-> MDI Application
  2. создал новую папку при запросе проекта
  3. Delphi шоу новый MDI родитель, с панелью инструментов, некоторые toolbuttons, меню и т.д.
  4. брошено новый TComboBox на панели инструментов
  5. Добавленный «пункт 1», «2 Item» и «Item 3» в выпадающем списке с помощью Object Inspector
  6. Отклонить приложение и нажать кнопку выпадающего меню o n поле со списком.
  7. Подбирает любые предметы из выпадающего списка; он вел себя так, как ожидалось.
  8. Подборка другого предмета из выпадающего списка. Он вел себя так, как ожидалось.

Таким образом, проблема заключается не в размещении TComboBox на TToolBar, и должна быть в другом месте в коде, в месте, не включенном в вашем вопросе.

Вам нужно будет использовать отладчик, установить некоторые точки останова в разных местах и ​​взглянуть на окно стека вызовов, чтобы узнать, как вы попали туда, где находитесь в коде. Затем вы можете установить новую точку останова в одном из этих предыдущих вызовов, повторить процесс и продолжать делать это до тех пор, пока вы не вернетесь к точке, вызывающей вашу проблему.

Я только что протестировал отладку таким образом. Я создал событие FormCreate в блоке CHILDWIN по умолчанию, добавлен Dialogs в пункт назначения implementation и добавил звонок MessageDlg('New child created', mtInformation, [mbOK], 0); в том, что FormCreate событие. Я установил там точку останова и запустил приложение, а затем нажал кнопку панели инструментов New. Когда контрольная точка была вызвана, окно стека вызовов выглядит следующим образом (я выделил место, что вызвало новое дочернее окно будет создано - линия под ней имеет отношение, а):

enter image description here

+0

Спасибо Кен, ваши советы помогли мне проследить проблему. – user2662392

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