◀マクロトップへ
  • 641 画面表示開始行の取得方法
    • 642 Re:画面表示開始行の取得方法
      • 643 Re2:画面表示開始行の取得方法
        • 644 Re3:画面表示開始行の取得方法
          • 645 Re4:画面表示開始行の取得方法
  • [641] 画面表示開始行の取得方法 NaKIT 2017年09月12日 22:36

    マクロの命令 SetViewTop を使用すると,
    表示する一番上の行の行番号を指定することができますが,
    現在何行目から表示されているかを取得するにはどうすればよいのでしょうか?
    • [642] Re:画面表示開始行の取得方法 berryzplus 2017年10月06日 23:27

      ▼ NaKITさん
      > マクロの命令 SetViewTop を使用すると,
      > 表示する一番上の行の行番号を指定することができますが,
      > 現在何行目から表示されているかを取得するにはどうすればよいのでしょうか?

      実装ベースで確認したところ、方法はありませんでした。
      現状、サクラエディタには存在しない機能です。


      マクロから使える全ての機能は、
      以下のファイルで実装されています。

      https://sourceforge.net/p/sakura-editor/code/4196/tree/sakura/trunk2/sakura_core/macro/CSMacroMgr.cpp

      ・VB的にSubな関数群
      sakura_core\macro\CSMacroMgr.cpp(43): MacroFuncInfo CSMacroMgr::m_MacroFuncInfoCommandArr[] =

      ・VB的にFunctionな関数群
      sakura_core\macro\CSMacroMgr.cpp(411): MacroFuncInfo CSMacroMgr::m_MacroFuncInfoArr[] =


      値を返す関数群「m_MacroFuncInfoArr」に
      CEditWnd::getInstance()->GetActiveView()->m_pcTextArea->GetViewTopLine();
      を返す関数を追加してやれば良いです。

      需要があるとわかればきっと誰かが作ってくれる気がします。
      開発Uとかでアピってみてください。

      もしくは、これを機にC言語開発に挑戦してみるのもよいかもしれません。
      F_SETVIEWTOPを参考にF_GETVIEWTOPを定義し、
      他の部分は隣の処理からコピペしてくれば簡単に実現できる機能です。
      javascript等で他人のコードが読めるなら、不可能じゃないと思います。
      • [643] Re2:画面表示開始行の取得方法 berryzplus 2017年10月07日 16:32

        ちょっと考え直してパッチ投稿することにしました。
        https://sourceforge.net/p/sakura-editor/patchunicode/1112/

        この程度ならオレにもできる!
        と感じてもらえれば幸いです。

        • [644] Re3:画面表示開始行の取得方法 NaKIT 2017年10月08日 23:31

          ▼ berryzplusさん
          ありがとうございます。
          C++ は門外漢ですが,いただいた解説と実装例のパッチを拝見し,どうにかできそうな気になりました。

          実のところ,もともとの目的は,以下の Request「EOFが最上部に来るまでスクロール可能にする」
          http://sakura.qp.land.to/?Request%2F483
          をマクロでどうにかすることです。
          パッチ&ビルドが必要となると,私個人はともかく,Request の投稿者さんには敷居が高いですね。

          需要についてですが,表示開始行/桁が取得できると,エディタの舌触りというか,使用感を変更できるようになります。
          示していただいたサンプルのように,マクロでいろいろやった後に元の表示状態に戻すことが容易になります。
          段落移動・タグジャンプ・次/前検索・ブックマーク移動 などで,カーソル移動後の表示を望む場所にできます。

          正式版への採用をにらんで考えるに,仕様としては,新たに GetViewTop()・GetViewLeft() を増発するよりも,ChangeTabWidth(), ChangeWrapColm() のように,SetViewTop()・SetViewLeft()・CurLineCenter() の戻り値とした方が良いように思えます。

          取得のみ行いたいときは SetViewTop(), SetViewLeft() へ 0 を指定するわけです。
          • [645] Re4:画面表示開始行の取得方法 berryzplus 2017年10月09日 21:08

            さらに考え直してパッチとパッチ適用済みexeをwikiにあげときました。

            ▼ NaKITさん
            > 正式版への採用をにらんで考えるに,仕様としては,新たに GetViewTop()・GetViewLeft() を増発するよりも,ChangeTabWidth(), ChangeWrapColm() のように,SetViewTop()・SetViewLeft()・CurLineCenter() の戻り値とした方が良いように思えます。
            >
            > 取得のみ行いたいときは SetViewTop(), SetViewLeft() へ 0 を指定するわけです。

            いらないものが増えるのは困りそうですが、
            SetがあるのにGetがない状況は不自然だと思います。
            戻り値を返すようにするのは賛成ですけど、
            足りないものを補う増発はやむなしかな、と思います。


            あと、ややこしいんですが、
            SetViewTopは絶対レイアウト行番号を指定して
            その行が上端になるようにスクロールする機能です。
            正確な値が必要ならば、やはり取得関数が欲しいです。


            ここであるべき姿についてグダグダ語ったとしても
            きっと誰も読まないと思うのでそういうのは他所でやることにします。