-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. ファイル -> 新規 -> その他 -> Delphi プロジェクト -> MDI アプリケーション
  2. プロジェクトのプロンプトが表示されたら、新しいフォルダーを作成しました
  3. Delphi は、ツールバー、いくつかのツールボタン、メニューなどを備えた新しい MDI 親を示しています。
  4. ツールバーに新しい TComboBox をドロップしました
  5. Object Inspector からコンボボックスに「Item 1」、「Item 2」、「Item 3」を追加
  6. アプリケーションを実行し、コンボボックスのドロップダウン ボタンをクリックしました。
  7. コンボボックスからアイテムを選択しました。期待どおりに動作しました。
  8. コンボボックスから別のアイテムを選択しました。期待どおりに動作しました。

したがって、問題は を に配置することではなくTComboBoxTToolBarコードの他の場所、質問に含まれていない場所に配置する必要があります。

デバッガーを使用し、さまざまな場所にいくつかのブレークポイントを設定し、コール スタック ウィンドウを見て、コード内の現在の場所をどのように取得したかを確認する必要があります。次に、これらの以前の呼び出しのいずれかに新しいブレークポイントを設定し、プロセスを繰り返して、問題の原因となっているポイントに戻るまでそれを続けることができます。

この方法でデバッグをテストしました。FormCreateデフォルトのCHILDWINユニットでイベントを作成Dialogsし、 uses 句に追加し、そのイベントimplementationに への呼び出しを追加しました。そこにブレークポイントを設定してアプリを実行し、ツールバー ボタンをクリックしました。ブレークポイントがトリガーされると、コール スタック ウィンドウは次のようになります (新しい子ウィンドウが作成される原因となった場所を強調表示しました。その下の行も関連しています)。MessageDlg('New child created', mtInformation, [mbOK], 0);FormCreateNew

ここに画像の説明を入力

于 2013-08-30T23:48:32.967 に答える
0

問題は、コンボボックスが新しい mdi 子を作成する Form1.OnActivate イベントを発生させていたことです。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 に答える