正常起動しない

  1. Mery:V2.6.7 64bit
    Windows11 24H2 64bit

    Kuroさん、お世話になっております。
    だいぶ昔から便利に使わせていただいておりました。

    最近なのですが、正常起動しなくなりました。
    症状については、タスクバーに登録して起動しているのですが、
    起動しても、モニターになにも表示されない状態になります。

    タスクバーのMeryにマウスで合わせると、サムネが表示されますが、最小化されているようなイメージが表示されます。

    当方の設定に問題があるのでしょうか?
    今後も使わせていただきたいので、御指南いただけると幸いです。

    以上 よろしくお願いします。

     |  zawazawa8086  |  返信
  2. > タスクバーのMeryにマウスで合わせると、サムネが表示されますが、最小化されているようなイメージが表示されます。
    >
    > 当方の設定に問題があるのでしょうか?

    タスクバーのMeryにマウスで合わせサムネのMeryのタイトル部分で右クリックで
    移動や最大化をおこなってみてウインドウが表示されたら

    メニュー -> オプション -> ウインドウ
     起動時にウインドウの位置とサイズを復元するにチェックが入っていたらオフにしてみる
    確認として
     起動時にウインドウの位置とサイズを復元する -> […]をクリック
      位置の値を確認して異常な値(-だとか異常に大きな値)だったら、取り敢えず(0,0)とかに変更
      サイズも同様にして確認のうえ同様だったら(800,600)とかに変更

    これでウインドウが表示されれば位置とサイズの設定が異常になってたことによる表示の不具合かと。

     |  luna  |  返信
  3. > Mery:V2.6.7 64bit
    > Windows11 24H2 64bit

    > タスクバーのMeryにマウスで合わせると、サムネが表示されますが、最小化されているようなイメージが表示されます。
    >
    > 当方の設定に問題があるのでしょうか?

    先の設定は最新(V3.7.12)のオプションのものでした…(>_<)

    V2.6.7の場合は基本の所にウインドウの位置とサイズを復元があります。
    あとは先と同じように確認と設定をすることができると思います

     |  luna  |  返信
  4. ご愛用いただきありがとうございます。

    luna さん、サポートのご協力ありがとうございます。

    問題の改善方法については、luna さんがご回答くださった方法でお試しいただければ、大丈夫かと思います。

    ただ、この問題については、以前にも関連するご報告がありましたが、再現性が確認できなかったため、まだ対策ができていない状態です。

    つきましては、ひとつご確認いただきたい点があります。よろしければ、ご協力いただけると助かります。

    Mery.ini の設定です。(メモ帳などで開いてください)

    Mery.ini は、通常、C:\Users\<UserName>\AppData\Roaming\Meryフォルダーにあります。(ポータブルの場合は Mery.exe と同じフォルダー)

    Mery.ini 内の[ChildForm]セクションにあるLeft=Top=の値をご確認ください。

    もし、この値が-32000となっている場合、以前ご報告いただいた問題と関連している可能性が高く、対策を検討するためのヒントになるかもしれないので、現象が発生したときの状況など教えていただけると助かります。

    また、この問題の場合、復元方法としては、以下のとおりです。

    • Mery を終了 (タスクト レイの常駐も終了) する。
    • メモ帳などで Mery.ini を開き、Left=Top=の値を 0 に書き換える。
    • Mery を再起動する。

    また、同様の現象について、以前のトピックにも詳細な復元方法が記載されていますので、参考にしてみてください。

    【参考】Meryエディタが画面に表示されない
    https://www.haijin-boys.com/discussions/3574

     |  Kuro  |  返信
  5. ありがとうございます。
    サイズの設定が異常になっていたようです。
    今後も愛用させていただきます。

    不調の間、メモ帳を使っていましたが、
    やっぱりMeryが一番です。

    アップデートを含め大変でしょうが、
    今後のご健勝をお祈りいたします。

    以上 ありがとうございます。

    > > タスクバーのMeryにマウスで合わせると、サムネが表示されますが、最小化されているようなイメージが表示されます。
    > >
    > > 当方の設定に問題があるのでしょうか?
    >
    > タスクバーのMeryにマウスで合わせサムネのMeryのタイトル部分で右クリックで
    > 移動や最大化をおこなってみてウインドウが表示されたら
    >
    > メニュー -> オプション -> ウインドウ
    >  起動時にウインドウの位置とサイズを復元するにチェックが入っていたらオフにしてみる
    > 確認として
    >  起動時にウインドウの位置とサイズを復元する -> […]をクリック
    >   位置の値を確認して異常な値(-だとか異常に大きな値)だったら、取り敢えず(0,0)とかに変更
    >   サイズも同様にして確認のうえ同様だったら(800,600)とかに変更
    >
    > これでウインドウが表示されれば位置とサイズの設定が異常になってたことによる表示の不具合かと。

     |  zawazawa8086  |  返信
  6. ご返信ありがとうございます。

    無事に復旧できたようで安心しました。

    すでに解決しているとのことなので、Mery.ini の設定も正常値に戻っているかと思います。

    > アップデートを含め大変でしょうが、
    > 今後のご健勝をお祈りいたします。

    あたたかいお言葉、ありがとうございます!

    また、もし同じ現象が再発したときは、気が向いたときで大丈夫なので、上記手順で設定値を確認していただけると助かります。

    原因がもう少しはっきりすれば、再発防止につなげられるかもしれません。ご協力いただけると嬉しいです。

     |  Kuro  |  返信
  7. [ChildForm] > Left などで位置が保持されていたんだなーと初めて知って眺めていたんですが、マルチディスプレイだとマイナス値になることもあるんですね。かといって、「ディスプレイ2の方でMeryを終了後、ディスプレイ2を外して起動する」という操作をして画面外にMeryが復帰しそうな状況を作っても、ちゃんと画面範囲に戻ってくるような仕様になっていました。さすがです。

    ただ、若干不思議なんですが、 [ChildForm] > Left を手修正でマイナス値にしたときは、画面外に起動される状態になりますね。

     |  yuko  |  返信
  8. ご返信ありがとうございます。

    > [ChildForm] > Left などで位置が保持されていたんだなーと初めて知って眺めていたんですが、マルチディスプレイだとマイナス値になることもあるんですね。

    そうなんですよね。Windows では、マルチディスプレイ環境の場合、メインディスプレイの左側にあるディスプレイはマイナスの座標が返ってくる仕様になっています。

    > かといって、「ディスプレイ2の方でMeryを終了後、ディスプレイ2を外して起動する」という操作をして画面外にMeryが復帰しそうな状況を作っても、ちゃんと画面範囲に戻ってくるような仕様になっていました。さすがです。

    そこに気付いていただけたのは嬉しいです。 私もマルチディスプレイ環境なので、そこはこだわりポイントですね。

    > ただ、若干不思議なんですが、 [ChildForm] > Left を手修正でマイナス値にしたときは、画面外に起動される状態になりますね。

    そうなります。マルチディスプレイ環境だと、マイナスの座標も普通にありえるので、「マイナス値だったら画面内に戻す」みたいな単純な仕様にはできないんですよね。

    なので、Mery では終了時にディスプレイの数を Mery.ini ([MainForm] > MonitorCount) に記録しておいて、次回起動時に前回と比べてディスプレイの数が減ってた場合だけ、できるだけ画面内に戻すような処理を入れています。

    手修正で[ChildForm] > Leftをマイナス値にした場合は、ディスプレイの数が変わっていないので、この処理の対象外となるわけですね。

    ただ、本件について、私が把握している Windows の仕様として、ウィンドウが最小化されている場合、位置とサイズを取得する API のGetWindowRectを使うと座標が -32000 になる、という点があります。

    以前ご報告いただいたときも、Mery.ini に -32000 という数値が残っていたとのことだったので、何らかの要因で発生する現象なのだと思います。

    今回の件は数値の確認ができていないため、同様の現象かどうかわからないのが残念ですが…

    ちなみに、Mery ではGetWindowRectではなく、正しい位置が取得できるとされているGetWindowPlacementを使用しています。(Ver 2.6.7 でも同様)

    とりあえず、起動時にLeftTopが -32000 になっていたらデフォルトの位置に復元、みたいな処理でも入れておこうかしら…

     |  Kuro  |  返信
  9. > とりあえず、起動時に`Left`か`Top`が -32000 になっていたらデフォルトの位置に復元、みたいな処理でも入れておこうかしら…

    この問題の根本的な発生原因は分からないのですが、
    Left や Top が異常値の場合の対策として、
    Win32 API の MonitorFromRect 関数を使えないですかね?

    MonitorFromRect 関数
    https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-monitorfromrect

    これが使えれば、手修正で画面外の値にした場合等でも
    そこにディスプレイが無いことが分かるかと思います。

     |  K.O  |  返信
  10. > この問題の根本的な発生原因は分からないのですが、Left や Top が異常値の場合の対策として、Win32 API の MonitorFromRect 関数を使えないですかね?Win32 API の MonitorFromRect 関数を使えないですかね?

    情報ありがとうございます。

    MonitorFromRectは、マルチディスプレイ対策を実装したときに試したのですが、領域外だと一番近いモニターが返ってくるものだと思ってました。

    フラグを指定すれば挙動を変えられるんですね。これは使えそうです!

    それから、-32000 とは違いますが、画面外の位置が記憶されるケースとして、リモートデスクトップ経由の場合がありましたね。

    リモートデスクトップだと、ホスト側のディスプレイサイズに関係なく、クライアント側で操作した位置がそのまま保存されるので、その後ホストで直接アプリを起動すると画面外になってしまうことは考えられます。

    MonitorFromRectを使えば、こういうケースにも対応できそうですね。

     |  Kuro  |  返信
  11. 使えそうとの事でよかったです。

    そうか、リモートデスクトップ経由で使われる場合等も想定しないといけないんですね。ほんと開発者の方は大変ですね。

    これからも感謝しつつ愛用させて頂きたいと思います。

     |  K.O  |  返信
  12. ファイラーの BonsFD を開発している大石です。

    BonsFD でも以下のような報告がありました。
    Left と Top が明らかに異常な数値となっています。
    マルチモニタの環境で発生しているようです。

    [FormDeleteEx]
    State=NORMAL
    Left=32767
    Top=32767
    Width=2964
    Height=320

    今回対策を行ってみましたが、これで対応ができたかどうかは様子を見ている所です。
    もし異常な値が保存されても、画面に表示できれば良いと考えて以下を採用しました。

    前回とモニタ数が変わっても、現在のモニタ数で判断させています。
    ただ、リモートデスクトップでの環境が無いため、リモートデスクトップでも有効かどうかは判っていません。

    取得した Left と Top を渡して、マルチモニタの各モニタの表示範囲ならそのまま表示させます。
    それ以外ではメインモニタの左上に表示させます。
    リストを渡しているのは、画面でモニタ情報を表示するためです。

    拙作の以下のファイラーをダウンロードして、「設定」の「フォーム位置」で画面が表示されます。
    画面下の「記憶」をクリックすると、モニタ情報が表示されます。
    内容はソースプログラムを見てもらうのが判りやすいと思います。
    https://www.bonsfm.com/bonsfdwindows/bonsfdwin

    よろしくお願いします。

    function TFormMain.GetMonitoInfo(var SrcList: TStringList; Left: Integer; Right: Integer; Sender: TObject): Boolean;
    var
    iRow1: Integer;
    Monitor: TMonitor;
    iLeft1: Integer;
    iLeft2: Integer;
    iTop1: Integer;
    iTop2: Integer;
    iLeftShift2: Integer;
    iTopShift2: Integer;
    begin
    //結果
    Result := FALSE;
    //初期化
    iLeftShift2 := 10;
    iTopShift2 := 10;
    //クリア
    SrcList.Clear;
    //実行
    for iRow1 := 0 to Screen.MonitorCount-1 do
    begin
    //取得
    Monitor := Screen.Monitors[iRow1];
    //追加
    SrcList.Add(IntToStr(Monitor.Left) + #09 +
    IntToStr(Monitor.Top) + #09 +
    IntToStr(Monitor.Width) + #09 +
    IntToStr(Monitor.Height));
    //設定
    iLeft1 := Monitor.Left;
    iLeft2 := Monitor.Left + Monitor.Width - iLeftShift2;
    iTop1 := Monitor.Top;
    iTop2 := Monitor.Top + Monitor.Height - iTopShift2;
    //判定
    if ( (iLeft1 <= Left) and (Left <= iLeft2) ) and ((iTop1 <= Top) and (Top <= iTop2)) then
    begin
    //結果
    if Result = FALSE then
    begin
    Result := TRUE;
    end;
    end;
    end;
    end;

     |  大石剛司  |  返信
  13. >> 大石剛司さん

    開発、お疲れ様です。BonsFD、めちゃくちゃ多機能ですね!

    やっぱり「3万」とかいう謎の数値が絡んでくるのですね…。Mery の場合は -32000 でしたが、32767 も怪しい感じがしますね。

    ソースコードも拝見しました。すべてのモニターの画面サイズを取得して、きちんと画面内に収まるようチェックされてるんですね。

    > ただ、リモートデスクトップでの環境が無いため、リモートデスクトップでも有効かどうかは判っていません。

    試しにリモートデスクトップで BonsFD を動かしてみましたが、フォームの位置は取得できていました。

    ただ、リモートデスクトップ経由で画面の下の方に配置した状態で終了し、その後、直接ホスト側の PC で起動すると、画面外で起動してしまうようです。

    [FormMain]Leftが画面外の場合はデフォルト位置に復元されているようですが、Topが画面外の場合は復元が動作していないのかもしれません。

    • BonsFD.ini
    [FormMain]
    State=NORMAL
    Left=0
    Top=-4000
    

    ちなみに、Mery では以前いただいた情報を参考に、MonitorFromRectを使ってフォームがモニターの範囲外だったら画面内に戻す処理を入れる予定です。

    procedure TChildForm.FormShow(Sender: TObject);
    var
      R: TRect;
    begin
      if Screen.MonitorFromRect(System.Types.Rect(Left, Top, Left + Width, Top + Height), mdNull) = nil then
      begin
        R := Monitor.WorkareaRect;
        if Left + Width > R.Right then
          Left := R.Right - Width;
        if Top + Height > R.Bottom then
          Top := R.Bottom - Height;
        if Left < R.Left then
          Left := R.Left;
        if Top < R.Top then
          Top := R.Top;
        if Top + Height > R.Bottom then
          Height := R.Bottom - Top;
        if Left + Width > R.Right then
          Width := R.Right - Left;
      end;
    
     |  Kuro  |  返信
  14. 動作確認ありがとうございます。

    Top の処理が間違っているのが判り、修正版をアップロードしました。
    前回接続できなかったリモートデスクトップは別のパソコンを用意して動作確認を行いました。

    修正版をリモートデスクトップの画面の下側で終了して、リモートデスクトップを切断しました。
    その後ホストのパソコンで実行してみたら、画面左上のデフォルト位置で表示されたので判定は大丈夫そうです。

    来週でDelphiのComunityEditionの期限が切れるので、Delphiの再インストールが必要になってしまいます。
    また、Delphi11からはWindowsXpが対応外になったので、手間が増えてしまいましたがDelphiXE2でXp版も作成しています。
    別のファイラーはWindows98で動作するように、Delphi7でも作成しています。

    よろしくお願いします。

     |  大石剛司  |  返信
  15. お役に立てたなら良かったです。

    修正版でも確認してみましたが、問題なく画面内に起動するようになっていました。

    > 来週でDelphiのComunityEditionの期限が切れるので、Delphiの再インストールが必要になってしまいます。

    期限付きの仕様、なんとかしてほしいですよねー。

    > また、Delphi11からはWindowsXpが対応外になったので、手間が増えてしまいましたがDelphiXE2でXp版も作成しています。

    Windows XP が対応外になったのって公式では Delphi XE3 以降だったと思いますが、Delphi 11 までは一応動作するんですね。

    > 別のファイラーはWindows98で動作するように、Delphi7でも作成しています。

    Windows 98 までサポートしているとは、すごすぎます。

    Mery は当時 Delphi 6 で開発していましたが、Delphi 7 はめちゃくちゃ欲しかったです。(結局 Delphi XE まで我慢しましたが…)

    それでは、良い Delphi ライフを!

     |  Kuro  |  返信
スポンサーリンク