2009-04-13 3 views
10

ときどき、私のDelphiアプリケーションでモーダルウィンドウを開くと表示されるまでに時間がかかりますが、アプリケーションがブロックされていることがわかりました。モーダルフォームはShowModalで開いていましたが、表示されず、モーダルウィンドウが最初のレイヤーにあるかのようにアプリケーションがロックされました。Windows Vistaで新しく作成されたモーダルウィンドウがフォーカスを失って機能しなくなる

通常、このような場合、Alt + TabまたはWindows + Tabを使用して非表示のモーダルウィンドウを検索する必要がありますが、これは毎回機能しません。

この動作はVistaで発生しますが、非常に面倒です。

この「焦点の奇妙さ」が起きないようにする方法はありますか?

ありがとうございました。

* EDIT *

どうやらApplication.MainFormOnTaskbarを設定:= Trueの場合、問題を解決したが、これはランダムに起こるので、まだ結論にジャンプするのは時期尚早です。

は* EDIT 2 *

ModalFormOnTaskbarは、問題が解決しなかった後、私はPopupMode = pmAutoを設定しようとしたが、それはただ、最悪の問題を作りました。

今、私はPopupParentを明示的に設定しようとしており、問題が解決した場合に通知します。

答えて

7

PopupParentプロパティを見てください。 ShowModal呼び出しの前にモーダルフォームに明示的に設定することができます。 PopupParentがnil(デフォルト)の場合、VCLは関連するPopupModeプロパティの値によって多少動作が異なります。

モーダルフォームのPopupParentを、ShowModalを呼び出す直前にアクティブなフォームに設定すると、それが役立つ可能性があります。

+0

ShowModalを呼び出す前にアクティブだったフォームがない場合はどうなりますか? – ertx

7

Windows XPでのゴーストウィンドウのコンセプトが導入されたときに問題が発生しました。 Delphiが使用する珍しいアーキテクチャ(すべてのフォームは隠しウィンドウの子です) - TApplication)多くのDelphiアプリケーションで同じ問題が発生します。アプリケーションを初期化するときにすぐにそれを解決するために

一つの方法は、disable window ghostingにある:

var 
    User32: HMODULE; 
    DisableProcessWindowsGhosting: TProcedure; 
begin 
    User32 := GetModuleHandle('USER32'); 
    if User32 <> 0 then 
    begin 
    DisableProcessWindowsGhosting := GetProcAddress(User32, 'DisableProcessWindowsGhosting'); 
    if Assigned(DisableProcessWindowsGhosting) then 
     DisableProcessWindowsGhosting; 
    end; 
end; 

別の(骨の折れるけれどもよりエレガントな)可能な解決策はnormalize your Delphi applicationにあります。

3番目のオプションはswitching to Delphi 2006 (Delphi 10.0)です。

あなたが報告している問題以外にも、Delphiのアーキテクチャーには、異なるタスクバーメニューとflashの不可能性が導入されています。

0

あなただけApplication.ModalStarted()を呼び出す前に、TCustomForm.ShowModal()に以下のコードを追加するForms.pasの編集を試してみたいことがあります。

if Assigned(Application) then begin 
    while PeekMessage(msg, Application.Handle, CM_ACTIVATE, CM_DEACTIVATE, PM_REMOVE) do begin 
    TranslateMessage(msg); 
    DispatchMessage(msg); 
    end; 
end; 
2

私は、アプリケーションへの呼び出しを除去することにより、これらの出現箇所の多くを軽減するために管理しています。私が自分のコードで持っているProcessMessagesは、どこでも可能です。

+0

同じ問題があって、これは私のために働いた。ありがとう。 –

1

Alt+P+V(.dpr)デフォルトでは、私は理由を知らないが、Application.MainFormOnTaskbar := False;を置くと問題は解決する。

+2

あなたの答えは、どのように動作するかを説明するために役立つかもしれません。 – oefe

+0

Alt + P + V(.dpr)にはApplication.MainFormOnTaskbar:= Trueがあります。なぜなら、私はApplication.MainFormOnTaskbarを置く:デフォルトでは、私は理由を知らないが、= False;問題は解決された。ごめんなさい。 –

関連する問題