月別アーカイブ: 2024年10月

それは冷蔵庫のドアの警報音じゃなくて・・・

このところ、料理にハマっている・・・。自分の人生で、お湯を沸かす以外の目的でキッチンに立つことは絶対にないだろうと、これまでずっと思っていたし、実際、何十年もその通りだったのだ、けれど。

ふとしたことから、マニュアル通りにやれば、自分にも美味しい料理が作れることに気が付いてしまったのだ・・・。

それは、それですごく良かったことなんだけれど、今日、起きたトラブルは・・・

1.冷蔵庫のドアの汚れに気付く

そんなこんなで休日の昼食は、このところ、自分で作ることが多くなった。そのために調味料もそろえたし、調理用具も買った。まさか、こんな日がくるなんて思いもしなかったのだけれど、もうかれこれ3ヶ月くらい、休日は自分で作る昼食を続けている。

今日、いつもと違ったのは、冷蔵庫のドアが、いつの間にか、結構汚れていることに気が付いてしまったことだ。もちろん、気が付いた以上、掃除をしないわけにはいかない!

冷蔵庫のドアには、閉め忘れを防止するためのセンサーが付いているから、ドアを開けたまま掃除していると、当然、警報音が鳴る。

ピピッ ピピッ

もちろん、警報音は無視。エタノールを含んだウェットティッシュで、ひたすら汚れを落とす。

ピピッ ピピッ

( わかってるよー )

ピピッ ピピッ

やっと、きれいになった!
ドアを閉めて・・・ひと安心、これで、やっと昼食が作れる。

2.昼食を作り、食べて、片付けてたら・・・

水から、調味料まで、すべてレシピ通りに計量し、調理時間も最近は一家に1台はあるんじゃないか?みたいな、いわゆる「スマートスピーカー」とか「スマートアシスタント」と呼ばれる アレ! に正しく計測してもらう。計測中の自分自身の動きも毎回同じなので、ほとんど調理ロボットだ。

料理は何の問題もなく完成。一緒に暮らしている人にもおすそ分け。この上ないくらい、しあわせな休日のお昼ごはんTimeを過ごす。レシピを作り、公開してくださった方に、心から感謝!

食べたら今度は後片付けだ。自分で言うのもナンだけど、洗い物も別に苦にならない。調理器具がキレイになると、すごくうれしいし、乾燥させた後は一緒に暮らしている人が片付けてくれるので、とにかくキレイに洗えば、それでOK!

以前は食洗器を使っていたのだが、なんか調子が悪くなって、いつの間にか、使うのをやめてしまった・・・。あの頃は、食洗器に洗い物を並べるのが「食べる」以外の部分で、自分と料理との唯一の接点だったのだけれど。

(変われば、変わるもんだよなー)

そんなことを思いながら、お皿を洗っていると・・・

ピピッ ピピッ ピピッ ピピッ ピピッ・・・

間違いなく、警報音が聞こえる。背後にある冷蔵庫をじっと見つめる。見た目、ドアはきちんと全部しまっている。いちおう、全てのドアを手で押して確認。動くドアは「ない」。つまり、間違いなく、すべて完全に閉まっている。なのに、しばらくすると・・・

ピピッ ピピッ ピピッ ピピッ ピピッ・・・

冷蔵庫のドアについている操作パネルを適当にいじって見る。警告の表示は見当たらない。なのに、また、しばらくすると・・・

ピピッ ピピッ ピピッ ピピッ ピピッ・・・

どうやら、1分間隔で警報音が鳴るようだ。しかし、その原因がわからない・・・

もしかして、冷蔵庫のセンサーが壊れた?

そう思いたくなったのが、正直で、本当の気持ち。

(気持ちは本当ですが、メーカーさんの名誉のために一言。冷蔵庫に問題はありませんでした)

3.いっしょに暮している人に相談する

ある理由があって、一緒に暮らしている人は、一般ピープルよりも家電に強い。だから、とりあえず言って見た。

「冷蔵庫のドア閉め忘れの警報音が鳴りやまないんだけど・・・」

たたたた(駆け出す音)、一緒に暮らしている人は、行動もとても素早い。自分自身は、その後ろ姿を見送ったあと、しばし、炭酸水で乾いた喉を潤す。んで、しばらくしてからキッチンへ降りてみると、どこにしまってあったのか、冷蔵庫の操作マニュアルが伝家の宝刀のように取り出され、広げられていて・・・

一緒に暮らしている人が、まるで大発見でもしたかのように断言。

「警報音が鳴るときは、こんな表示が出ると書いてあるけれど、表示が一切ない!」

冷蔵庫のディスプレイを見れば、それは明らか。
なんの表示もない。それなのに・・・

ピピッピピッピピッピピッピピッ・・・

1分経過するごとに、規則正しく、警報音は鳴り響く。

「原因不明。がんばったけれど、もぉ無理。」

「こうなったら、お客様相談室に電話しよう!」

さすが同居人。あきらめも潔い。言うが早いか、家電を持って、ピッポッパ。

4.原因判明

「少々、お尋ねしたいのですが・・・」

「はい、警報音が消えなくて・・・」

「冷蔵庫には、操作マニュアルにあるような表示が出なくて・・・」

「でも、警報音が・・・」

お客様相談センターの係員の方から、ここで何か、アドバイスがあったらしく・・・

「あっ、はい。ガスコンロですか? はい、あります。冷蔵庫の前です。」

「へっ」・「あっ!」

なんと警報音を出していたのは、ガスコンロの鍋無し検知機能だったのです!

調理の最終段階で、鍋の保温のため、ガスコンロの火力を最小にして、そのまま鍋を外して火を消し忘れ、その「ガスコンロを切らない」ままの状態で、そのこと自体を忘れて放置・・・

規定の15分が経過。コンロは安全装置が働いて、自動消火。ただ、着火レバーはONのままなので、冷蔵庫ではなく、冷蔵庫のそれに非常によく似た、ガスコンロの警報音が、鳴り続けることに。

でも、自分は、最初に聞こえたドア解放の警報音から、音源は冷蔵庫だと思い込んで。
それを伝え聞いた、一緒に暮らしている人も、音源は冷蔵庫だと思い込んで、いるから・・・

お互い、まさか、それがガスコンロの警報音だなんて、夢にも思わず・・・

冷蔵庫の、ひたすら平らなドアは、真向かいにあるガスコンロの警報音をよく反射する・・・

そう、まるで自分がそれを発しているかのように。

5.M社のお客様相談センターのスタッフの皆様へ、心から感謝申し上げます。

それにしても、凄いのは、一緒に暮らしている人の言葉を丁寧に聞き取って下さり、問題の真の原因にいち早く気が付いて教えてくださったM社のお客様相談センターのスタッフの皆様のご対応です。

ご対応から、拝察すると、おそらくは同じような事例が、過去に多々・・・

優しく、丁寧に、ご案内してくださっただけでなく、最後に「ご迷惑をお掛けして」とお詫びの言葉まで頂戴し。

M社の冷蔵庫は最高です!
購入してはや8年、ただの1度も不具合なく、日々、勤めを忠実に果たし、
期待通りの冷たさで、ありとあらゆる食材を冷やし続けてくれています。

壊れたなんて、疑って、ほんとうにごめんなさい。

6.まとめ

(1)ガスコンロの消し忘れ警報音は、冷蔵庫のドア閉め忘れの警報音によく似ている。
(2)キッチンで警報音が鳴り響いたら、冷蔵庫だけを疑ってはいけない。
(3)ガスコンロを使用したら、最後にレバーのOFFを必ず確認する。

プログラミングも、調理も、安全確認という最も重要な部分は、まったく同じでありました。そのことに思いを深くした、誠に貴重な経験でありました・・・が、もしも、もしも可能なら☆

「これは、冷蔵庫のドア閉め忘れの警報音です」とか、「これは、ガスコンロの鍋無し検知機能の警報音です」って、個別に案内してもらえると、まったく混乱せずに済んだので、最高に良かったかもですが。

そんな、わがままは、置いといて・・・

ガスコンロのレバーをOFFにし忘れても、自動的に消化するという、画期的な安全装置の開発者の方々にも、心から、心から、感謝です!

火事にならなくて、よかったー!!

Excelのプロセスを終了させる

プログラムがフリーズするなどして、実行中の Excel のプロセスが残ってしまうことがある。また、そうでなくても、例えば Delphi の Try ~Finally 文で、確実に Excel のオブジェクトを解放したつもりであるにもかかわらず、プログラムで読み書きした特定の Excel のファイルが「編集のため、ロックされています」と表示され、「読み取り専用」でしか開けなくなり、Ctrl+Alt+Del でタスクマネージャーを起動して確認すると、場合によっては5つも6つもExcelのプロセスが実行中であったり、する。

そこで Delphi で書いた Excel のファイルを操作するアプリケーションを終了する際に、実行中のプロセスが残らないようにする方法を考えてみた。

【もくじ】

1.確認メッセージを表示して終了させる
2.確認メッセージを表示せずに起動中の全てのプロセスを終了させる
3.お願いとお断り

1.確認メッセージを表示して終了させる

最初に書いてみたのがコレ!
Excel のプロセスが実行中であれば(残っていれば)、確認メッセージを表示して、プロセスを強制的に終了させる。ただし、このコードで終了できるプロセスは1つのみ。

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  strMsg: string;

  //Excelのプロセスが実行中であるか、どうかを調査する関数
  function IsExcelRunning: Boolean;
  var
    Snapshot: THandle;
    ProcessEntry: TProcessEntry32;
  begin
    Result := False;
    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if Snapshot = INVALID_HANDLE_VALUE then Exit;

    ProcessEntry.dwSize := SizeOf(TProcessEntry32);
    if Process32First(Snapshot, ProcessEntry) then
    begin
      repeat
        if SameText(ProcessEntry.szExeFile, 'EXCEL.EXE') then
        begin
          Result := True;
          Break;
        end;
      until not Process32Next(Snapshot, ProcessEntry);
    end;
    CloseHandle(Snapshot);
  end;

  //プロセスのリストを取得し、特定のプロセスを終了する関数
  function TerminateExcelProcesses: Boolean;
  var
    Snapshot: THandle;
    ProcessEntry: TProcessEntry32;
    ProcessHandle: THandle;
  begin
    Result := False;
    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if Snapshot = INVALID_HANDLE_VALUE then Exit;

    ProcessEntry.dwSize := SizeOf(TProcessEntry32);
    if Process32First(Snapshot, ProcessEntry) then
    begin
      repeat
        if SameText(ProcessEntry.szExeFile, 'EXCEL.EXE') then
        begin
          ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry.th32ProcessID);
          if ProcessHandle <> 0 then
          begin
            if TerminateProcess(ProcessHandle, 0) then
            begin
              Result := True;
            end;
            CloseHandle(ProcessHandle);
          end;
        end;
      until not Process32Next(Snapshot, ProcessEntry);
    end;
    CloseHandle(Snapshot);
  end;

begin
  if IsExcelRunning then
  begin
    //Excelのプロセスを終了させる
    strMsg:='Excelのプロセスが実行中です。'+#13#10+#13#10+
      '終了してもよろしいですか?';
    if Application.MessageBox(PChar(strMsg), PChar('警告'), MB_YESNO or MB_ICONWARNING) = mrYes then
    begin
      //[はい]が選ばれた時
      if TerminateExcelProcesses then
      begin
        strMsg:='Excelプロセスを終了しました。';
        Application.MessageBox(PChar(strMsg), PChar('情報'), MB_ICONINFORMATION);
      end else begin
        strMsg:='実行中のExcelプロセスは見つかりませんでした。';
        Application.MessageBox(PChar(strMsg), PChar('情報'), MB_ICONINFORMATION);
      end;
    end else begin
      //[いいえ]が選ばれた時
      strMsg:='Ctrl+Alt+Delキーを同時に押してタスクマネージャーを起動し、実行中の'+
      'Excelのプロセスを必ず終了してください。';
      Application.MessageBox(PChar(strMsg), PChar('情報'), MB_ICONINFORMATION);
    end;
  end else begin
    strMsg:='Excelは実行されていません。';
    Application.MessageBox(PChar(strMsg), PChar('情報'), MB_ICONINFORMATION);
  end;

end;

ただ、コレだと、もし、Excelのプロセスが実行中であった場合、アプリケーションの終了時に突然表示されるメッセージに、ユーザーが驚き、「はい」・「いいえ」のどちらを選べばいいのか、操作上の混乱が生じる可能性があるように思えてきた・・・。

それに、複数の Excel のプロセスが実行中であった場合、この方法では1つしか、終了できない。

そこで、ユーザーには何も知らせずに、もし実行中の Excel のプロセスがあれば、バックグラウンドですべてのプロセスを終了させるようにプログラムを修正。それが次の「確認メッセージを表示せずに起動中の全てのプロセスを終了させる」例。

2.確認メッセージを表示せずに起動中の全てのプロセスを終了させる

実行中の全ての Excel のプロセスを強制的に終了させる。ユーザーに対する確認メッセージは表示しない。

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

  //Excelのプロセスが実行中であるか、どうかを調査する関数
  function IsExcelRunning: Boolean;
  var
    Snapshot: THandle;
    ProcessEntry: TProcessEntry32;
  begin
    Result := False;
    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if Snapshot = INVALID_HANDLE_VALUE then Exit;

    ProcessEntry.dwSize := SizeOf(TProcessEntry32);
    if Process32First(Snapshot, ProcessEntry) then
    begin
      repeat
        if SameText(ProcessEntry.szExeFile, 'EXCEL.EXE') then
        begin
          Result := True;
          Break;
        end;
      until not Process32Next(Snapshot, ProcessEntry);
    end;
    CloseHandle(Snapshot);
  end;

  //プロセスのリストを取得し、特定のプロセスを終了する関数
  function TerminateExcelProcesses: Boolean;
  var
    Snapshot: THandle;
    ProcessEntry: TProcessEntry32;
    ProcessHandle: THandle;
  begin
    Result := False;
    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if Snapshot = INVALID_HANDLE_VALUE then Exit;

    ProcessEntry.dwSize := SizeOf(TProcessEntry32);
    if Process32First(Snapshot, ProcessEntry) then
    begin
      repeat
        if SameText(ProcessEntry.szExeFile, 'EXCEL.EXE') then
        begin
          ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry.th32ProcessID);
          if ProcessHandle <> 0 then
          begin
            if TerminateProcess(ProcessHandle, 0) then
            begin
              Result := True;
            end;
            CloseHandle(ProcessHandle);
          end;
        end;
      until not Process32Next(Snapshot, ProcessEntry);
    end;
    CloseHandle(Snapshot);
  end;

begin

  //Excelのプロセスが実行中である限りLoopさせ、完全にExcelのプロセスを終了させる。
  While IsExcelRunning do
  begin
    TerminateExcelProcesses;
    Application.ProcessMessages;
  end;

end;

これが、いちばんスマートかな?

3.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容(プログラムを含む)利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。