Глобальная форма окна Vs. Локальная или приватная форма окна - PullRequest
1 голос
/ 04 августа 2011

С тех пор, как я начал читать и программировать на разных языках для .NET, мне сказали, что "Глобальное" что-либо в вашей программе очень и очень плохо. Вся эта идея, кажется, не имеет никакого смысла для меня. Будучи программистом / разработчиком программного обеспечения в течение последних 10–13 лет, я признаю тот факт, что иногда вы как программист не можете просто программировать, не используя глобальные объекты или переменные.

Это правда, что Глобальная переменная (и) или Объект (ы) могут привести к ошибкам в вашей программе, но это не значит, что это связано с языком программирования или самим компилятором, а с самим программистом. .

Что касается глобальных оконных форм, как вы ожидаете, что вы сможете программно изменять свойства формы окна "SAME" из других частей вашей программы в рамках события, когда вы не можете передать экземпляр формы в качестве параметра. Если оконная форма не является глобальной, нужно создавать новую форму локально каждый раз, когда их программе требуется отобразить или изменить ее свойства, но тогда новая форма не будет такой же, как первая открытая форма. Если форма объявлена ​​внутри класса в закрытом, защищенном или публичном разделе, то необходимо создать экземпляр класса, а затем создать саму форму и передать ее везде, где это необходимо. Я уверен, что при этом у вас возникнут другие проблемы с программированием.

Я даже не знаю, почему они могли бы изменить истинное определение метода CLOSE. Закрыть означает закрыть, не утилизировать.

Я не пытаюсь опровергнуть идею о том, что Глобал плохой. Я просто пытаюсь понять, почему и каким образом.

Может кто-нибудь объяснить и привести пример того, как можно было бы программировать полностью без единой "GLOBAL" формы окна или даже переменной (ей)? Допустим, программа имеет две оконные формы. Одна является основной формой, а другая имеет Ttimer и метку. Основная форма имеет кнопку Tbutton и click, которая открывает вторую форму. Таймер второй формы имеет событие Tick, которое устанавливает текущую дату и время в свойствах текста метки каждую секунду. Когда вы нажимаете кнопку TButton, она должна открыть вторую форму и отображать текущую дату и время каждую секунду. Теперь покажите мне код для вышеупомянутой программы, которую я описал в C # или Delphi XE или prism или C ++ или VB БЕЗ ГЛОБАЛЬНОЙ ПЕРЕМЕННОЙ (S).

Спасибо

1 Ответ

4 голосов
/ 04 августа 2011

Вот очень простая версия без формы глобального таймера (без кода для удаления и т. Д. Или отмены регистрации событий, но вы поняли):

Основная форма:

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

Теперь это может сломаться, если вы закроете форму таймера, а затем попытаетесь ее показать, но вы будете писать код для этого сценария, воссоздая форму при необходимости (или не позволяя закрывать форму до закрытия основной формы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...