0

Windowsフォームでリッチテキストボックスをシミュレートするために作成しようとしているクラスを作成しました。これは、フォーム/リッチテキスト ボックスに新しいデータを追加すると、ボックス/ウィンドウの下部に追加され、残りが 1 行上にスクロールされることを意味します。

を有効scrollok()にしようとしましたが、スクロールしたくないようです。バグなのか、実装方法が間違っているのかわかりません。

class Textpad
        attr_accessor :data, :name, :window
        def initialize(name, height, width, startx, starty)
                @data   = []
                @name   = name
                @height = height
                @width  = width
                @startx = startx
                @starty = starty
                Ncurses.refresh
                @window =  Ncurses.newwin(height, width, starty, startx)
                @window.scrollok true
                @window.wrefresh
        end

        def add(packetid, username, message)
                @data.push [Time.new.strftime('[%T]'), packetid, username, message]
                @data.shift if @data.length > 500
        end

       def draw
                Ncurses.init_pair(1, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(2, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(3, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(4, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK)

                @window.wclear
                position = 0
                @data.each do |timestamp, packetid, username, message|
                        case packetid
                                when '1005'
                                        @window.mvwprintw(1*position, 1, "#{timestamp} «#{username}» #{message}")
                                        @window.mvchgat(1*position, timestamp.length+2, 1, Ncurses::A_NORMAL, 3, NIL)
                                        @window.mvchgat(1*position, timestamp.length+3+username.length, 1, Ncurses::A_NORMAL, 3, NIL) #colorize the symboles around the username

                        end
                        position += 1
                end
                @window.wrefresh
        end
end

問題は Textpad クラスの draw メソッド内にあります。Textpad クラスのデータ配列を何百ものエントリで埋めることができますが、スクロールせずに (ウィンドウの下部に達するまで) 配列の最上部のみが書き込まれます。手動で画面をスクロールする必要がありますか?ドキュメントから、カーソルが一番下に達して別の行が追加されると、自動的にスクロールする必要があると書かれています。

4

1 に答える 1