2016-12-17 6 views
1

は、そのPupupMenuプロパティセットが選択されていないTDBEdit制御し、マウスの右ボタンがあるときデルファイ5(はい、私はそれが非常に古いことを知っている)とDelphi 10.1間の挙動の変化があるように見えますクリックしたDelphi 5では、TDBEditの親コントロールであるPopupMenuが表示されていますが(もちろん、それがあると仮定します)、Delphi 10.1ではWindowsのコンテキストメニューが「元に戻す」、「切り取られます」、「右から左へ読み上げる」など。]。TDBEditのPopupMenuデフォルト動作

は、どのように私はそれが明示的に設定1を持っていない場合、デルファイ10.1 TDBEditコントロールの親コントロールののPopupMenuを使用して取得することができます。移行されるアプリケーションには、数十のTDBEditコントロールを持つフォームがたくさんあり、それぞれのPopupMenuプロパティを明示的に親コントロールのものに設定する必要があります。

+0

はい、この動作の変更は、痛みのビットである可能性があります。あなたが持っているフォームの数を考えれば、ある種の実行時修正や.DFMファイルの(半)自動更新を含む解決策を探していますか?個人的には、GDFの 'Grep Results'ユーティリティのReplace機能のようなものを使って.DFMを変更する方法を見ていきたいと思います。 – MartynA

+0

確かに。時間は本質です。 PopupプロパティとOnContextPopupイベントドキュメントには、ポップアップメニューの自動または明示的なプレゼンテーションを処理するオプションのさまざまな組み合わせが用意されていますが、Windowsのポップアップメニュー(オペレーティングシステムによって異なります)を表示するデフォルトの動作については言及していません。 –

+0

私は「教育」し、ユーザーが選択し、フィールドと、彼らはその後、元のウィンドウのポップアップを防ぐために、フィールドの外側をクリックしてくださいする必要がありますするつもりだと思い、この動作を抑制するためのIDEのプロジェクト\アプリケーションレベルのオプションを見つけることができない限り、親コントロールポップアップ(現在選択されているフィールドのオプションを含むように設計されています)の代わりに表示されます。 –

答えて

3

あなたは、アプリケーションの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でないことを確認してから、フォームのに割り当てます。これはソークテストされていないし、いくつかの苦難が必要かもしれないが、うまくいけばあなたが行く必要があります。

+0

本当にありがとうございます。皮肉なことに、各フォームのPopupMenuがアクティブになると、フォームのコントロール(TDBEditを含む)が調べられ、フォームのPopupMenuに表示されるアイテムに影響するために、現在の状態(たとえば 'content'など)が使用されます。 –

+0

@SLBentall:喜んで助けてください。私は、TDBEditのPopUpMenuがDelphi Seattleにどのように設定されているのかを知ることができず、私の "大槌"の道が行くことができると決定したことを辛抱強く告白しました。 – MartynA

関連する問題