0

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

我以前可能问过类似的问题。但是,我仍然对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 变量,但抱怨它需要被标识为公共变量。即使有启用此功能的选项,我也不想因为我喜欢将变量保持为私有或类本地的想法。

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

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

4

4 回答 4

1

您可以ShowDialog()为此目的使用帮助。例如,如果 F1 是 Form1 的对象,那么通过F1.ShowDialog()第一次调用 form1 将打开 Form1,第二次在第一个实例窗口关闭之前不允许调用。但是F1.Show()每次调用都会打开 Form1 的多个窗口。

于 2011-08-16T13:21:58.950 回答
1

Form1.show()使用(而不是)显示 form1 Form1.showdialog()。然后使用 Hide 而不是 Close 来隐藏表单:Me.Hide()。这会留下一个表单实例运行,并且它可以被应用程序中的其他表单访问。

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

于 2011-08-16T14:33:18.507 回答
1

听起来您需要为此使用单例模式。例如,在 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();
于 2011-08-17T03:22:41.853 回答
0

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

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

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

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

这样,您可以在需要时关闭并重新实例化表单,而无需“破解”您当前遇到的限制。

于 2011-08-17T11:17:15.713 回答