Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30

Счетчик нажатий кнопки и удаление файла после 10-ти нажатий

25.11.2018, 00:06. Показов 7818. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла такая проблема
В программе необходимо скачать видео и после 10-ти просмотров удалить. Причем у программы-приложения должно быть сохранение при закрытии/открытии и счет должен продолжаться с момента закрытия. Написал код: скачивает (распаковывает, если нужно), включает плеер, подсчитывает и сохраняет количество просмотров. Программа полностью работает, ошибок нет. Но при сохранении "Остался 1 просмотр", при следующем старте приложения происходит удаление файла видео (преждевременно) и просмотр последнего десятого раза не происходит. Не могу понять в чём я ошибся, прошу помощи опытных товарищей.
C#
1
2
3
4
 public partial class Form1 : Form
    {
        int k1 = 0;
        int k2 = 0;
...........................
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private void button12_Click(object sender, EventArgs e)
        {
            k1++;
 
            if (k1 >= 10)
                
            {
                FileInfo file = new FileInfo(@"C:\Users\Администратор\Documents\SeansDownload\1.WMV");
                if (file.Exists == true) //Если файл существует
                File.Delete("C:\\Users\\Администратор\\Documents\\SeansDownload\\1.WMV"); //Удаляем
            }
            
            if (k1 >= 10)
                k1 = 0;
            {
                String[] ss = new String[10] { "Осталось  10  просмотров", "Осталось  9  просмотров", "Осталось  8  просмотров", "Осталось  7  просмотров", "Осталось  6  просмотров", "Осталось  5  просмотров", "Осталось  4  просмотра", "Осталось  3  просмотра", "Осталось  2  просмотра", "Остался  1  просмотр" };
                label9.Text = ss[k1];
            }  
        }
...............................
C#
1
2
3
4
5
6
7
8
9
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Properties.Settings.Default.ButClik12 = k1;
            Properties.Settings.Default.Lab9 = label9.Text;
            Properties.Settings.Default.ButClik13 = k2;
            Properties.Settings.Default.Lab10 = label10.Text;
 
            Properties.Settings.Default.Save();
        }
C#
1
2
3
4
5
6
7
private void Form1_Load(object sender, EventArgs e)
        {
            k1 = Properties.Settings.Default.ButClik12;
            label9.Text = Properties.Settings.Default.Lab9;
            k2 = Properties.Settings.Default.ButClik13;
            label10.Text = Properties.Settings.Default.Lab10;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2018, 00:06
Ответы с готовыми решениями:

Счетчик нажатий кнопки на ATMega8535
Зравствуйте, задача такая: На вход PA7 подаются импульсы с кнопки, выход счетчика семисегментный индикатор. В исходном состоянии показывает...

счетчик нажатий кнопки в форме
Доброго времени суток господа. Делаю базу клиентов. Имеется форма для внесения приобретаемого товара клиентом. Имеется кнопка вносящее...

Счетчик уникальных нажатий кнопки +1
Здравствуйте.Смотрел в поиске. про ситуацию с БД не нашел. Есть таблица "Статьи" в базе данных mysql со статьями. Есть...

52
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
20.12.2018, 23:02  [ТС]
Студворк — интернет-сервис помощи студентам
Не получается. Если не сохранять, то после 10-го просмотра (с 1-2 секундной задержкой) удаляет. если сохраняться на последнем сеансе, то при нажатии "смотреть" - файл удаляется и плеер висит. Как и на моём видео.
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
20.12.2018, 23:56
Так я же написал, что позже отвечу.
Так оно и есть. Ошибка в вашем коде в том что вы
Запускаете сеанс
Увеличиваете счетчик
Проверяете его значение и если оно больше 10 - удаляете
Т.е. если значение было 9 - плеер сначала откроется. потом вы увеличивает счетчик (он становится 10) и следом вы удаляете файл, таким образом не давая пользователю возможности досмотреть его последний раз.

Вторая проблема в том что вы стразу выводите сообщение о количестве оставшихся просмотров. При этом если счетчик равен 10 - такого индекса в вашем массиве нет.

Вообщем, попробуйте вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
            //если счетчик меньше 10 (например 9, тогда последнее отображение - остался 1 просмотр)
            if (k1 < 10)
            {
                //запускаем
                WMP1.URL = @"C:\Users\Default\Videos\SeansDownload\Seance 1.WMV";
 
                //увеличиваем счетчик
                k1++;
            }
            else
            {
                //Удаляем 
                File.Delete(@"C:\Users\Default\Videos\SeansDownload\Seance 1.WMV");
 
                //сбрасываем счетчик
                k1 = 0;
            }
 
            String[] ss = new String[11] //11 вместо 10
            {
                "Осталось  10  просмотров",
                "Осталось  9  просмотров",
                "Осталось  8  просмотров",
                "Осталось  7  просмотров",
                "Осталось  6  просмотров",
                "Осталось  5  просмотров",
                "Осталось  4  просмотра",
                "Осталось  3  просмотра",
                "Осталось  2  просмотра",
                "Остался  1  просмотр",
                "Осталось 0 просмотров" // просмотров больше нет
 
            };
 
            label9.Text = ss[k1];
Мне лично такая логика не нравится. Чтобы удалить файл у которого не осталось просмотров - пользователь должен нажать плей. Это логично?
Я считаю что нет. Вначале должна быть проверена возможность просмотра. И файлы, просмотр которых невозможен - вообще не должны быть пользователю предоставлены.
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
21.12.2018, 01:07  [ТС]
Я тоже считаю это не логично. Файл должен просматриваться 10-ть раз и обязательно удаляться, возвращая доступ к кнопке "Скачать", если пользователь захочет повторить сессию из следующих 10-ти просмотров. Т.е. тут должен быть, как бы, циклический процесс: 10,9,8,7,6,5,4,3,2,1,удаление - и снова кнопка "Скачать"... 10,9,8,7........
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
21.12.2018, 02:33
Лучший ответ Сообщение было отмечено aziat-s как решение

Решение

Я думаю, тогда лучше при запуске увеличивать счетчик, а проверять его в событии плеера. Если ролик доиграл до конца или пользователь его остановил кнопкой стоп - то счетчик проверяется и если дальнейший просмотр невозможен - видео удаляется.

Дальше по логике должна быть установлена видимость кнопок. (если видео удалено, т.е. файлов нет - пользователь вместо кнопки плей должен увидеть кнопку скачать).

Сейчас только увидел, у вас видимость кнопок и лейблов сразу устанавляивается в false при нажатии на кнопку Play. Т.е. тут дополнительных действий не потребуется.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
        private void button12_Click(object sender, EventArgs e)  // кнопка "Смотреть" и начала просмотра Сеанса 1
        {
            button12.Visible = false;
            button13.Visible = false;
            button6.Visible = false;
            button7.Visible = false;
            button1.Enabled = false;
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            button5.Enabled = false;
            WMP1.Visible = true;
            pictureBox1.Visible = false;
            pictureBox2.Visible = false;
            label1.Visible = false;
            label2.Visible = false;
            label9.Visible = false;
            label10.Visible = false;
 
            //загрузили файл
            WMP1.URL = @"C:\Users\Default\Videos\SeansDownload\Seance 1.WMV"; //сеанс 1 конечно же
 
            //увеличили счетчик
            k1++;
            
        }
 
        private void WMP1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) //видео-плеер
        {
            //если ролик доиграл или пользователь его остановил снопкой стоп
            if (e.newState == 8 || e.newState == 1)
            {
                //закрыли плеер
                this.WMP1.close();
 
                //убрали плеер
                this.WMP1.Visible = false;
 
                string path1 = @"C:\Users\Default\Videos\SeansDownload\Seance 1.WMV";
                string path2 = @"C:\Users\Default\Videos\SeansDownload\Seance 2.WMV";
 
                String[] ss = new String[10] { "Осталось  10  просмотров", "Осталось  9  просмотров", "Осталось  8  просмотров", "Осталось  7  просмотров", "Осталось  6  просмотров", "Осталось  5  просмотров", "Осталось  4  просмотра", "Осталось  3  просмотра", "Осталось  2  просмотра", "Остался  1  просмотр" };
 
 
                //проверяем счетчики удаляем
                if (k1 > 9)
                {
                    File.Delete(path1);
                    k1 = 0;
                }
 
                //отображаем количество просмотров
                label9.Text = ss[k1];
 
                if (k2 > 9)
                {
                    File.Delete(path2);
                    k2 = 0;
                }
 
                //отображаем количество просмотров
                label10.Text = ss[k2];
 
 
                //если файлы не были удалены
                if (File.Exists(path1))
                {
                    label9.Visible = true;
                    button12.Visible = true;
                }
                if (File.Exists(path2))
                {
 
                    label10.Visible = true;
                    button13.Visible = true;
                }
 
                pictureBox1.Visible = true;
                pictureBox2.Visible = true;
                label1.Visible = true;
                label2.Visible = true;
                panel2.Visible = false;
                panel3.Visible = false;
                button6.Visible = true;
                button7.Visible = true;
                WMP1.Visible = false;
                button1.Enabled = true;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
                button5.Enabled = true;
            }
        }
Добавлено через 8 минут
1
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
21.12.2018, 18:04  [ТС]
Да! Так всё работает. У меня ещё небольшой вопрос: Как будет правильней?
C#
1
if (k1 > 9)
или
C#
1
if (k1 >= 10)
Работают оба варианта одинаково.
И ещё один момент: после 10-го (последнего просмотра) плеер "замирает" на 2,5-3 секунды (видимо происходит удаление файла) и потом исчезает с формы. Можно ли это "зависание" сократить? В принципе, не сильно страшно, но эта "шероховатость", как бы бросается в глаза.

Добавлено через 25 минут
Вот ролик с программкой https://youtu.be/D2vS-Bdsdig
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
22.12.2018, 06:51
Ну что ж, тогда поздравляю вас с первым написанным приложением!

Да, действительно, операция удаления занимает некоторое время и приостанавливает работу программы. Дополнительно, из ваших видео я понял, что у вас не самая быстрая машина (у меня во всех случаях плеер закрывается мгновенно, т.е. воспроизвести проблему на 100% мне не удалось).

Тогда, надо запускать удаление файла в отдельном потоке. Часть кода, которую надо переписать:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                //проверка счетчиков и удаление
                if (k1 > 9)
                {
                    var t = Task.Run(() => File.Delete(path1));
                    t.Wait();
                    k1 = 0;
                }
 
                //отображаем количество просмотров
                label9.Text = ss[k1];
 
                //проверка счетчиков и удаление
                if (k2 > 9)
                {
                    var t = Task.Run(() => File.Delete(path2));
                    t.Wait();
                    k2 = 0;
                }
 
                //отображаем количество просмотров
                label10.Text = ss[k2];
Цитата Сообщение от aziat-s Посмотреть сообщение
Работают оба варианта одинаково.
Результат один и тот же. Но с точки зрения логики - правильный вариант - первый. Логически, мы проверяем не превышает ли счетчик крайнего значения. На сколько он превышает, нас не интересует. Превышает - выполняется операция. Нет - она не выполняется. Крайнее значение счетчика 9. Второй вариант говорит о том, что ожидается определенное значение, которому счетчик должен быть равен или быть больше этого значения. И это значение 10. Нигде в логике такого значения нет. И мы не ожидаем никакого определенного значения, ни 10, ни сколько то еще. Превысил или нет, вот все что нас интересует. Понятно, что 10 == превышению крайнего значения, если оно 9. Но логически это неверный ход.
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
22.12.2018, 14:36  [ТС]
Огромная благодарность за пояснения и помощь. Действительно, мой DELL 17.4 дюймовый ноутбук с i7 уже в "возрасте", но работает надёжно и без нареканий почти 10 лет, поэтому я к нему привык, как к "старым тапочкам". Попробую ваш вариант и другую машину.
Можно ещё вопрос? Как лучше реализовать масштабирование приложения при запуске? Я думаю, что не совсем верно запускать приложение во весь экран, это пользователь должен делать сам по своему усмотрению. В Visual Studio есть функция для формы, чтобы её минимизировать при открытии с указанием размеров, но при этом происходит "скрытие" некоторых элементов на форме. Есть ли какие-то методы смещения элементов на форме в видимую часть окна при этом?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
24.12.2018, 09:12
Цитата Сообщение от aziat-s Посмотреть сообщение
i7 уже в "возрасте", но работает надёжно и без нареканий почти 10 лет
Да ладно ?

Добавлено через 3 минуты
Цитата Сообщение от aziat-s Посмотреть сообщение
Есть ли какие-то методы смещения элементов на форме в видимую часть окна при этом?
можно сделать, но будет не очень легко.
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
24.12.2018, 15:49  [ТС]
Ну, почти (с марта 2010), а зовут мою "зверушку" Dell Studio 1747 (Intel Core i7 820QM, 8 GB DDR3, 1 ТБ 7200) - не в качестве рекламы, но вот эта модель оказалась на удивление удачной, удобной и живучей.
Касаемо масштабирования, на данном этапе - тогда ограничусь средствами Visual Studio уменьшения размеров формы при старте приложения. Мои познания в С# ещё "желают много лучшего" и самостоятельно я, видимо, пока этот вопрос быстро не вытяну. В дальнейшем же при появлении новых мыслей по обновлению программы можно будет и этот вопрос попробовать решить. Считаю своим долгом в описании программы упомянуть об этом форуме и вашей персональной помощи. Если вы сочтёте это приемлемым и возможным, прошу сообщит мне (можно в личку) ваше имя и фамилию. Ещё раз благодарю за помощь и пользуясь случаем поздравляю с наступающим Новым Годом!

Добавлено через 1 час 44 минуты
Вопрос о своих личных данных адресуется уважаемому escoult
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
24.12.2018, 17:37
Ни в коем случае!
Нет, я не считаю это приемлемым или возможным, и позвольте, не стану объяснять почему. Бесспорно я ценю вашу благодарность. Но не нужно упоминать моих данных или указывать ссылку на мой профиль или никнейм на этом форуме.

С наступающим новым годом и вас!
1
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
24.12.2018, 18:45  [ТС]
Понял, не буду. Считаю, что данную тему форма можно считать, как РЕШЕНО.
Всех благ всем участникам форума в наступающем Новом 2019 году и новых творческих успехов!
1
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 30
25.12.2018, 16:53  [ТС]
Один маленький вопрос (не совсем по теме), видимо я что-то "накуралесил" в Studio, даёт два предупреждения, которых раньше не было. Как это побороть?
Миниатюры
Счетчик нажатий кнопки и удаление файла после 10-ти нажатий  
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
26.12.2018, 07:51
Цитата Сообщение от aziat-s Посмотреть сообщение
Один маленький вопрос (не совсем по теме), видимо я что-то "накуралесил" в Studio, даёт два предупреждения, которых раньше не было. Как это побороть?
Миниатюры
Запустили анализатор кода. Он показывает это предупреждение, как только в проекте появляется ссылка на wmp.dll. Это невозможно исправить, к сожалению. Ошибка находится в самой библиотеке. Но это не влияет на работоспособность. Можете просто игнорировать эти предупреждения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2018, 07:51

Блокировка кнопки после 2-х нажатий
всем привет! интересует вопрос, как сделать ограничение на нажатие кнопки. есть такой код, он работает, но нужно, чтобы не...

Деактивация кнопки после нескольких нажатий
Помогите пожалуйста!! Есть задание, в котором нужно после нескольких нажатий на кнопку сделать её неактивной (типа количество попыток)....

Сохранение xml после n нажатий кнопки
есть код, который сохраняет xml документ с данными, но необходимо произвести сохранение после n нажатий на кнопку, т.е. сначала заполнить...

Блокировка кнопки после 3 нажатий и активация через 3 секунды
Необходимо соединить два скрипта, при нажатии 3 раз подряд на кнопку, она должна блокироваться на 10 секунд. &lt;html&gt; &lt;head&gt; ...

После нескольких нажатий на кнопки приложение начинает глючить
Всем привет, возникла такая проблема. Есть приложение с несколькими кнопками, суть в том, что при нажатии они меняют цвет прямоугольника,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru