1 件の投稿を表示中 (合計 5 個)
  • 作成者
    投稿
  • #19494

    開発お疲れ様です。
    EmEditor Pro v14.4.2 (64bit) を、Win8.1 Pro 64bit上で使ってて不具合と思われるのがあります。

    ・かなり行数が多いファイルを開いている。(最初に発生した時は14043行の文書でしたが、実験では7000行くらいの文書でも起こりました。)
    ・最後の行が改行だけではなく、何か文字があってから改行がある。
     foo[EOF]
     のような。
    ・ルーラーを表示している。

    上記条件で、文頭から「文末へ」コマンドで移動して、プラグインのOnEventsにEVENT_CARET_MOVEDが来たときタイミングで、

      Editor_GetCaretPos( hWnd, POS_VIEW, &view_pos );
      Editor_ViewToDev( hWnd, &view_pos, &dev_pos );

    を行うと、デバイス座標を正しく取得できないようです。
    (カーソルの表示座標は正しい値が取得できていました。)
    具体的には
     カーソルの表示座標 (1, 14042 )
     デバイス座標 ( 14, -2147483648 ) // ※0xffffffff80000000
    といった具合です。
    「文末へ」ではなく、例えば (0, 14042)から、(1,14042) へ移動したときは、デバイス座標として ( 14, 867 ) といった妥当な値が取得できています。

    では確認お願いします。

    #19500
    Yutaka Emura
    キーマスター

    星くず彼方に 様

    いつもお世話になっております。

    これは、こちらでは再現できなかったのですが、最終行に文字がある場合ということでヒントを得て、問題の部分が特定できたと思います。0xffffffff80000000 (INT_MIN) というのは、32ビット整数の最小値になります。デバイス座標の場合、無効な値を意味します。画面に入りきらない非常に大きな、またはマイナスの非常に小さな値の場合に、この値になります。文末へ移動するコマンドの途中では、カーソル移動とスクロールの2段階があります。カーソル移動の後、スクロールを行う前の間に、なんらかの理由で EVENT_CARET_MOVED が発行されてしまうと、この状態になってしまいます。(つまり、カーソルは一番下なのに、スクロール バーは一番上なので、カーソル位置が画面の非常に下の方になってしまいます)問題は修正できていると思いますので、次のベータ版が公開されたらお試しいただけると幸いです。

    ご報告ありがとうございました。
    今度もよろしくお願い申し上げます。

    #19501

    次のベータの修正で直るかもしれませんが、一応追加の情報です。

    表示/非表示を切り替えられるものはいくつかありますが、
     各種ツールバーの有無は影響しない
     タブの有無/スタイルは影響しない
     スクロールバーの有無は影響しない
     ステータスバーの有無は影響しない
     ルーラーを非表示にしてる時は発生しない
     ルーラーを表示しているときだけおかしくなる

    ルーラーを表示しているときの「文末へ」コマンド時、OnEventsに EVENT_CARET_MOVED が、2回やってくる。
    そのうち1回目でやると、0xffffffff80000000へ変換される。 2回目でやった時は正常値へ変換される。
    ルーラーを表示してないときの「文末へ」コマンド時、OnEventsのEVENT_CARET_MOVEDは1回だけ。

    逆に「文頭へ」コマンドの場合は、ルーラーの有無にかかわらず、OnEventsのEVENT_CARET_MOVEDは1回だけ。

    #19503
    Yutaka Emura
    キーマスター

    星くず彼方に 様

    いつも EmEditor Professional をお使いいただき、誠にありがとうございます。

    先ほど、v14.4.3 beta 1 を公開しましたので、お試しいただけると幸いです。
    http://jp.emeditor.com/forums/topic/emeditor-v14-4-3-beta-1-%E3%82%92%E5%85%AC%E9%96%8B%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/

    EE_VIEW_TO_DEV メッセージ (Editor_ViewToDev インライン関数) の後に、dev_pos の x と y の値が LONG_PTR_MIN または LONG_PTR_MAX かどうかをチェックしていただくことをおすすめします。例えば、カーソルが文書の一番上にある状態で、スクロール バーを下にドラッグして一番下を表示した状態で現在のカーソル位置 (0,0) をデバイス座標に変換しようとすると、dev_pos の結果は LONG_PTR_MIN または LONG_PTR_MAX になり無効だとわかります。

    前回、0xffffffff80000000 (INT_MIN) と書きましたが、これは正しくありませんでした。32ビットと64ビットの場合で、この値は異なり、正しくは以下のようになります。(新しい plugin.h に定義を追加しました)

    #if (defined(_WIN64) || defined(_W64))
    #define LONG_PTR_MIN		LLONG_MIN  // (-9223372036854775807i64 - 1)
    #define LONG_PTR_MAX		LLONG_MAX  // 9223372036854775807i64
    #else
    #define LONG_PTR_MIN		LONG_MIN   // (-2147483647L - 1)
    #define LONG_PTR_MAX		LONG_MAX   // 2147483647L
    #endif
    

    ヘルプの EE_VIEW_TO_DEV メッセージ (Editor_ViewToDev インライン関数) には説明を追加しました。
    この度は詳細なご報告をいただき、ありがとうございました。

    Yutaka

    #19505

    v14.4.3 beta 1で問題が修正されてるのを確認しました。
    ありがとうございました。

1 件の投稿を表示中 (合計 5 個)
  • このトピックに返信するにはログインしてください。