Ошибка сегментации в FXRuby после двойного щелчка в ячейке FXTable

Я пишу приложение на FXRuby, в котором я использую контроллер для переключения экранов. На одном экране у меня есть таблица, к которой я подключил обработчик событий для двойного щелчка.

При двойном щелчке по ячейке в таблице после переключения экранов (в основном удаляя текущего дочернего элемента из родительского и заменяя его новым), я получаю ошибку сегмента.

Если событие происходит от нажатия кнопки или нажатия на пустую область в таблице, оно успешно завершает действие. Только двойной щелчок по ячейке приводит к проблеме.

Код ниже показывает проблему. Если я дважды нажму на одну из ячеек, она будет сброшена.

Почему я получаю сегфо?

require 'fox16'
require 'singleton'

include Fox

class Controller
  include Singleton
  attr_accessor :display_window

  def switch_screen(screen_class, create = true)
    if @current_window
      display_window.removeChild(@current_window)
    end
    @current_window = screen_class.new(display_window)
    display_window.create if create
  end
end

class Screen1 < FXVerticalFrame
  def initialize(parent)
    super(parent, opts: LAYOUT_FILL)
    button = FXButton.new(self, "Next")
    button.connect(SEL_COMMAND) {|sender, selector, data|
      Controller.instance.switch_screen(Screen2)
    }
    table = FXTable.new(self, opts: LAYOUT_FILL|TABLE_READONLY|TABLE_NO_COLSELECT|TABLE_NO_ROWSELECT)
    table.setTableSize(1, 2)
    table.setItemText(0, 0, "Test")
    table.setItemText(0, 1, "Test")
    table.connect(SEL_DOUBLECLICKED) {|sender, selector, data|
      Controller.instance.switch_screen(Screen2)
    }
  end
end

class Screen2 < FXVerticalFrame
  def initialize(parent)
    super(parent, opts: LAYOUT_FILL)
    button = FXButton.new(self, "Back")
    button.connect(SEL_COMMAND) {|sender, selector, data|
      Controller.instance.switch_screen(Screen1)
    }
  end
end

class BAPITest < FXMainWindow

  def initialize(app)
    super(app, "Test App", width: 800, height: 600)
    @top_window = FXVerticalFrame.new(self, opts: LAYOUT_FILL)
    controller = Controller.instance
    controller.display_window = @top_window
    controller.switch_screen(Screen1, false)
  end

  def create
    super
    show(PLACEMENT_SCREEN)
  end
end

if __FILE__ == $0
  FXApp.new do |app|
    BAPITest.new(app)
    app.create
    app.run
  end
end

0 ответов

Другие вопросы по тегам