Понимаю, что так себе шутка в реалиях 2к22, но все же надеюсь, что ПО для ядерного чемоданчика написано без применения .NET "- А вот тут, Владимир Владимирович, видите маленькое окошечко с надписями 'ДА / НЕТ' ? Вот так нажимаете кнопочку 'НЕТ' и ракеты никуда не полетят. Что, говорите, что будет если не нажимать и просто закрыть крышку? А вот давайте прямо сейчас и проверим!"
Используя return внутри linq foreach мы делаем возврат из лямбда-функции (тела) foreach, отчего и не выходим глобально. Если же сделать return в основном коде, в данном случае в методе Form_Load, то продолжаться оно не будет. Интересно, что Exit не работает, да, возможно это не работает в контексте Shell. Про то, что винда сама решает нажать скрытно "да", также допускаю, что программа, получив сигнал на закрытие себя, в контексте Shell, имеет такой артефакт, что продолжает выполняться, но "более не имея права показа окон" автоматом выполняет какую-то логику. Не доводилось работать с Shell в программе, поэтому подробностей не знаю. Но, что в программировании хватает порой танцев с бубном, факт) Почему-то с самого начала, как код увидел, подумал об этом, что "оно же будет в любом случае продолжаться после отработки действия /key". Обычный linq foreach не "поточный", он последовательно выполняет действия, а вот если добавить уже AsParallel(), то организуется система многопоточного выполнения. Затем же, когда всё перенесли в обычный foreach и добавили внутри условие на существование ключа, то если ключей несколько на выходе Environment.GetCommandLineArgs(), то мы ведь для каждого аргумента, который не key, будем вызывать сценарий else. Более прозрачно всё таки сперва определиться, есть нужный нам ключ, или нет. Если есть, то делаем то-то, иначе то-то. Linq удобен, но не всегда он к месту, а "писать всю программу в одну строчку", это можно до абсурда дойти, что читать будет сложно.
Спасибо за интересное видео. Рекомендую, и сам этим пользуюсь, все "странные" места в программе снабжать достаточно подробным комментарием, который объясняет, зачем этот странный код был добавлен (например, "Без этой операции приложение не закрывается при таком-то условии"). Это очень помогает, когда через продолжительное время возвращаешься к коду, видишь его как в первый раз, и может появиться соблазн провести "оптимизацию" - выбросить лишние, на первый взгляд, строчки кода. Самые трудные ошибки или особенности языка программирования или операционной системы, на отладку которых потрачено много времени, имеет смысл вносить в какой-то отдельный документ (хотя бы тезисно), который периодически неплохо перечитывать, чтобы не наступать на одни и те же грабли дважды.
Если цель видео - рассказать о баге, то лучше в названии видео указать суть проблемы, чтобы люди, которые с ней столкнутся, но совершенно не знакомы с твоим каналом, могли найти видео, решить проблему, и о тебе тоже узнать))
@@XpucT вот конкретного описания нету. Думаю главная проблема здесь это в универсальности .Net, т.е он должен работать на разных системах после сборки, а они один метод сделали для нескольких систем. А может быть такое, что ошибка с тем, что программа автоматически решает связана с message box? По идее он открывается другим потоком, так же и форч, имеем того три потока: основная программа, форч, message box, но message box в режиме show может быть только один. При нажатии кнопки OK где-то на глубинном уровне он соответствует Yes.
@@ЛёхаЛёхин-у6н эта проблема воспроизводится даже в JavaScript. Поэтому молодцы, что лайки поставили на идею, но лучше названия пока ещё нет. То есть названо пока лучше всего. И теги всё равно есть и ищет он по ним.
Привет, Хачатур. На самом деле все вполне логично. Когда ты на 9:14 написал return, ты выходишь не из метода Form1_Load, а из анонимного метода, который передал в ForEach. Application.Exit не работает хз почему, в WinForms в принципе много вещей работают не как нужно. Для гарантированного выхода из программы не нужно городить никаких костылей с вызовом cmd и прочей шушерой - достаточно вызвать Environment.Exit.
@@ПашаХЗ-м8й Я верю. Вопрос открыт по поводу самопрожатия. Почему-то многим захотелось докопаться до реализации. Я же специально привёл несколько прмиеров, это не важно. Важно то, что код если и пропустился, но видос бы не снял, если бы не было произвольного нажатия на Да. Весь смысл видео в этом. Один сидит рассказывает про то, что Я видишь ли неверно понимаю Application.ExitI(), другой говорит про return внутри ForEch. Ощущение, что видео мотнули где-то к концу и прослушали от момента Application.ExitI() и до первой попытки return. Вопрос остаётся открытым, ибо нет объяснения ни у кого, какого хера проскальзывает событие на прожатие. И понятно, что объяснение должно быть и записано либо WM_DESTROY state 0, как уже кто-то говорил или по другой причине, факт остаётся фактом, что такого быть не должно. То есть можно вызвать две проблемы, не зная о том, как устроен Application.Exit() И уж если на то пошло, совсем правильно было писать код так, как пока никто в комментах не написал, а именно: if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key"))) { // Наш код return; } *ПРОФИТ* Но вопрос остаётся открытым.... Мне продолжать?
Я что-то не догоняю. Ладно, легаси фреймворк в 2022. Но: - Любая такая проблема изначально была бы решена разделением логики приложения от представления, сразу исключились бы return и Application.Exit - return в конце лямбды ничего не делает - в любой нормальной книге не советуют использовать Application.Exit - приравнивается к говнокоду - ForEach не запускает код в другом потоке. Внутри метода обычный for, который вызывает делегат - .NET Framework и уж тем более C# к такому поведению имеет нулевое отношение, это не баг Советую автору видео взять любую книгу по С++ Win32 и попробовать написать простецкий message loop с выходом из цикла в callback, используя Win API. Ну или C# и p/invoke, но это без пояснений.
MessageBoxDefaultButton установите вторую кнопку (Button2) и будет возвращать "No". Нет ни какого бага тут, просто кто-то даже не знает параметры "MessageBox.Show()". Правильное решение использование инструкции if..else для разделения кода на две логических ветки: есть или нет аргумент "/key", потом в нужных блоках/ветках реализовывать логику.
Обновления это да... Не иметь же файл/роут с версией на сервере и её постоянно проверять (ну или с хешем) Ещё замена и перезапуск приложения без отдельного батника/exe нужна
@@hopexstudio6388 у меня не работало, ну попробую как-нибудь в следующий раз ещё разок, спасибо, но все равно этот способ какой-то костыльный по-моему, но наверное других вариантов и нет
@@XpucT Из Украины не оплатить, обидно, деньги не конвертируются в рубли и банк блокирует перевод. Может есть возможность владельцу про версии win 10 tweaker получить эту музыку бесплатно?
Чет никак не отпускает это видео. В общем мы вызвали Application.Exit() и тут же выдали messageBox с вопросом. Прервать выполнение функции Application.Exit() не может, что должно произойти дальше? И даже не это интересно, как закрыть этот месаджбокс так что бы код который ждет от него ответа сработал корректно? Мне кажется после вызова Application.Exit() будет правильным не пытаться делать что либо еще.
f1 на Exit() и там написано "Метод Exit останавливает все выполняемые циклы сообщений во всех потоках и закрывает все окна приложения. Этот метод не обязательно принудительно завершает работу приложения." Видимо при закрытии через Application.Exit(); он как то закрывает все окна приложений не мгновенно и походу на дефолтные кнопки в месседжбоксах "кликает", короче чтоб такого не было, сделал так if (MessageBox.Show("удалить?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { Registry.ClassesRoot.DeleteSubKeyTree(@"Directory\background\shell\Useless ARW Remover", false); } и норм работает. Как по мне это не баг, просто когда не знаешь всех тонкостей работы каких то классов, тогда и возникают такие иллюзии бага. Тыж сам недавно про отладчик выкладывал видео, взял бы да прошагал через Application.Exit(); и увидел что на этом код не обрывает а идёт дальше по методу. Вот он и шел дальше в твой using и открывает там диалоги (а потом exit как то видимо "нажатием дефолтных кнопок" закрывает их, не вникал глубоко), а про то что ты return пихал в foreach в расширяющих методах LINQ ниже писали в коментах, что он ток с стека расширающих методов LINQ выкидывает в тело метода void Form1_Load. Блин с моими знаниями уже наверное можно было бы где то работать в IT...
return у Вас делет выход из лямбда-выражения что в 39 строке, а не из метода Form1_Load. Напишите нормально логику метода! Разделите логику на ту, что выполняет нужный Вам процесс по работе с файлами и логику управления реестром на отдельные процедуры. Иначе у Вас каша в коде и Вы не можете полноценно управлять потоком выполнения программы. Application.Exit() не завершает текущий метод, а лишь посылает приложению сигнал о необходимости завершения. Но при этом Главный поток приложения по прежнему продолжает выполнение метода Form1_Load дальше. Да, есть небольшой баг с вызовом диалога в этом состоянии приложения (по всей видимости), когда оно уже приготовилось закрыться, А Вы командуете ему отображать диалог ещё раз. Наведите порядок в коде, проблем меньше будет.
Спасибо, Павел, за то, что уже было сказано в самом видео. Да, return в Generic работает для ForEach внутри. Спасибо, Павел, это уже сказано в видео. И да, чуть не забыл сказать, спасибо, что отметили это. Извиняюсь спросить, т.к. явно не достаточно опытен, в отличие от вас, но всё же, спрошу: У вас есть объяснение тому, по какой причине отработало событие MessageBox, если не было нажато на кнопку Да? Да, само собой, в коде нужно навести порядок, а то беспорядок и скорее всего это даже помешает вам сконцентрироваться на вопросе, но тем не менее. А если серьёзно, Паша... давай ты не будешь учить отца ебаться. Если по делу нечего сказать, доёбывай до синтаксиса там, где сказано доебаться. В этом видео сказано, что не играет роль ни стилистика, ни методы вызова, ни то, как это смогу обойти. К слову, Я так и знал, что под видео придут эксперды и прям ждал наиболее изящный выход в args. И кто бы мог подумать =) Никто не написал лучше того, что сам же Я написал в тут же в комментах. Вам, ребят, делать нехуй что ли, Я не пойму, ходить по видео и поправлять всех, даже тогда, *когда по-русски очень ясно и дважды было сказано* не обращать внимания на то, что не имеет отношения к коду. В самом начале даже было сказано про то, как не нужно писать код. Но нет, найдётся Павел, блять, который сейчас нахуй всех тут научит кодить и наведёт порядок...
Ох уже этот майкрософт, внутри программы всё работает более менее нормально, но как только ты хочешь как то взаимодействовать с виндой, надо юзать костыли, красивые покрытые лаком костыли. Причем удивляет то как из винды в винду мелкомягкие тащат рудименты из совсем старых операционок. Я понимаю они пытаются в обратную совместимость, но выходит это у них слабо. Будет видос про горячие клавиши и их сочетания? Спасибо))
Можно билдить консольное приложение с "Output type = Windows application" (чтобы не было окна консоли). Для mbox добавить зависимость к Winforms. В итоге не нужны формы вообще, да и экзешник меньше выйдет. А зачем парсить один аргумент таким странным способом? Почему не args.Contains(arg)? static void Main(string[] args) { if(args.Contains("/key")) { MessageBox.Show("Test"); } else { //add/remove } } Про то, что оно само проходит проверку на if(mbox == Yes) - странно, но скорее всего связано с тем, что Application.Exit не форсит закрытие программы, а делает "gracefull" shutdown, значит какой-то код после может успеть выполниться и полагаться на моментальный выход не стоит Может быть после Application.Exit завершается message loop для формы и mbox просто не открывается и возвращает Yes, или создаётся(но не показывается) окно и закрывается сразу же, возвращая тот же Yes, но это всего лишь догадки.
В ms доках написано, что после вызова Application.Exit: "A FormClosing event is raised for every form represented by the OpenForms property.". Mbox так же закрывается, что в итоге возвращает Yes (видимо оно идёт как дефолт, что странно).
@@АлександрСоколов-э1ц Не понял к чему это. Как можно установить значение по умолчанию для mbox? Если вы про дефолт значение для DialogResult - то странно, почему Yes является дефолт (первым) значением
@@quezi6735 Вернёт то что установлено в MessageBoxDefaultButton (по умолчанию первая кнопка - Button1). Если установить Button2, будет возвращаться "No". Изначально этот параметр определяет какая кнопка по умолчанию будет выделена. У окна WinForm других значений не может быть, кроме которых определяет кодер.
А если отлавливать этот момент перед запуском цикла и записи/удаления в реестр, и вызывать, допустим, два разных метода: delete...(path) и registryUpdate()?
Ниже в комментах предлагались разные варианты, более короткий и изящный Я предложил также в комментах. if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key"))) { // Наш код return; } Однако, проблема с багом открыта. А конкретно произвольное нажатие на Да ┐('~`;)┌
привет. мне кажется, что никакой проблемы нет. каша только из-за того, что все лежит в одном методе. return в Linq foreach вылетает из лямбды (из конкретной итерации, остальные продолжают независимо выполняться) - аналог continue в обычном foreach, если просто. итоговый код: private void OnLoad() { var args = Environment.GetCommandLineArgs(); if (args.Any(x => x.Equals("/key", StringComparison.OrdinalIgnoreCase))) { DeleteARWFiles(); } else { UpdateContextMenu(); } Application.Exit(); } в UpdateContextMenu будет message box, который заблочит поток выполнения и приложение не вылетит, пока юзер не нажмет кнопку.
Привет 🖐 Как вариант - да. Но это опять же то же самое, что bool или разбирать на методы. Проблема-то всё равно есть и об этом нужно помнить, что каждый код нужно тщательно проверять.
Мне кажется студии виднее, что ты хочешь сделать, поэтому она и удаляет ключ из реестра 🤣🤣🤣. Я думаю если результат работы вывести в лог, там будут сообщения типо : "На получи ... собачье, приложение он решил досрочно закрыть". Кстати, а если сделать остановку выполнения кода, на using, он останавливается?
может в данном случае return не работает в generic foreach потому что туда передается стрелочная функция? то есть return привязан к ней, а не к form_load
А ты не думал, что это особенность винды и работы её реестра? Возможно, системы безопасности... Когда у тебя пропал пункт меню, надо было нажать обновить и ещё раз посмотреть, возможно всё вернулось бы. А вообще, ощющение, что запись в реестре не сохраняется, а не перескакивает условие. Т.е. как в блокноте, изменения внёс, но перед выходом не сохранил результат.
А можно я спрошу? Я на этом - не программировал, но везде, где я 20 лет программировал, нельзя было корректно проверять на равенство Null. Ну никогда. Были всякие IsNull, IsNil, и прочие, но если увижу if x==null - сральник вспоминает всю полученную попаболь.. Это что означает? Что разработчики инструментов настолько "пошли навстречу" джунам, что разрешили и это?
Предполагаю что вот этот Application.Exit() и делает это все. Закрывает приложение и жмет кнопки, но он не выходит из функции Form1_Load, как и return в ForEach как бы и не должен. И дальнейшие действия выполняются, возможно даже эти диалоги появляются и закрываются моментально, не успев нарисоваться. А Application.Exit() должен закрыть приложение, и видимо устанавливает какие то флажки что всё - приложение уже в процессе завершения. А если приложение, что то там пытается спрашивать messageBox ами, то их тоже нужно как то закрыть, и видимо так "некрасиво" это реализовано, что бы там не выскакивало закрываем его тупо нажимая дефолтную кнопку.
@@iamdozerq базовая отрисовка делается без использования шейдеров. Те же основые точки куба(даже с шейдерами). Если рисовать много точек сразу через parallelStream, то изображение начинает моргать и сыпаться в разных местах
@@DenisShaver вообще задача очень страшная... Рисовать очень много точек в кадр разных цветов(для отрисовки кривых) и open gl, я передаю массивы позиций точек, т.к. это было единственное решение, что не резало производительность до 1 фпс
@@yamaxila Я так понял, юзаете классический код OpenGL ) В OpenGL изначально рендер был однопоточным, в многопотоке может поломаться логика стейтов и дроуколов, осюда и сыпится всё. В последних версиях можно распараллелить грамотнее, но и код сложнее будет. А почему не пишете в шейдерах, ведь они заточены под монотонную обработку больших массивов данных?
Добрый день, классное видео, очень полезное, благодарю. Если есть возможность, хотелось бы послушать мысли про ИИ, тема сейчас сильно популярная. Еще раз благодарю.
Привет. Скажи пожалуйста, как в C# определить ratio (соотношение сторон экрана) монитор(а)? Чтобы итоговое ratio было как общепринятые например 2560 × 1080 это 21:9. Все способы что нашел в интернете даёт не верные результаты.
у меня нечто подобное было, но в WF, многие методы не работают, т.к не учитывают масштабирование в виндоус, если установлено 125% и тд, если найду проект то подскажу решение.
Не знаю актуально ещё или нет. Это было написано давно, возможно поможет) foreach (var screen in System.Windows.Forms.Screen.AllScreens) { Console.WriteLine(string.Format("{0}:{1}", screen.Bounds.Width / GCD(screen.Bounds.Width, screen.Bounds.Height), screen.Bounds.Height / GCD(screen.Bounds.Width, screen.Bounds.Height))); } int GCD(int a, int b){int Remainder;while (b != 0){Remainder = a % b;a = b;b = Remainder;}return a;}
У меня одного SDA не открывает трейды ? Пишет:Trade confirmations failed to open You are missing a dependency required to view trade confirmations. Would you like to install it now? А С++ установлены и до этого работало, ни с чего сломалось
Это не просто тема, это полностью авторская переработка всего интерфейса Visual Studio, над которой Я работал 3 месяца. Тут не просто красиво, а полезно для глаз, подробнее об этом Я рассказывал в видео для спонсоров: th-cam.com/users/XpucTcommunity Тема, доп.материалы и эксклюзив становится доступным сразу, как становишься спонсором канала. Для пользователей из России: boosty.to/xpuct/posts/940db4d5-965d-45f4-b8e9-fbef765669b3?share=post_link
Лучше того, что уже давал сам в комментах нет: if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key"))) { // Код return; } Специально дал фору высказаться разрабам, но предложения были либо хуже, либо объясняют, что Application.Exit() нужно менять на Environment.Exit(0); Хотя нужно не решение, а обратить внимание, что вызовом такой комбинации кода можно словить баг. Это именно баг. Это не особенность понимания Application.Exit() или коряво продуманный синтаксис. В самом начале было сказано, что сейчас покажу, как писать не нужно. И вот каждый второй пишет Мне, что так писать не нужно. Вариантов масса, но баг - есть баг. Не нужно решение, нужно, чтобы самопрожатие кнопки Да не было. Не важно, что это было вызвано тем, что код проскочил. Важно то, что было самопрожатие кнопки Да. И вот прочтя всё это, удивишь Меня чем-то? Вперёд.
Проблема, вероятнее всего, в неправильной оптимизации под капотом, нарушившей логику и это привело к условию якобы нажатия Yes - наверняка на уровне кода ничего нигде не нажимается, просто "оптимизированное" условие теперь работает неправильно и выходит на ветку с удалением строки реестра. А оптимизация кода полюбому есть, лямбда-выражения - это не просто игрушка с удобной возможностью впихнуть логику куда-то, под капотом это весьма сложная вещь, требующая аккуратного обращения. После 17-ой минуты вариант без LINQ (т.е. без условия, заданного через лямбду) прекрасно работает, просто неправильно перебрали аргументы. Как вариант: закинуть код на SharpLab, и посмотреть что там "наоптимизируется".
Да, я тоже сталкивался. В обычных листах 200+ элементов мог 1 или 2 пропустить. Два дня тогда убил что бы понять, что в этом была проблема. Так же поменял на классический цикл всё стало нормально
Кстати в .NET есть один очень, очень неприятный баг: при переименовании файла.cs в котором содержится код формы (по умолчанию Form1.cs), через обозреватель решений приводит к тому, что изменения в конструкторе не компилируются и не добавляются в код дизайнера.
Немного конспирологии! :D Мне кажется, ForEach "цепляет" одну из скрытых функций винды для несанкционированной пользователем активации некоторых фенкций программ... Типа когда приложение спрашивает, согласны ли вы на передачу данных пользовательских, а оно жамкает "Да" без участия человека)) т.е. это глубокозаныканный в дотНет "баг", который не баг, но на который пользователи случайно вышли :D Лан, это просто немного бреда)) наверняка все гораздо проще...
Нельзя забывать, что в массиве GetCommandLineArgs() всегда первым элементом будет путь к программе! То есть, args = { Путь к exe, /key } Это вполне может послужить причиной, в начале 17 минуты так наверняка. Но то, что он каким-то образом сам нажал на Yes в меседжбоксе - для меня остаётся вне понимания)
У Меня не блокируются комменты и в папку Спам ничего уже на TH-cam не летит. Такое случается теперь без ведома автора, поэтому чтобы избежать таких проблем следуй 3 правилам: 1. Не ставь сам себе лайк на коммент 2. Не пости ссылку в комменте 3. Не дублируй своё сообщение, которое уже оставлял точь в точь на другом канале
@@XpucT IMHO нужно вызывать Application.Exit(). А там либо дублировать, что не DRY, либо ветвление. Как понял из видоса, проблема в том, что состояние программы неочевидно перетекает из 1 блока в другой. Что и решается ветвлением
Понимаю, что так себе шутка в реалиях 2к22, но все же надеюсь, что ПО для ядерного чемоданчика написано без применения .NET
"- А вот тут, Владимир Владимирович, видите маленькое окошечко с надписями 'ДА / НЕТ' ? Вот так нажимаете кнопочку 'НЕТ' и ракеты никуда не полетят. Что, говорите, что будет если не нажимать и просто закрыть крышку? А вот давайте прямо сейчас и проверим!"
Используя return внутри linq foreach мы делаем возврат из лямбда-функции (тела) foreach, отчего и не выходим глобально.
Если же сделать return в основном коде, в данном случае в методе Form_Load, то продолжаться оно не будет.
Интересно, что Exit не работает, да, возможно это не работает в контексте Shell. Про то, что винда сама решает нажать скрытно "да", также допускаю, что программа, получив сигнал на закрытие себя, в контексте Shell, имеет такой артефакт, что продолжает выполняться, но "более не имея права показа окон" автоматом выполняет какую-то логику.
Не доводилось работать с Shell в программе, поэтому подробностей не знаю. Но, что в программировании хватает порой танцев с бубном, факт)
Почему-то с самого начала, как код увидел, подумал об этом, что "оно же будет в любом случае продолжаться после отработки действия /key".
Обычный linq foreach не "поточный", он последовательно выполняет действия, а вот если добавить уже AsParallel(), то организуется система многопоточного выполнения.
Затем же, когда всё перенесли в обычный foreach и добавили внутри условие на существование ключа, то если ключей несколько на выходе Environment.GetCommandLineArgs(), то мы ведь для каждого аргумента, который не key, будем вызывать сценарий else.
Более прозрачно всё таки сперва определиться, есть нужный нам ключ, или нет. Если есть, то делаем то-то, иначе то-то.
Linq удобен, но не всегда он к месту, а "писать всю программу в одну строчку", это можно до абсурда дойти, что читать будет сложно.
Молюсь, чтобы таких комментаторов, как Ты, на канале было больше 🙏
146 % нужно видео по cmd. Сам работаю разработчиком на C#, может что нового узнаю.
Спасибо за интересное видео. Рекомендую, и сам этим пользуюсь, все "странные" места в программе снабжать достаточно подробным комментарием, который объясняет, зачем этот странный код был добавлен (например, "Без этой операции приложение не закрывается при таком-то условии"). Это очень помогает, когда через продолжительное время возвращаешься к коду, видишь его как в первый раз, и может появиться соблазн провести "оптимизацию" - выбросить лишние, на первый взгляд, строчки кода.
Самые трудные ошибки или особенности языка программирования или операционной системы, на отладку которых потрачено много времени, имеет смысл вносить в какой-то отдельный документ (хотя бы тезисно), который периодически неплохо перечитывать, чтобы не наступать на одни и те же грабли дважды.
Если цель видео - рассказать о баге, то лучше в названии видео указать суть проблемы, чтобы люди, которые с ней столкнутся, но совершенно не знакомы с твоим каналом, могли найти видео, решить проблему, и о тебе тоже узнать))
Ты прав, поэтому в тегах всё есть.
А название ещё нужно придумать, потому что непонятно кто виноват и что именно корявое...
@@XpucT добавь описание, пусть не понятное и кривое, по идее это поможет вбив в поисковике(а они и на описание реагируют) найти данное видео.
@@ЛёхаЛёхин-у6н есть конкретное предложение?
Озвучивай =)
@@XpucT вот конкретного описания нету. Думаю главная проблема здесь это в универсальности .Net, т.е он должен работать на разных системах после сборки, а они один метод сделали для нескольких систем.
А может быть такое, что ошибка с тем, что программа автоматически решает связана с message box? По идее он открывается другим потоком, так же и форч, имеем того три потока: основная программа, форч, message box, но message box в режиме show может быть только один. При нажатии кнопки OK где-то на глубинном уровне он соответствует Yes.
@@ЛёхаЛёхин-у6н эта проблема воспроизводится даже в JavaScript.
Поэтому молодцы, что лайки поставили на идею, но лучше названия пока ещё нет. То есть названо пока лучше всего.
И теги всё равно есть и ищет он по ним.
Привет, Хачатур. На самом деле все вполне логично. Когда ты на 9:14 написал return, ты выходишь не из метода Form1_Load, а из анонимного метода, который передал в ForEach.
Application.Exit не работает хз почему, в WinForms в принципе много вещей работают не как нужно. Для гарантированного выхода из программы не нужно городить никаких костылей с вызовом cmd и прочей шушерой - достаточно вызвать Environment.Exit.
тоже сказать хотел что можно же через Environment.Exit схлопнуть программу.
Возможно конечно там есть какие то свои нюансы о которых мы не знаем)
Привет 🖐
Environment.Exit не работает. Его тоже проверяли.
@@XpucT Я проверял сегодня лично! Все работает. Тебе нужен полный пример. Тестил в .net core
@@ПашаХЗ-м8й Я верю. Вопрос открыт по поводу самопрожатия.
Почему-то многим захотелось докопаться до реализации. Я же специально привёл несколько прмиеров, это не важно. Важно то, что код если и пропустился, но видос бы не снял, если бы не было произвольного нажатия на Да. Весь смысл видео в этом.
Один сидит рассказывает про то, что Я видишь ли неверно понимаю Application.ExitI(), другой говорит про return внутри ForEch.
Ощущение, что видео мотнули где-то к концу и прослушали от момента Application.ExitI() и до первой попытки return.
Вопрос остаётся открытым, ибо нет объяснения ни у кого, какого хера проскальзывает событие на прожатие.
И понятно, что объяснение должно быть и записано либо WM_DESTROY state 0, как уже кто-то говорил или по другой причине, факт остаётся фактом, что такого быть не должно. То есть можно вызвать две проблемы, не зная о том, как устроен Application.Exit()
И уж если на то пошло, совсем правильно было писать код так, как пока никто в комментах не написал, а именно:
if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
{
// Наш код
return;
}
*ПРОФИТ*
Но вопрос остаётся открытым....
Мне продолжать?
Я что-то не догоняю. Ладно, легаси фреймворк в 2022. Но:
- Любая такая проблема изначально была бы решена разделением логики приложения от представления, сразу исключились бы return и Application.Exit
- return в конце лямбды ничего не делает
- в любой нормальной книге не советуют использовать Application.Exit - приравнивается к говнокоду
- ForEach не запускает код в другом потоке. Внутри метода обычный for, который вызывает делегат
- .NET Framework и уж тем более C# к такому поведению имеет нулевое отношение, это не баг
Советую автору видео взять любую книгу по С++ Win32 и попробовать написать простецкий message loop с выходом из цикла в callback, используя Win API. Ну или C# и p/invoke, но это без пояснений.
Да сколько можно....
Читай Мои ответы на такие же комменты.
@@XpucT Да сколько можно...
Не выкладывай мусор на ютуб.
MessageBoxDefaultButton установите вторую кнопку (Button2) и будет возвращать "No". Нет ни какого бага тут, просто кто-то даже не знает параметры "MessageBox.Show()".
Правильное решение использование инструкции if..else для разделения кода на две логических ветки: есть или нет аргумент "/key", потом в нужных блоках/ветках реализовывать логику.
Тема апдейта интересна, очень хотелось бы увидеть как без дополнительных ехе это реализовать
Ещё 1 полезное видео)
Было бы очень интересно узнать как работает обновление в Win10Tweaker. У меня тоже есть способ, но по мне он корявый.
Обновления это да... Не иметь же файл/роут с версией на сервере и её постоянно проверять (ну или с хешем)
Ещё замена и перезапуск приложения без отдельного батника/exe нужна
@@koriss1937 Генерировать новый процесс с мозгами батника, при этом как таковой батник не создавать, профит
@@hopexstudio6388 у меня не работало, ну попробую как-нибудь в следующий раз ещё разок, спасибо, но все равно этот способ какой-то костыльный по-моему, но наверное других вариантов и нет
Привет Хачатур, подскажи, пожалуйста, где я могу найти всю музыку которую ты вставляешь в видео? Я тащусь от этих лофи треков)
Привет 🖐
boosty.to/xpuct/posts/b1e7ce62-2aca-4a73-a704-023313557e42?share=post_link
@@XpucT Из Украины не оплатить, обидно, деньги не конвертируются в рубли и банк блокирует перевод. Может есть возможность владельцу про версии win 10 tweaker получить эту музыку бесплатно?
Привет, можно узнать если не секрет каким браузером ты пользуешься?, прост цент умер(
Воскрес еще 1 августа, а 2-ого, обновился.
Добро пожаловать на форум, чтобы не пропускать такие события.
Чет никак не отпускает это видео. В общем мы вызвали Application.Exit() и тут же выдали messageBox с вопросом. Прервать выполнение функции Application.Exit() не может, что должно произойти дальше? И даже не это интересно, как закрыть этот месаджбокс так что бы код который ждет от него ответа сработал корректно? Мне кажется после вызова Application.Exit() будет правильным не пытаться делать что либо еще.
f1 на Exit() и там написано "Метод Exit останавливает все выполняемые циклы сообщений во всех потоках и закрывает все окна приложения. Этот метод не обязательно принудительно завершает работу приложения."
Видимо при закрытии через Application.Exit(); он как то закрывает все окна приложений не мгновенно и походу на дефолтные кнопки в месседжбоксах "кликает", короче чтоб такого не было, сделал так
if (MessageBox.Show("удалить?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
Registry.ClassesRoot.DeleteSubKeyTree(@"Directory\background\shell\Useless ARW Remover", false);
}
и норм работает. Как по мне это не баг, просто когда не знаешь всех тонкостей работы каких то классов, тогда и возникают такие иллюзии бага.
Тыж сам недавно про отладчик выкладывал видео, взял бы да прошагал через Application.Exit(); и увидел что на этом код не обрывает а идёт дальше по методу. Вот он и шел дальше в твой using и открывает там диалоги (а потом exit как то видимо "нажатием дефолтных кнопок" закрывает их, не вникал глубоко), а про то что ты return пихал в foreach в расширяющих методах LINQ ниже писали в коментах, что он ток с стека расширающих методов LINQ выкидывает в тело метода void Form1_Load. Блин с моими знаниями уже наверное можно было бы где то работать в IT...
Здраввствуйте! Очень ждал еще одно видео от вас! определенно что-то интерестное!!!
return у Вас делет выход из лямбда-выражения что в 39 строке, а не из метода Form1_Load. Напишите нормально логику метода! Разделите логику на ту, что выполняет нужный Вам процесс по работе с файлами и логику управления реестром на отдельные процедуры. Иначе у Вас каша в коде и Вы не можете полноценно управлять потоком выполнения программы. Application.Exit() не завершает текущий метод, а лишь посылает приложению сигнал о необходимости завершения. Но при этом Главный поток приложения по прежнему продолжает выполнение метода Form1_Load дальше. Да, есть небольшой баг с вызовом диалога в этом состоянии приложения (по всей видимости), когда оно уже приготовилось закрыться, А Вы командуете ему отображать диалог ещё раз. Наведите порядок в коде, проблем меньше будет.
Спасибо, Павел, за то, что уже было сказано в самом видео. Да, return в Generic работает для ForEach внутри. Спасибо, Павел, это уже сказано в видео. И да, чуть не забыл сказать, спасибо, что отметили это.
Извиняюсь спросить, т.к. явно не достаточно опытен, в отличие от вас, но всё же, спрошу:
У вас есть объяснение тому, по какой причине отработало событие MessageBox, если не было нажато на кнопку Да?
Да, само собой, в коде нужно навести порядок, а то беспорядок и скорее всего это даже помешает вам сконцентрироваться на вопросе, но тем не менее.
А если серьёзно, Паша... давай ты не будешь учить отца ебаться. Если по делу нечего сказать, доёбывай до синтаксиса там, где сказано доебаться. В этом видео сказано, что не играет роль ни стилистика, ни методы вызова, ни то, как это смогу обойти. К слову, Я так и знал, что под видео придут эксперды и прям ждал наиболее изящный выход в args. И кто бы мог подумать =) Никто не написал лучше того, что сам же Я написал в тут же в комментах.
Вам, ребят, делать нехуй что ли, Я не пойму, ходить по видео и поправлять всех, даже тогда, *когда по-русски очень ясно и дважды было сказано* не обращать внимания на то, что не имеет отношения к коду. В самом начале даже было сказано про то, как не нужно писать код. Но нет, найдётся Павел, блять, который сейчас нахуй всех тут научит кодить и наведёт порядок...
Ох уже этот майкрософт, внутри программы всё работает более менее нормально, но как только ты хочешь как то взаимодействовать с виндой, надо юзать костыли, красивые покрытые лаком костыли. Причем удивляет то как из винды в винду мелкомягкие тащат рудименты из совсем старых операционок. Я понимаю они пытаются в обратную совместимость, но выходит это у них слабо.
Будет видос про горячие клавиши и их сочетания? Спасибо))
Про нажатие клавиш есть видео в плейлисте 👍
th-cam.com/play/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb.html
Ура новый ролик! Спасибо Хачатур за информативное видео!
Можно билдить консольное приложение с "Output type = Windows application" (чтобы не было окна консоли). Для mbox добавить зависимость к Winforms.
В итоге не нужны формы вообще, да и экзешник меньше выйдет. А зачем парсить один аргумент таким странным способом? Почему не args.Contains(arg)?
static void Main(string[] args)
{
if(args.Contains("/key"))
{
MessageBox.Show("Test");
}
else
{
//add/remove
}
}
Про то, что оно само проходит проверку на if(mbox == Yes) - странно, но скорее всего связано с тем, что Application.Exit не форсит закрытие программы, а делает "gracefull" shutdown, значит какой-то код после может успеть выполниться и полагаться на моментальный выход не стоит
Может быть после Application.Exit завершается message loop для формы и mbox просто не открывается и возвращает Yes, или создаётся(но не показывается) окно и закрывается сразу же, возвращая тот же Yes, но это всего лишь догадки.
В ms доках написано, что после вызова Application.Exit: "A FormClosing event is raised for every form represented by the OpenForms property.". Mbox так же закрывается, что в итоге возвращает Yes (видимо оно идёт как дефолт, что странно).
@@quezi6735 mbox вернёт то значение, которое будет установлено по умолчанию. Т.к. в видео значение не установлено, то вернёт он первое значение.
@@АлександрСоколов-э1ц Не понял к чему это. Как можно установить значение по умолчанию для mbox? Если вы про дефолт значение для DialogResult - то странно, почему Yes является дефолт (первым) значением
@@quezi6735 Вернёт то что установлено в MessageBoxDefaultButton (по умолчанию первая кнопка - Button1). Если установить Button2, будет возвращаться "No". Изначально этот параметр определяет какая кнопка по умолчанию будет выделена. У окна WinForm других значений не может быть, кроме которых определяет кодер.
А если отлавливать этот момент перед запуском цикла и записи/удаления в реестр, и вызывать, допустим, два разных метода: delete...(path) и registryUpdate()?
Ниже в комментах предлагались разные варианты, более короткий и изящный Я предложил также в комментах.
if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
{
// Наш код
return;
}
Однако, проблема с багом открыта. А конкретно произвольное нажатие на Да ┐('~`;)┌
привет.
мне кажется, что никакой проблемы нет. каша только из-за того, что все лежит в одном методе.
return в Linq foreach вылетает из лямбды (из конкретной итерации, остальные продолжают независимо выполняться) - аналог continue в обычном foreach, если просто.
итоговый код:
private void OnLoad()
{
var args = Environment.GetCommandLineArgs();
if (args.Any(x => x.Equals("/key", StringComparison.OrdinalIgnoreCase)))
{
DeleteARWFiles();
}
else
{
UpdateContextMenu();
}
Application.Exit();
}
в UpdateContextMenu будет message box, который заблочит поток выполнения и приложение не вылетит, пока юзер не нажмет кнопку.
Привет 🖐
Как вариант - да. Но это опять же то же самое, что bool или разбирать на методы.
Проблема-то всё равно есть и об этом нужно помнить, что каждый код нужно тщательно проверять.
Мне кажется студии виднее, что ты хочешь сделать, поэтому она и удаляет ключ из реестра 🤣🤣🤣. Я думаю если результат работы вывести в лог, там будут сообщения типо : "На получи ... собачье, приложение он решил досрочно закрыть". Кстати, а если сделать остановку выполнения кода, на using, он останавливается?
Нет, код всё равно пробирается и выполняет сценарий.
может в данном случае return не работает в generic foreach потому что туда передается стрелочная функция? то есть return привязан к ней, а не к form_load
Так точно.
А ты не думал, что это особенность винды и работы её реестра? Возможно, системы безопасности...
Когда у тебя пропал пункт меню, надо было нажать обновить и ещё раз посмотреть, возможно всё вернулось бы.
А вообще, ощющение, что запись в реестре не сохраняется, а не перескакивает условие. Т.е. как в блокноте, изменения внёс, но перед выходом не сохранил результат.
Нет, друг, всё это проверено многократно. Не нужно торкать Обновить в папке.
Я бы не снимал это видео, не разобравшись в вопросе =)
Привет, Хачатур,а там случайно в аргументы не добавляется какой-то мусор при запуске?
Привет 🖐 Нет =)
А можно я спрошу?
Я на этом - не программировал, но везде, где я 20 лет программировал, нельзя было корректно проверять на равенство Null.
Ну никогда.
Были всякие IsNull, IsNil, и прочие, но если увижу if x==null - сральник вспоминает всю полученную попаболь..
Это что означает? Что разработчики инструментов настолько "пошли навстречу" джунам, что разрешили и это?
Предполагаю что вот этот Application.Exit() и делает это все. Закрывает приложение и жмет кнопки, но он не выходит из функции Form1_Load, как и return в ForEach как бы и не должен. И дальнейшие действия выполняются, возможно даже эти диалоги появляются и закрываются моментально, не успев нарисоваться. А Application.Exit() должен закрыть приложение, и видимо устанавливает какие то флажки что всё - приложение уже в процессе завершения. А если приложение, что то там пытается спрашивать messageBox ами, то их тоже нужно как то закрыть, и видимо так "некрасиво" это реализовано, что бы там не выскакивало закрываем его тупо нажимая дефолтную кнопку.
Отличное видео! Жду видео о Win10Tweaker
Кстати, подобная проблема возникает и Java, если использовать parallelStream, что вызывает артефакты при отрисовке OpenGL
Хуя, а как потоки процессора связаны с шейдерами?
@@iamdozerq базовая отрисовка делается без использования шейдеров. Те же основые точки куба(даже с шейдерами). Если рисовать много точек сразу через parallelStream, то изображение начинает моргать и сыпаться в разных местах
@@yamaxila Точки через вершинный буфер задаёте?
@@DenisShaver вообще задача очень страшная... Рисовать очень много точек в кадр разных цветов(для отрисовки кривых) и open gl, я передаю массивы позиций точек, т.к. это было единственное решение, что не резало производительность до 1 фпс
@@yamaxila Я так понял, юзаете классический код OpenGL ) В OpenGL изначально рендер был однопоточным, в многопотоке может поломаться логика стейтов и дроуколов, осюда и сыпится всё. В последних версиях можно распараллелить грамотнее, но и код сложнее будет.
А почему не пишете в шейдерах, ведь они заточены под монотонную обработку больших массивов данных?
20:10 - Есть такое тоже :))))
я с# не учил, не можно ли сделать return(brake) и всё
Нижний brake или верхний?
Добрый день, классное видео, очень полезное, благодарю.
Если есть возможность, хотелось бы послушать мысли про ИИ, тема сейчас сильно популярная.
Еще раз благодарю.
Про ИИ обязательно будет видео.
Привет и спасибо за урок.
✌
Привет. Скажи пожалуйста, как в C# определить ratio (соотношение сторон экрана) монитор(а)?
Чтобы итоговое ratio было как общепринятые например 2560 × 1080 это 21:9.
Все способы что нашел в интернете даёт не верные результаты.
у меня нечто подобное было, но в WF, многие методы не работают, т.к не учитывают масштабирование в виндоус, если установлено 125% и тд, если найду проект то подскажу решение.
Не знаю актуально ещё или нет. Это было написано давно, возможно поможет)
foreach (var screen in System.Windows.Forms.Screen.AllScreens)
{
Console.WriteLine(string.Format("{0}:{1}", screen.Bounds.Width / GCD(screen.Bounds.Width, screen.Bounds.Height), screen.Bounds.Height / GCD(screen.Bounds.Width, screen.Bounds.Height)));
}
int GCD(int a, int b){int Remainder;while (b != 0){Remainder = a % b;a = b;b = Remainder;}return a;}
Приятно видеть новые ролики, спасибо!
Привет, очень ждал новое видео о программировании, думаю будет что-то интересное! Лайк сразу!
Хачатур ❤
❤
Здравствуйте, Хачатур! Очень бы хотелось увидеть видео по способу обновления Win10Tweaker
У меня одного SDA не открывает трейды ? Пишет:Trade confirmations failed to open You are missing a dependency required to view trade confirmations. Would you like to install it now?
А С++ установлены и до этого работало, ни с чего сломалось
Откат делал?
@@XpucT Не знаю, но я скачал заново его и это не помогло. Не знал что ты знаешь про SDA
Спасибо за видео! Не подскажите, что за тема в студии?
Это не просто тема, это полностью авторская переработка всего интерфейса Visual Studio, над которой Я работал 3 месяца. Тут не просто красиво, а полезно для глаз, подробнее об этом Я рассказывал в видео для спонсоров:
th-cam.com/users/XpucTcommunity
Тема, доп.материалы и эксклюзив становится доступным сразу, как становишься спонсором канала.
Для пользователей из России: boosty.to/xpuct/posts/940db4d5-965d-45f4-b8e9-fbef765669b3?share=post_link
Чёрная магия
Есть решение. Давать или нет?
Лучше того, что уже давал сам в комментах нет:
if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
{
// Код
return;
}
Специально дал фору высказаться разрабам, но предложения были либо хуже, либо объясняют, что Application.Exit() нужно менять на Environment.Exit(0); Хотя нужно не решение, а обратить внимание, что вызовом такой комбинации кода можно словить баг. Это именно баг. Это не особенность понимания Application.Exit() или коряво продуманный синтаксис. В самом начале было сказано, что сейчас покажу, как писать не нужно. И вот каждый второй пишет Мне, что так писать не нужно. Вариантов масса, но баг - есть баг. Не нужно решение, нужно, чтобы самопрожатие кнопки Да не было. Не важно, что это было вызвано тем, что код проскочил. Важно то, что было самопрожатие кнопки Да.
И вот прочтя всё это, удивишь Меня чем-то?
Вперёд.
Проблема, вероятнее всего, в неправильной оптимизации под капотом, нарушившей логику и это привело к условию якобы нажатия Yes - наверняка на уровне кода ничего нигде не нажимается, просто "оптимизированное" условие теперь работает неправильно и выходит на ветку с удалением строки реестра. А оптимизация кода полюбому есть, лямбда-выражения - это не просто игрушка с удобной возможностью впихнуть логику куда-то, под капотом это весьма сложная вещь, требующая аккуратного обращения. После 17-ой минуты вариант без LINQ (т.е. без условия, заданного через лямбду) прекрасно работает, просто неправильно перебрали аргументы. Как вариант: закинуть код на SharpLab, и посмотреть что там "наоптимизируется".
Преклонно благодарю вас, спаситель сенсей вы наш.
Поделись пожалуйста расширениями для студии
можете сделать видос об "как сохранить состаяние контролов формы и если возможно данных" в файле(.ini или другой какой-то файл настройки)?
win10tweaker.ru/forum/topic/лаунчер-который-парсит-информацию-из-in#postid-65043
👍
Да, я тоже сталкивался. В обычных листах 200+ элементов мог 1 или 2 пропустить. Два дня тогда убил что бы понять, что в этом была проблема. Так же поменял на классический цикл всё стало нормально
Разворачивайте в следующий раз окно на весь экран пожалуйста
здравствуйте хочу купить тему на notepad++ но не могу пополнить бусти
Добрый день 🖐
Можно через Telegram.
t.me/win10tweaker/171
Баг может и неприятный, но ролик смотреть о нем приятно.
А ведь есть же ещё Environment.Exit(0), тоже закрывает и выходит из приложения, но чем оно отличается от Application.Exit()?
Не сильно отличается в нашем случае =)
Где кот?😅
fНабегался, спит
@@XpucT Мило)
Кто-нибудь знает как Зделать listbox прозрачным и картинку поставить?
Кстати в .NET есть один очень, очень неприятный баг: при переименовании файла.cs в котором содержится код формы (по умолчанию Form1.cs), через обозреватель решений приводит к тому, что изменения в конструкторе не компилируются и не добавляются в код дизайнера.
Привет, спасибо за уроки!
🖐
Давай видос про кмд
как извлечь флешки на с#
th-cam.com/video/KYq2WF3otxc/w-d-xo.html
Немного конспирологии! :D
Мне кажется, ForEach "цепляет" одну из скрытых функций винды для несанкционированной пользователем активации некоторых фенкций программ... Типа когда приложение спрашивает, согласны ли вы на передачу данных пользовательских, а оно жамкает "Да" без участия человека))
т.е. это глубокозаныканный в дотНет "баг", который не баг, но на который пользователи случайно вышли :D
Лан, это просто немного бреда)) наверняка все гораздо проще...
по-моему линк суют всюду и он окончательно развратил человечество, вот вам и баги лезут.
То же самое хотел написать, но ты опередил )))
Спасибо за работу!
Давай видео с cmd
Думаю, было бы неплохо увеличить шрифт редактора, мелковат
Как давно я тебя ждал
В JavaScript forEach работает также, настолько привык, что даже сперва не понял в чём суть проблемы
😅
Собственно и бага в этом forEach не вижу, в JS аргумент который принимает метод forEach является отдельной функцией со своим return
Спасибо за видео!
Классный ролик по программированию , сколько же ты вариантов решения перебрал в этом ролике , ужас 😁
Во-во =))
11:10 ахахахах)))
по командным аргументам реально полезно
КМД паjojo!
Здравствуй! Го про обновление твикера. Ждём любые видосы.
Нельзя забывать, что в массиве GetCommandLineArgs() всегда первым элементом будет путь к программе!
То есть, args =
{
Путь к exe,
/key
}
Это вполне может послужить причиной, в начале 17 минуты так наверняка. Но то, что он каким-то образом сам нажал на Yes в меседжбоксе - для меня остаётся вне понимания)
Чет мне подсказывает, что при закрытии в результ код кидает фокусную кнопку по-умолчанию которая идет.
Написал длинный коммент. Похоже, в блок попал. Глянешь?
А так, спасибо за видос!
У Меня не блокируются комменты и в папку Спам ничего уже на TH-cam не летит.
Такое случается теперь без ведома автора, поэтому чтобы избежать таких проблем следуй 3 правилам:
1. Не ставь сам себе лайк на коммент
2. Не пости ссылку в комменте
3. Не дублируй своё сообщение, которое уже оставлял точь в точь на другом канале
Моё решение :
void Form1_Load(object sender, EventArgs e)
{
var Links = Environment.GetCommandLineArgs().Where(x => x.EndsWith("/removearw")).ToArray();
if (Links != null && Links.Length > 0)
{
ProcessFiles(Links); //Глумимся над файлами
}
else
{
MakeOffer(); //Запрос на добавление записи в реестр.
}
Application.Exit();
}
@@Dan.398
Можно ещё короче:
if (Environment.GetCommandLineArgs().Any(x => x.EndsWith("/key")))
{
//Глумимся над файлами
return;
}
но вопрос остаётся открытым по поводу самопроизвольного скачка в код ниже при Exit и самая жесть, это нажатие на Да.
@@XpucT IMHO нужно вызывать Application.Exit(). А там либо дублировать, что не DRY, либо ветвление.
Как понял из видоса, проблема в том, что состояние программы неочевидно перетекает из 1 блока в другой. Что и решается ветвлением
Хачатур когда ИИ?
Будет, Я помню =)
@@XpucTСпасибо бРатело, в твоем исполнении это будет БомбА! Ждем...
Очень интересно, но ничего непонятно 8)
Ты чертов Гений!
1:03 точняк зачем обновлять с таким то подходом
Очень интересно
Но ничего не понятно
Опасен, как всегда
А как тебе такое Илон Маск?
i.imgur.com/hVpCf4j.png
Application.Exit не помогает? Не проблема, теперь будем закрывать программу через паузу😅
Тоже неплохо =))