3

何らかの理由で、フォームのデザインの AlwaysOnTop 属性が正しく機能していません。

コンテキストは次のとおりです。開いたときに他のすべてのフォームの上にとどまるフォームを作成しようとしています。簡単ないいえ?また、上司によると、別の理由で Wi​​ndowType を Popup に設定したくありません (理由がわかる場合はお知らせください)。

だから私の質問は、フォームがいつでも一番上になるように何らかの形で制限するパラメーター/セキュリティ機能がどこかにあるのでしょうか?

WinApi の setForegroundWindow でさえ、フォームの hWnd で false を返します。何か案は?

また、Dynamics AX 4.0 で実行しています。

4

3 に答える 3

1

私はずっと前に、lostFocus イベントと setFocus メソッドを使用してこのケースを管理しました。フォームを一番上に表示する適切な方法が見つかりませんでした (端末のロックを避けるために AX がこれを防止していると思います) が、この方法でうまくいきました: フォームがフォーカスを失ったら、フォームにフォーカスを設定します。

古いプロジェクトにあったため、コードはありません。これはPDAプロジェクト用でしたが、ユーザーがAlt + Tabでフォームを変更することを避けることはできないと思います.

これは興味深い点です。最新情報をお寄せください。

編集

Twitter の誰かが、モーダル フォームのかわいい解決策を見つけました。私はそれがあなたのためのトリックを作ると確信しています. フォームの init メソッド:

public void run()
{
    super();
    element.wait(true);
    // Execution will resume at this point, only after
    // the user has closed the form.
} 

ソース: http://gotdax.blogspot.com.es/2013/08/modal-forms-in-dynamics-ax.html

于 2013-03-27T08:52:46.470 に答える
1

フォームにモーダル動作を持たせたい場合はwait、フォーム自体からメソッドを呼び出してください!

public void run()
{
    super();
    this.wait(true);
}

パラメータはtrue、モーダル モードをトリガーします。これは、AX のすべてのバージョンで機能します。

代わりに発信者から を呼び出すこともできますが、ほとんどのwaitフォームはメニュー項目から呼び出されるため、あまり魅力的ではありません。

formRun.init();
formRun.run();
formRun.wait(true);
于 2013-08-09T08:38:21.647 に答える
0

これを解決するために私がしたことは、WinAPI を介してフォームをモーダルにすることでした。以下のコードは、保存されたテキストからのコピーであるため、多少の修正が必要になる場合があります。(AX2009 の時点では機能しない可能性があることにも注意してください。)

void setFormModal(int _thisHWND, boolean _bModal)
{
DLL _winApiDLL;
DLLFunction _EnabledWindow;
DLLFunction _getTop;
DLLFunction _getNext;
DLLFunction _getParent;

void local_enableWHND(int _lHWND)
{
int lnextWnd;

lnextWnd = _getTop.call(_getParent.call(_lHWND));

while (lnextWnd)
{
if (lnextWnd != _lHWND)
_enabledWindow.call(lnextWnd, (!_bModal));

lnextWnd = _getNext.call(lnextWnd, 2);
}
}
;
_winApiDLL = new DLL('user32');
_getNext = new DLLFunction(_winApiDLL, "GetWindow");
_EnabledWindow = new DLLFunction(_winApiDLL, "EnableWindow");
_getTop = new DLLFunction(_winApiDLL, "GetTopWindow");
_getParent = new DLLFunction(_winApiDLL, "GetParent");

_getParent.returns(ExtTypes:: DWORD);
_getParent.arg(ExtTypes:: DWORD);

_EnabledWindow.returns(ExtTypes:: DWORD);
_EnabledWindow.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);

_getTop.returns(ExtTypes:: DWORD);
_getTop.arg(ExtTypes:: DWORD);

_getNext.returns(ExtTypes:: DWORD);
_getNext.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);

local_enableWHND(_thisHWND);

local_enableWHND(_getParent.call(_thisHWND));
}
于 2013-03-29T07:13:34.350 に答える