2011年05月30日
MDI アプリケーションにおいてアイコン化されたシートウィンドウに対して、setfocus関数を実行するとエラーになってしまいます(戻り値 -1)。
お問合せ内容
MDI アプリケーションにおいてアイコン化されたシートウィンドウに対して、setfocus関数を実行するとエラーになってしまいます(戻り値 -1)。 もともとアイコン化されたシートがアクティブの状態では問題ないが、他のシートウィンドウ②フォーカスがある場合だとアイコン化されたシートにsetfocusしても何も変わりません。 現在は下記の回避方法をとっています。
if IsValid( w_xxx ) then
if w_xxx,WindowState = Minimized! then
w_xxx.WindowState = maximized!
end if
w_xxx.SetFocus()
else
OpenSheet( w_xxx, ...)
end if
setfocus やopensheet 関数の中で「シートがアイコン化されていたら大きさを戻す」という処理がなされていないのでしょうか?
回答
SetFocus 関数および、OpenSheet 関数の実行により、アイコン表示されたシートが元の大きさで表示されない、という動作自体はPowerBuilder の仕様です。 まず、SetFocus 関数については、Winodws API の SetFocus 関数を採用しております。この API の SetFocus 関数自体に、「シートがアイコン化されていたら大きさを戻す」という機能はなく、PowerBuildreでもその処理を別途追加してはおりませんので、アイコン化されたシートは元の大きさには戻りません。また、このAPI の戻り値が、有効なウィンドウハンドルを返した場合にはPowerScript のSetFocus 関数の戻り値は 1(正常) となりますが、アイコン化されたシートに対して、API のSetFocus 関数を実行した場合、戻り値は 0 になりますので、PowerBuilder の SetFocus 関数の戻り値も -1 となります。 次に、OpenSheet 関数の動作については、上記の様にAPI の機能にそのまま拠るところはございません。よって、こちらの動作は、あくまでもPowerBuilderの仕様ということになります。 アイコン化されたシートを元の大きさに戻す機能を果たすAPI もございます。以下に使用例を記します。
外部関数宣言:
Function Boolean OpenIcon(long hwnd) library ""user32.dll""
スクリプト:
if isvalid( w_3 ) then
OpenIcon( Handle( w_xxx ))
Setfocus( Handle( w_xxx ))
else
OpenSheet( w_xxx, parentwindow, 1, original! )
end if
製品:
- PowerBuilder 5.0.02 Enterprise 32bit 長い名前
- OS:WindowsNT4.0
- DBMS:SQL*Net 2.2 32bit