返って来いよ 
Windows9x 系と WindowsNT 系での,飛ばし位置の違いにもめげず,
なんとか問題をクリアした でる。

「最小化からの終了にも完全に対応しました!」と意気揚々と公開し,
やれやれ,これで今度こそ一安心〜と思ったのも束の間(笑)
そう,またもや またもや ほんの「束の間」であった(爆笑)
# 何やってんだか,まったく(笑)

Email を頂く。
「最小化時の終了の時は,書き込まれないようなのですけど,
 これだと,ウインドウを動かしてから最小化して,
 終了させた場合,直前まで動かしていた位置を覚えていません」


がぁーん(笑)
確かに,そうである。

つまり,ウインドウ位置の保存までのプロセスは,
1.終了させる命令を受ける。
2.今現在のウインドウ位置を調べる。
3.もし最小化(つまり座標が 3000,3000)してたら
 ini ファイルに書き込まずに即終了。
 最小化されていなければ,ini ファイルに書き込んで終了。
なわけである。

例えば起動時 0,0 だとしよう。(ini ファイルには x=0,y=0)
そして,100,100 に動かすとする。(まだ ini ファイルには何も書き込まれていない。)
ここで,普通に終了させると,ini ファイルに x=100,y=100 を書き込んで終了する。
ところが,100,100 に動かしたあと最小化し,終了させた場合,
ini ファイルに何も書き込まずに終了ということをしているので,
直前の 100,100 は覚えちゃいない(笑)
つまり,ini ファイルは最初の x=0,y=0 のままなんである(笑)

うーん。
言われてみれば,ウインドウを動かした後,最小化して終了の場合,
このやり方だとマズい。

んじゃ,どうするよ?と考える。
すぐに思いつくのは,常にウインドウの位置を調べ,
ini ファイルに保存し続ける,というやり方である(笑)

例えば,1 秒おきに,現在のウインドウ位置を調べ,
ini ファイルに書き込んでいけば,最小化される直前の数値は,書き込まれるだろう。
ならば,最小化時に書き込まず終了としても,動かした位置を再現できる。

んが,しかし(笑)
これ,考えたらすぐに欠点が判る(笑)
んな 1 秒ごとに調べて書き込んでたら,CPU ずっと使ってることになるじゃん(笑)
あれごときアプリに CPU 全投入ってのも,非常にバカらしい(爆笑)
あまりにも申し訳なさ過ぎる。
却下却下(爆笑)<このアイデア

じゃぁ,どうする?
うーん。
最小化する時にウインドウ位置を覚えさせる,ってそんなこと出来ないかなぁ。
つまり,最小化ボタンを押した瞬間に,ウインドウ位置を調べ,
ini ファイルに記入,って感じね。
これなら少なくとも,CPU 使いまくり,ってことにはならないであろう。

んがしかし(笑)
またも,いきなり挫折。
というのも,何も DLL を使わずに既存の命令だけでやろうとすると,
「最小化ボタンが押されたとき」というのを検出する命令がないのだ(汗)
「×」ボタンが押されたときには,ここへ飛べ,という命令はある。
onexit」というのがそれ。
だけど,どこをどう探しても「最小化ボタンを押したとき」に対応するのがない。
もちろん,外部 DLL を使えば出来るのだけども,それだけのために,
ファイルサイズを増やしたくもない。

となると,最小化する直前の位置,を覚えるというのは無理そう。

んー,どうするか。
あれこれ考えながらウインドウを動かしたり最小化したりしてみる。
右クリックして終了。
うーん。
うーん。
うーん??
「元のサイズに戻す」…。

やっぱり「元のサイズに戻す」を選んでもらって,終わらしてもらうしかないかなぁ。

ん?まてよ???

これだ!(笑)

最小化する前に「最小化する直前の位置」が覚えられないなら,
最小化した後に「最小化する直前の位置」を思い出させてやればいいんじゃんっっ(爆笑)
これを擬似的にこっちでやってやればいいんじゃないか?(笑)

そう,最小化したウインドウを,いったん元に戻してやり,
そこでウインドウの位置を調べ,ini ファイルに書き込めば,
OK ではないか。

よくもまぁそんな馬鹿げた方法を思いついたもんだと,
今振り返って自分でも思うわけだけど(笑)
なんせ「力業のでるふぃ」であるからして,そゆことを思いついてしまうんである(笑)

出来る,かな。
既存の命令で。

そもそも,元に戻す,という作業は,どうするか。
まずそこから考えてみる。
タスクバーのボタンの上で,右クリック。
で,「元のサイズに戻す」を選ぶ,だよね。

でも,それを擬似的にどうやってやる?(笑)
マウスを使うというのは,駄目だ。
じゃぁ,キーボード。
キーボードから,呼び出すには…。
[Alt+ スペース] でメニューを呼び出して,[R] だ。

# この辺り,ショートカットメニューの鬼の でるである(笑)
# 試しに何かのウインドウでやってみてください(笑)<Alt+ スペース
# メニューが出ます。
# Windows 共通のショートカットメニューだからね。

何となく頭の中で形になってくる。
HSP 本とヘルプを見てみる。
何か使えそうな命令。

aplkey キーコード送信

これだ!(笑)
この辺り一連の命令を使えばいけそう。
ということで,試行錯誤を繰り返す。
まー,言葉にすれば簡単だけど,なかなか上手くいかないのが
相変わらずで(爆笑)
ウインドウがうんともすんとも言わなくて,強制終了するしかなかったり,
無限ループに陥って,訳判ん無くなったり(笑)
いやー,まいったまいった。

かくして,めちゃくちゃ力業のソースが出来上がり,
最小化されていた場合は,いったん元に戻してからウインドウの位置を
読み取り,ini ファイルに書き込む,という方法でクリアだ(笑)
一瞬,元に戻るウインドウが見えるのが玉にキズなんだけれども,
ま,その辺りは目をつぶって頂きたい(笑)

この技を編み出してから,でるのソースには全て,
「最小化からの復帰ルーチン」が組み込まれるようになったのである(笑)
; 最小化でアプリが終了したときの回避 --------------------------------------------
if (prmx=3000) or (prmx=-32000){
; 最小化のウインドウを元に戻して値の判定準備 ------------------------------------
aplsel "******",0 ; タイトルバー「******」のウインドウ取得
aplact ; ウインドウアクティブ
wait 10 ; 0.1 秒ウエイト
aplkey 32,4 : aplkey 82 ; Alt +スペース+ R を送る(= 元に戻す)
wait 10 ; 0.1 秒ウエイト
goto *filesave ; ファイルのセーブへ

}
ところで,今もそういうことをしているかというと,
そうではなく,実は ini ファイルの読み書きをする DLL である
ini File Controller の Ver.4.0 からは,
これと同じ事をやってくれる「wps_restore」という命令が加えられた。
なので,これ一つで,ウインドウを元に戻してくれるので,
非常にソース的には美しくなった(笑)
ありがたいことである♪


さて。
ま,こうやってみてくると判るように,最初ウインドウの位置を保存復元するのに,
x.dat と y.dat を使ったり,最小化時から復帰させるようにキーを送信してみたり,と,
まったく,スマートじゃない方法をつかってプログラミングしてきた。

だけど,そういう風に,既存の命令でなんとかする方法はないか,
と考えてきて挑戦してきたことは,少なくとも無駄じゃなかったと思う。
x.dat と y.dat を使ったときには,poke ,strlen ,bsave の勉強になったし,
今回のことでは aplsel ,aplact という命令の勉強が出来た。

でるは,最初は遠回りでもいいと思う。
遠回りして,終点が見つかったら,今度は,もう少し短い道を見つければいいわけで,
その遠回りすることも,たぶん,何かしら役に立つと思うからだ。
そして,いろんな方法(道)を知っていることは,一つの方法が駄目なときの,
回避策としても役立つわけで,「これしか知らない」よりは,絶対いいと思う。

今からプログラミングを始めようと思う人が居たら,
是非,木をこすり合わせて火を点ける方法から始めて欲しい。
ライターを使って火を点けることは,後でも出来るし,いつでも出来るのだ(笑)

本日の感想 力業,万々歳(笑)

January 24, 2001