工具栏上的Delphi- combobox

时间:2013-08-30 21:49:22

标签: delphi combobox delphi-2010

我正在尝试将组合框放在Delphi 2010的工具栏上。该应用程序是一个MDI文本编辑器。如果我在工具栏上放置一个组合框并运行应用程序,当我单击组合框时,它会打开一个新的子窗口并且不会下拉以进行选择。我已经尝试将工具栏和组合框放在控制栏和冷却栏中,两者都具有相同的结果。公平地说,我没有重新创建工具栏,只是将其移动到其他控件。

之前有没有人见过这个,我该如何解决这个问题? 我刚刚尝试了同样的结果。这是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;

2 个答案:

答案 0 :(得分:1)

我无法重现您的问题。以下是我尝试这样做的步骤:

  1. 文件 - >新建 - >其他 - > Delphi项目 - > MDI应用程序
  2. 提示输入项目时创建了一个新文件夹
  3. Delphi显示一个新的MDI父级,带有工具栏,一些工具按钮,菜单等。
  4. 在工具栏上删除了一个新的TComboBox
  5. 通过Object Inspector将“Item 1”,“Item 2”和“Item 3”添加到组合框中
  6. 跑完应用程序,然后单击组合框上的下拉按钮。
  7. 从组合框中挑选任何物品;它表现得像预期的那样。
  8. 从组合框中挑选了一个不同的项目。它表现得像预期的那样。
  9. 因此,问题不在于TComboBox放置TToolBar,而是必须在代码的其他位置,在您的问题中未包含的位置。

    您需要使用调试器,在不同位置设置一些断点,然后查看调用堆栈窗口,了解您在代码中的位置。然后,您可以在其中一个早期调用中设置新断点,重复此过程,并继续这样做,直到您追溯到导致问题的点为止。

    我刚以这种方式测试调试。我在默认的FormCreate单元中创建了CHILDWIN个事件,将Dialogs添加到了implementation uses子句中,并在{{1}中添加了对MessageDlg('New child created', mtInformation, [mbOK], 0);的调用事件。我在那里设置断点,然后运行应用程序,然后单击FormCreate工具栏按钮。当触发断点时,调用堆栈窗口看起来像这样(我突出显示了导致创建新子窗口的位置 - 它下面的行也是相关的):

    enter image description here

答案 1 :(得分:0)

问题是组合框正在触发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;
相关问题