あなたは、アプリケーションのScreen
オブジェクトのOnActiveFormChange
イベントを使用して、このためのシンプルな(または、あなたは言うかもしれない、単純化)実行時に修正を行うことができます。
それは少なくとも、あなたのメインフォームで使用されてDataModuleのに必要なコードのほとんどを置くために、おそらく最も簡単です。例えば
DataModuleのに次のメソッドを追加:
Uses [...] Forms, DBCtrls;
procedure TdmPopUp.ActiveFormChange(Sender: TObject);
begin
FixUpDBEdits(Screen.ActiveForm);
end;
procedure TdmPopUp.FixUpDBEdits(AForm : TForm);
procedure FixUpDBEdit(ADBEdit : TDBEdit);
begin
if ADBEdit.PopupMenu = Nil then
if ADBEdit.PopupMenu <> AForm.PopupMenu then
ADBEdit.PopupMenu := AForm.PopupMenu
end;
procedure FixUpDBEditsInner(AComponent : TComponent);
var
i : Integer;
begin
if AComponent is TDBEdit then
FixUpDBEdit(TDBEdit(AComponent));
for i := 0 to AComponent.ComponentCount - 1 do
if AComponent.Components[i] is TDBEdit then
FixUpDBEdit(TDBEdit(AComponent.Components[i]));
end;
begin
FixUpDBEditsInner(AForm);
end;
次に、あなたが必要とするすべての追加のコードは、あなたのメインフォームのOnCreateイベントおよびOnDestroyに行くことができます:明らかに
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveFormChange := Nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveFormChange := dmPopUp.ActiveFormChange;
end;
「ハード「作業」は、データモジュール内のFixUpDBEdit
サブプロシージャで実行されます。私のバージョンは、単にDBEDITのPopUpMenu
は、それがすでに囲む形のPopUpMenu
に設定されていないこと、(場合には、それが明示的に何かに設定されている)nilでないことを確認してから、フォームのに割り当てます。これはソークテストされていないし、いくつかの苦難が必要かもしれないが、うまくいけばあなたが行く必要があります。
はい、この動作の変更は、痛みのビットである可能性があります。あなたが持っているフォームの数を考えれば、ある種の実行時修正や.DFMファイルの(半)自動更新を含む解決策を探していますか?個人的には、GDFの 'Grep Results'ユーティリティのReplace機能のようなものを使って.DFMを変更する方法を見ていきたいと思います。 – MartynA
確かに。時間は本質です。 PopupプロパティとOnContextPopupイベントドキュメントには、ポップアップメニューの自動または明示的なプレゼンテーションを処理するオプションのさまざまな組み合わせが用意されていますが、Windowsのポップアップメニュー(オペレーティングシステムによって異なります)を表示するデフォルトの動作については言及していません。 –
私は「教育」し、ユーザーが選択し、フィールドと、彼らはその後、元のウィンドウのポップアップを防ぐために、フィールドの外側をクリックしてくださいする必要がありますするつもりだと思い、この動作を抑制するためのIDEのプロジェクト\アプリケーションレベルのオプションを見つけることができない限り、親コントロールポップアップ(現在選択されているフィールドのオプションを含むように設計されています)の代わりに表示されます。 –