-1

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

有没有人见过这个,我该如何解决?我只是再次尝试了相同的结果。这是组合框1 的代码。

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;
4

2 回答 2

1

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

  1. File->New->Other->Delphi Projects->MDI Application
  2. 提示输入项目时创建了一个新文件夹
  3. Delphi 显示了一个新的 MDI 父级,带有工具栏、一些工具按钮、菜单等。
  4. 在工具栏上放置了一个新的 TComboBox
  5. 通过对象检查器将“项目 1”、“项目 2”和“项目 3”添加到组合框中
  6. 运行应用程序,然后单击组合框上的下拉按钮。
  7. 从组合框中选择任何项目;它的行为符合预期。
  8. 从组合框中选择了不同的项目。它的行为符合预期。

因此,问题不在于将 aTComboBox放在 a 上TToolBar,并且必须在代码中的其他位置,在您的问题中未包含的位置。

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

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

在此处输入图像描述

于 2013-08-30T23:48:32.967 回答
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;
于 2013-08-31T22:52:23.073 回答