netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2006-01-22 [長年日記] ▲
_ [VolumeDeskbar] 原因は,無効になるウィンドウハンドルだったらしい ▲
昨日修正した Form.Free → Form.Release だけでは問題は解決せず,結局,引き続きバグ修正作業.色々ログを取りながら調べた結果,実は現状の実装に色々問題があったことが判明した.
原因その1は,フローティング状態などの Deskband を閉じた後で,再び Deskband を表示したとき,新たに生成した TMixer が内部的に生成するコールバック用ウィンドウハンドルがなぜか無効になってしまい,処理に失敗していた.こちらの原因は不明だが,Deskband に表示しているウィンドウのハンドルを使うようにしたらエラーは起きなくなった.
また,TPopupMenu のコンストラクタでは,Application.Handle グローバル変数が参照されており,ドッキング解除後に Popup Menu の動作がうまくいってなかったのはこのためのようだった.Popup Menu オブジェクトを完全に除去してしまったら,ツールバー自身の QueryContextMenu 関数呼び出しがポップアップメニューの作成に使われるようになった.
それから,SetSite での古いSiteオブジェクトへのSite.Releaseメソッド呼び出しが,どうも問題を引き起こしていたらしい.呼び出しを書かないと,フローティングウィンドウを閉じたときにオブジェクトが破棄されないように見えるのだが,書くと,今度は実行時エラーで explorer がこける.何か実装を勘違いしているのかもしれない.とりあえず,エラーを起こさない方向で修正.(追記)SetSite(nil)のときに古いSiteへの参照さえ nil にすれば,Release 呼び出しは不要.