Entries

スポンサーサイト

カテゴリ:スポンサー広告
更新日:--------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Delphi] 自分自身のFreeによるメモリ違反

カテゴリ:Delphi
タグ: Delphi 
更新日:2009-03-12

 wt Ver.1.0 - 作業時間計測ツール



業務管理に必要な作業時間報告のためのツールです。複数の仕事の、細かい作業時間を別々に計測し、作業別の累積合計時間のレポートを出力します。



このツールの最大の特徴は、多数の作業の記録を取れることにある。内部的には、TPanelを継承して、ひとつの作業を管理するクラスを定義して、それを動的に作成している。インターフェースとデータ構造が一体化しているのが特徴で、別に作業一覧を管理する必要もなく、設計上は作業数の上限もない。作った当時のことは、あまりよく覚えていないのだけれど、インターフェースを動的生成するのがうれしかったのだろうと思う。一体化した構造は、データ管理がややこしくなることが多いので、今なら、TObjectを継承してデータ構造を作り、その中にTPanelを持たせるような構造にするだろうからだ。とはいえ、このツールくらいであれば、そのシンプルさは十分にメリットではある。

ただし、問題が一つあった。

シェアウェア版に改良する前のバージョンでは、作業の削除は、なぜかメニューから別フォームを呼び出し、作業一覧から選択して削除するように作ってあった。このインターフェースは、ぜひとも修正されるべき対象に思えた。なぜ昔の私は、パネル上に削除ボタンを配置しなかったのだろう?当然、そうあるべきだと思った。だから、そう、修正した。

もちろん、昔の私に分別がなかったわけではない。そう作らなかったのには理由があった。修正したプログラムは、メモリ違反のエラーを発したのだ。問題とは、これだった。パネル上に配したボタンでは、削除ができなかったのだが、そんなことはすっかりと忘れてしまっていたのだ。゛一年後の自分は自分じゃない”。あぁ、まさに!

さて、どうしよう?以前のインターフェースでは、あまりにも不格好だ。これでは、恥ずかしくて世に出せない。なんとか、パネル上のボタンで削除できないものか?で、調べることにした。

まぁ、経緯は省いて、結果だけ報告しよう。

最終的決め手は、TFormにあるReleaseメソッドだった。ヘルプによると、フォームを廃棄するときにはFreeではなく、このメソッドを使えとある。Releaseメソッドは、CM_RELEASEをPostMessageしているだけで、CM_RELEASEのメッセージ処理で、Freeを呼び出していた。メッセージを介することで、自分自身でFreeしないようにしているらしい。おそらく、直接自分でFreeを呼び出して解放しても、その後にアクセスされてしまい、メモリ違反になるのだろう。

フォーム上に配されるTPanel(を継承したクラス)であれば、同じ制約を受ける可能性はある。そう考え、Releaseメソッドを真似て実装してみたところ、エラーは解消された。かくて、我がプロジェクトXは、無事に結末を迎えることができたのである。


スポンサーサイト

Appendix

プロフィール

いむら@fintopo いむら@fintopo

ガーデニングが趣味のフリーのシステムエンジニア兼プログラマ(フルスタックエンジニア)です。

仕事募集中です。個人なので、融通がききます。 大規模な開発はできないかもしれませんが、研究や製品開発レベルでの小規模開発、特に相談しながら新しいものを作っていくのが得意です。詳しくはWebサイトをご覧ください。
詳しくは「fintopoとは」をご覧ください。

> fintopoとは

このページのQRコード

季節暦

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。