如何在整个程序中显示Winform的单个实例?

时间:2011-08-16 13:07:19

标签: .net winforms show delphi-prism single-instance

如果我的问题和描述看起来太简单或者其他人已经提出过,请接受我的道歉。

我之前可能会问过类似的问题。但是,我仍然对winform感到困惑。假设你有一个带有 Mainform,Form1,Form2,Form3 的Delphi prism .net程序。此外,您希望能够在Mainform,Form2和Form3中显示Form1的单个瞬间。你是怎样做的?我必须在整个程序中根据需要显示一个winform,以在RichTextBox中显示应用程序错误。这意味着可以在我的程序中的任何地方随时调用SysErrorDlg winform来显示程序错误。对于我来说,如果在我的整个程序中只能访问SysErrorDlg winform的单个实例,那么我就可以这样做。

按照下面非常简单的代码。这就是我想做的事情。

=========================================
Mainform

using
Form1;
Form2;
Form3;   

Mainform1 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
F1:Form1;
end;

constructor MainForm1;
begin
   F1 := new Form1;
end;

method Mainform1.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   F1.Show; // or ShowDialog;
end;

=====================================================
Form1

Form1 = class(System.Windows.Form)
private
public
constructor;
end;

constructor Form1;
begin

end;

=====================================================
Form2

using
Mainform;

Form2 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
end;

constructor Form2;
begin

end;

method Form2.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   MainForm1.F1.Show; // or ShowDialog;
end;

====================================================
Form3

Using
MainForm;

Form3 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
end;

constructor Form3;
begin

end;

method Form3.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   MainForm1.F1.Show; // or ShowDialog;
end;

============================================

甚至可以这样做吗?我的编译器不会让我声明一个全局的winform变量,但是抱怨它需要被识别为公共变量。即使有一个选项来启用此功能,我也不希望因为我喜欢将变量保持为私有或本地类的想法。

如果已经在Mainform中声明并实例化了form1的实例,那么如何将form1的实例传递给form2或form3?我理解show和showdialog是如何工作的。如果Form1实例在MainForm中,您将使用哪一行代码从Form2访问Form1实例?

您可以提供一些代码以及您的解释。

4 个答案:

答案 0 :(得分:1)

您可以使用ShowDialog()的帮助来实现此目的。例如,如果F1是Form1的Object,则首次使用F1.ShowDialog()调用form1将打开Form1,并且第二次在第一个实例窗口关闭之前不允许调用。但是F1.Show()将在每次调用时为Form1打开多个窗口。

答案 1 :(得分:1)

使用Form1.show()(而不是Form1.showdialog())显示form1。 然后使用隐藏而不是关闭来隐藏表单:Me.Hide()。这会使表单的实例运行,并且可以通过应用程序中的其他表单进行访问。

然后,例如,如果Mainform将文本放在Form1的richtextbox中,那么当Form2和Form3显示Form1时它将存在。

答案 2 :(得分:1)

听起来你需要使用 singleton-pattern 。 例如,在c#中我可以像这样定义 Form1

public partial class Form1 : Form
{
    static Form1 _theform;

    /// <summary>
    /// Gets the one and only instance of Form1.
    /// </summary>
    static public Form1 TheForm
    {
        get
        {
            if ( null == _theform )
            {
                _theform = new Form1();
            }

            return _theform;
        }
    }

    protected Form1()
    {
        InitializeComponent();
    }
}

然后,在我的应用程序中的任何地方,我都可以通过这样做获得Form1的相同实例:

Form1.TheForm.Show();

答案 3 :(得分:0)

我认为保持表单的实例处于活动状态可能不是最好的方法。我建议将日志记录与日志显示分开。

我们的想法是使用.NET中可用的技术进行日志记录和/或跟踪(即静态Trace类),并简单地附加一个特定的侦听器,该侦听器将跟踪整个应用程序中所有记录的条目,并提供读取 - 访问此日志。

然后,您可以在需要时显示您的日志窗口。此日志窗口只是访问侦听器并使用数据绑定在文本字段中显示侦听器内容。

通过使用数据绑定,您还可以确保只要在日志中写入新条目,显示就会自动更新。

通过这种方式,您可以在需要时关闭并重新设置表单,而不会“围绕”您目前遇到的限制。