【问题标题】:Avoid Ironruby from terminating itself after code executed避免 Ironruby 在代码执行后自行终止
【发布时间】:2014-05-15 08:54:02
【问题描述】:

我已经为 Ironruby 编写了一段非常非常简单的代码来检查是否一切正常:

require "System.Windows.Forms"
include System::Windows::Forms
form = Form.new
form.Show

当我将这段代码直接输入交互式 Ironruby 控制台时,它可以正常工作,但是当我将这段代码保存在 test.rb 文件中并通过命令提示符执行ir test.rb 时,Windows 窗体会在整个代码执行后立即弹出并关闭。 有没有办法避免这种行为?我尝试使用获取,但随后控制台正在等待输入,而窗体被冻结。

【问题讨论】:

    标签: ironruby


    【解决方案1】:

    是的。简单的答案就是将form.Show 更改为Application.Run form

    您的窗口在代码完成后立即关闭的原因需要了解模态窗口与非模态窗口。这是进一步阅读的链接:Displaying Modal and Modeless Windows Forms

    这里还有一个混合模态和非模态的例子:

    require 'System.Drawing'
    include System::Drawing
    require 'System.Windows.Forms'
    include System::Windows::Forms
    
    class Dlg <Form
        def initialize
            self.Text = 'Modal'
            self.Load do
                self.FormBorderStyle = FormBorderStyle.FixedDialog
    
                showHide = Button.new
                showHide.Text = 'Show'
                self.Controls.Add(showHide)
                showHide.Click do
                    if @modeless.nil?
                        @modeless = Form.new
                        @modeless.StartPosition = FormStartPosition.CenterScreen
                        @modeless.Text = 'Modeless'
                        @modeless.FormClosing { @modeless = nil; showHide.Text = 'Show' }
                    end
                    if @modeless.Visible
                        @modeless.Hide # hide a modeless form
                        showHide.Text = 'Show'
                    else
                        @modeless.Show # show a modeless form
                        showHide.Text = 'Hide'
                    end
                end
    
                ok = Button.new
                ok.DialogResult = DialogResult.OK
                ok.Text = 'OK'
                ok.Location = Point.new(0, showHide.Bottom+10)
                self.Controls.Add(ok)
    
                cancel = Button.new
                cancel.DialogResult = DialogResult.Cancel
                cancel.Text = 'Cancel'
                cancel.Location = Point.new(ok.Right+10, ok.Top)
                self.Controls.Add(cancel)
            end
        end
    end
    
    dlg = Dlg.new
    dlgResult = dlg.ShowDialog # show a modal dialog
    if dlgResult != DialogResult.OK
        MessageBox.Show('NOT OK') # MessageBox.Show is modal
    else
        MessageBox.Show('OK')
    end
    

    【讨论】:

    • 我忘记了这个问题,但还是谢谢你。目前我无法测试你的答案,但我会测试它(并给你反馈):)
    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2012-02-27
    相关资源
    最近更新 更多