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

製品: