メモ気味にプログラムネタ。
DelphiでのFormで使う、Application.ProcessMessage。
これはメッセージを流してくれるので、
ループ中長く画面が止まる時ような時に併用すると、
簡単なマルチスレッド状態にしてくれる。
ただしメモリの開放や、同時に行なう可能性のある処理についての注意が必要となる。
使用する場合は、十分に動作を理解してないとおかしなことになる上、
最初から処理と描画を別々にする必要があるなら普通のマルチスレッドにするべきだ。
ただし、このカスタマイズでは簡単な表示のみで、既に処理・描画は完成されたものがあるので*1こちらを使った。
但しこれを使用する場合、サブフォームでの表示で、
FormCloseイベント時のActionがcaHide、さらに親フォームでサブフォームをFreeすることが無いという条件が必要になる。
修正内容は以下の通り。

  • FormShow時に、AllocMemフラグ、FormCloseフラグのFalse。
  • FormClose時にFormCloseフラグをTrue、更にAllocMemフラグがTrueならActionをcaNoneに。
  • ループ開始前にAllocMemフラグをTrue
  • ループ内で、FormCloseフラグがTrueならBreakする処理追加。
  • ループが終わった後、AllocMemフラグをFalse。更にFormCloseフラグがTrueならFormCloseを実行。
  • ループ処理前に、AllocMemフラグがTrueならExitする。

こんなもので大体は動作できる。
DBの検索で件数が多い場合の表示で使用してみている。

*1:以前にちょっと愚痴った駄目アプリの修正である。いかに修正内容を少なくするかが自分のミスを少なくする鍵となる。大幅修正をする場合はそのアプリと心中する覚悟が必要だが、これに関してはその気はさらさら無い。