Selcuk SZR Ответов: 1

Текстовые свойства меток C# не изменяются, и приложение выдает ошибку невозможно скопировать


Я пытаюсь сделать простые цифровые часы без использования таймера. Консольная версия работает нормально, но версия формы-нет. текстовые свойства меток по-прежнему отображаются по умолчанию .Текстовые значения (метка1,метка2 и т. д.), Когда приложение запускается.

Приложение также дает "не удалось скопировать ". obj\Debug\blabla.exe " чтобы "bin\Debug\blabla.exe" ошибка всякий раз, когда я пытаюсь внести некоторые изменения, чтобы заставить его работать так, как ожидалось.

Это метод, который я использую в классе Form1:

public void Time()
        {
            int[] saat = new int[6];
            saat[0] = DateTime.Now.Hour;
            saat[1] = DateTime.Now.Minute;
            saat[2] = DateTime.Now.Second;
            saat[3] = DateTime.Now.Day;
            saat[4] = DateTime.Now.Month;
            saat[5] = DateTime.Now.Year;
        baslangic:
            label1.Text = saat[0].ToString();
            label2.Text = saat[1].ToString();
            label3.Text = saat[2].ToString();
            label4.Text = saat[3].ToString();
            label5.Text = saat[4].ToString();
            label6.Text = saat[5].ToString();

            for (;;)
            {

                if (DateTime.Now.Hour != saat[0])
                {
                    saat[0] = DateTime.Now.Hour;
                    label1.Text = "";
                    goto baslangic;

                }

                else if (DateTime.Now.Minute != saat[1])
                {
                    saat[1] = DateTime.Now.Minute;
                    label2.Text = "";
                    goto baslangic;

                }
                else if (DateTime.Now.Second != saat[2])
                {
                    saat[2] = DateTime.Now.Second;
                    label3.Text = "";
                    goto baslangic;

                }
                else if (DateTime.Now.Day != saat[3])
                {
                    saat[3] = DateTime.Now.Day;
                    label4.Text = "";
                    goto baslangic;

                }
                else if (DateTime.Now.Month != saat[4])
                {
                    saat[4] = DateTime.Now.Month;
                    label5.Text = "";
                    goto baslangic;

                }
                else if (DateTime.Now.Year != saat[5])
                {
                    saat[5] = DateTime.Now.Year;
                    label6.Text = "";
                    goto baslangic;

                }


            }


и метод Main() :

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            Form1 nesne = new Form1();
            nesne.Time();
        }



Метод Time () без goto:

public void Time()
        {
            int[] saat = new int[6];
            saat[0] = DateTime.Now.Hour;
            saat[1] = DateTime.Now.Minute;
            saat[2] = DateTime.Now.Second;
            saat[3] = DateTime.Now.Day;
            saat[4] = DateTime.Now.Month;
            saat[5] = DateTime.Now.Year;
            while (true)
            {
                label1.Text = saat[0].ToString();
                label2.Text = saat[1].ToString();
                label3.Text = saat[2].ToString();
                label4.Text = saat[3].ToString();
                label5.Text = saat[4].ToString();
                label6.Text = saat[5].ToString();


                for (;;)
                {

                    if (DateTime.Now.Hour != saat[0])
                    {
                        saat[0] = DateTime.Now.Hour;
                        label1.Text = "";
                        break;

                    }

                    else if (DateTime.Now.Minute != saat[1])
                    {
                        saat[1] = DateTime.Now.Minute;
                        label2.Text = "";
                        break;

                    }
                    else if (DateTime.Now.Second != saat[2])
                    {
                        saat[2] = DateTime.Now.Second;
                        label3.Text = "";
                        break;

                    }
                    else if (DateTime.Now.Day != saat[3])
                    {
                        saat[3] = DateTime.Now.Day;
                        label4.Text = "";
                        break;

                    }
                    else if (DateTime.Now.Month != saat[4])
                    {
                        saat[4] = DateTime.Now.Month;
                        label5.Text = "";
                        break;

                    }
                    else if (DateTime.Now.Year != saat[5])
                    {
                        saat[5] = DateTime.Now.Year;
                        label6.Text = "";
                        break;

                    }


                }


Что я уже пробовал:

Сделать ярлыки общедоступными и поместить основные коды под основными(),
Создание события загрузки для Form1 и размещение там кодов.

1 Ответов

Рейтинг:
9

OriginalGriff

Ошибка "не удается скопировать" обычно возникает из-за использования exe-файла: убедитесь, что вы правильно закрыли его, прежде чем пытаться скомпилировать в будущем. Если приложение запущено, вы не можете заменить exe-файл новой версией.

И, честно говоря, именно этот код используется: это цикл, чем выходы nevr, потому что вы используете goto чтобы отправить его обратно в любом состоянии "если".
Прекратить использование goto Забудьте о его существовании даже на несколько лет - после чего у вас, вероятно, будет достаточно опыта, чтобы понять, когда вы должны использовать его, а когда нет: и последнее "почти всегда". За все те долгие годы, что я кодирую с помощью C#, мне ни разу не пришлось использовать goto Они делают ваш код трудным для чтения, трудным для обслуживания и трудным для написания. Вместо этого используйте "правильные" конструкции цикла.

И почему ваши ярлыки никогда не меняются? Потому что ваш цикл никогда не завершается, а это значит, что система не "оборачивается", чтобы покрасить дисплей приложения.
Если вы хотите постоянно отображать время, вам нужно настроить таймер (используйте интервал 500, чтобы он обновлялся каждые полсекунды) и использовать событие Tick для обновления метки один раз каждый раз. Не ставьте петлю в тиковое событие!


Selcuk SZR

Спасибо за ваш ответ! Я просто заменяю goto циклом while, но он по-прежнему не обновляет метку.Текст, я знаю, что делать это с таймером-лучший способ, но я хочу, чтобы это работало без него, и пытаюсь понять, почему это не работает таким образом

OriginalGriff

Вы не можете сделать это без таймера.
Приложения Windows (в отличие от консольных приложений) так не работают: дисплей не обновляется постоянно, он просто выглядит так!
Что происходит в приложениях Windows, так это то, что они работают над чем-то, называемым "очередью сообщений" (которая .NET framework преобразуется в события) - при изменении свойства Text метки она сохраняет новое значение и выдает сообщение "paint me" в форму, содержащую его. Он попадает в очередь сообщений, и когда он выводится из очереди, генерируется событие Paint и изменяется фактическое отображение элемента управления. Но если ваш метод не возвращается, то очередь сообщений никогда не проверяется и события рисования не генерируются. Так что ваш дисплей никогда не обновляется.
Используйте таймер-это самый простой способ (если не единственный, но я действительно не хочу начинать путать вас с потоковой передачей).

Selcuk SZR

Теперь я понимаю, почему это не сработало. Я не знал, что приложения для windows работают таким образом. Я очень ценю вашу помощь, большое вам спасибо!

OriginalGriff

Пожалуйста!