【问题标题】:Global Window Form Vs. Local or private Window Form全局窗口形式与。本地或私有窗口窗体
【发布时间】:2011-08-04 22:49:03
【问题描述】:

自从我开始为 .NET 阅读并使用各种语言编写程序以来,有人告诉我,您的程序中任何内容的“全局”都是非常非常糟糕的。整个想法对我来说似乎没有任何意义。在过去的 10 到 13 年里,我一直是一名程序员/软件开发人员,我开始接受这样一个事实,即作为一名程序员,有时你不能只编写代码而不使用全局对象或变量。

全局变量或对象确实会导致程序中的错误,但这并不意味着这是由于编程语言或编译器本身,而是程序员本人.

就全局窗口窗体而言,当您无法传入窗体实例时,您如何期望能够以编程方式从程序的其他部分更改“SAME”窗体属性?作为参数。如果窗口窗体不是全局窗体,则每次程序需要显示或更改其属性时都必须在本地实例化一个新窗体,但新窗体将与您打开的第一个窗体不同。如果表单在 private、protected 或 public 部分下的类中声明,则需要实例化该类,然后需要实例化表单本身并在需要的地方传递。我相信您在这样做时会遇到其他一些编程问题。

我什至不知道他们为什么会改变 CLOSE 方法的真正定义。关闭意味着关闭而不是处置。

我并不是要贬低 Global 不好的整个想法。我只是想了解原因和方式。

有人可以解释一下并给我一个例子,说明如何在没有单个“全球”窗口形式甚至变量的情况下完全编程?假设一个程序有两个窗口窗体。一个是主窗体,另一个窗体有一个 Ttimer 和一个标签。主窗体有一个 Tbutton 和单击事件,可打开第二个窗体。第二种形式 Timer 有一个 Tick 事件,每秒将当前日期和时间设置为其标签文本属性。当您单击 TButton 时,它应该打开第二个窗体并每秒显示当前日期和时间。现在向我展示我在 C# 或 Delphi XE 或 prism 或 C++ 或 VB 中描述的上述程序的代码,没有任何全局变量。

谢谢,

【问题讨论】:

  • 为什么第二个窗体不能是主窗体的私有成员变量,通过Form.Show()和Form.Hide()隐藏或显示?

标签: .net winforms global-variables instantiation delphi-prism


【解决方案1】:

这是一个非常基本的版本,没有全局计时器表单(没有用于处理等或取消注册事件的代码,但你明白了):

主窗体:

public partial class MainForm : Form
{
    // local reference to the timer form
    private readonly TimerForm _timerForm;

    public MainForm()
    {
        InitializeComponent();

        // just create it once
        _timerForm = new TimerForm();
    }

    private void btnShowDateTime_Click(object sender, EventArgs e)
    {
        // show the form, no need to instantiate it
        _timerForm.Show();
    }
}

定时器形式:

public partial class TimerForm : Form
{
    private Timer _timer = new Timer();

    public TimerForm()
    {
        InitializeComponent();
        _timer.Interval = 1000;
        _timer.Tick += _timer_Tick;
        _timer.Start();
    }

    void _timer_Tick(object sender, EventArgs e)
    {
        lblDateTime.Text = DateTime.Now.ToString();
        lblDateTime.Refresh();
    }

    private void btnHide_Click(object sender, EventArgs e)
    {
        // hide the form rather than closing it
        this.Hide();
    }
}

程序.cs:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}

输出(这个简单的例子除了美观):

现在,如果您关闭计时器表单然后尝试显示它,这会中断,但您会针对这种情况编写代码,如果需要重新创建表单(或者在主表单关闭之前不允许关闭表单) .

【讨论】:

  • 这是一个丑陋的例子。使用 FormClosed 事件将变量设置回 null。我认为这是 OP 的挂断。
  • hans Passant 这并不是我真正的问题,但 Jason Down 的例子虽然不是我所期望的语言,但确实澄清了我的困惑。
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多