全局窗口形式。本地或私人窗口表格

时间:2011-08-04 14:21:40

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

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

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

就全局窗口表格而言,当您无法传递表单实例时,您希望如何在事件中以编程方式从程序的其他部分更改“SAME”窗口表单属性作为参数。如果窗体不是全局的,那么每当它们的程序需要显示或更改其属性时,必须在本地实例化一个新窗体,但是新窗体将与您打开的第一个窗体不同。如果在私有,受保护或公共部分下的类中声明表单,则需要实例化该类,然后需要实例化表单本身并在需要的地方传递。我相信你会遇到其他一些编程问题。

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

我并没有试图说明全球变坏的整个想法。我只是想了解为什么以及以何种方式。

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

谢谢,

1 个答案:

答案 0 :(得分:4)

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

主要表格:

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();
    }
}

的Program.cs:

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

输出(除了这个简单的例子之外的美丽):

enter image description here

现在,如果您关闭计时器表单然后尝试显示它,这会破坏,但您需要为该场景编码,如果需要重新创建表单(或者在主表单关闭之前不允许表单关闭)