Десятая секунда видео и уже словил улыбку :) А я в Form1.cs создавал поле public static Form1 Main; И в конструкторе после Initialization() присваивал Main = this; Далее я мог абсолютно из любого места обращаться к Form1 (Form1.Main.Button1.Text = "Ураааа!";)
Для тех, для кого всё равно "не дошло": * Чтобы изменить что-то у Формы1, нужно к ней обратиться * Чтобы к ней обратиться, нужна ссылка на неё. У нашей Формы2 нет ссылки на Форму1. Никакой. * Для этого, при создании экземпляра Формы2, мы передаём ей ссылку на Форму1 (this - ссылка на себя). * А в Форме2, мы принимаем эту ссылку (в Конструкторе) и записываем в переменную типа Form1. * Теперь мы можем обратиться к Форме1 через эту новую переменную, которая хранит ссылку на Форму1, и поменять в ней всё, что мы могли бы поменять из самой Формы1.
Как по мне есть более простой способ, я когда создаю новый проект всегда в классе Program пишу так: internal static class Program { public static FormMain? FormMain { get; private set; } [STAThread] private static void Main() { ApplicationConfiguration.Initialize(); FormMain = new(); Application.Run(FormMain); } } Теперь можно из любого места программы написать Program.FormMain.button1.text = "Блаблабла"
Помню, долго над этим вопросом бился. Но потом для себя методом проб и перебора вариантов открыл именно это способ, который показал Хачатур, и до сих пор его успешно использую.
почитал комментарии ниже и понял, что народ ни типы данных, ни ООП совсем не учат. если б учили видео б им не понадобилось. такие видео это рыба а не удочка. автору же спасибо за труд, досмотрел зачем то до конца )
Спасибо,все понятно и все работает,но можно вопрос.Как с кнопки form2 изменить переменную на form1, и как при нажатии кнопки с form1 менять кнопку form2?
Какая жесть. Я только упомянул в онлайн лекции в универе wforms, и тут же полилось в чате, "ну хотя бы wpf" и тд. от однокурсников. So scary atmosphere
хах, а Я то думал это и есть костыль, ссылка на родительский объект посылаемый в конструкторе класса дочернего объекта. Я пришел в C# из С++, и не придумал ничего лучше чем ссылаться на родительский объект, т.е. все формы, кнопки лейбы, это всё объекты у которых разный уровень доступа, видимости и т.д., а тут мы просто изворачиваем программу так что бы иметь доступ ко всем интересующим нас объектам и их свойствам, методам, событиям. Теперь буду и дальше использовать без опаски порицания)))
Хитрый способ. То есть мы в параметрах отправляем ссылку на форму (cамого себя или же родительское окно), а уже в дочерней форме эту ссылку используем. Спасибо, Хачатур!
Где это видео было раньше, я с wpf когда делал синхронизацию контролов, чисто случайно сидел думал как можно сделать, и решил попробовать подобное, и как я удивился когда это сработало. С одной стороны это хорошо что сам додумался, а с другой кучу времени убил. Делал это примерно так: Public static MainWindow Main; И в конструкторе указывал: Main = this; Думал что это костыль, но ты показал что нет, вполне нормальный способ.
Ооо, эта проблема жиза жизненная. Очень часто нужно было что-то подобное делать, по типу настроек каких то в дочернем окне, которые бы что-то меняли.. но насколько все сложно и неудобно было. Я тоже делал все через костыли, не такие как в видео, но все равно это ужасно было. И из-за этого у меня вообще отпало какое либо желание что-то в новой форме делать и потом максимально уже избегал новых форм и все пытался в одной вместить.. вот, ну а потом гуглил и да, нашел такое же решение как тут.. причем у меня знаний спокойно вообще хватало чтоб самому додуматься до этого, но я как-то вот не додумался.. так что да, это отличное решение, теперь всегда использую
Правильно ли я понимаю: нажатие на крестик [X] у созданного окна, не делает form2.visible = false; а отправляет к сборщику мусора? Я во второй форме в поле ввода текста ввожу этот самый текст, закрываю форму [X], открываю снова, а текста нет... - Мама, а собаки нет... - (С) Малыш и Карлсон. То есть получается мне надо создать метод FormClose(); отловить нажатие на [X] и вместо убийства формы, делать form2.visible = false?
Привет, Хачатур 👋. Что скажешь насчет оптимизации памяти? Какие практики эффективны и какие сам используешь? Как лучше работать с изображениями, которые ты скачиваешь через вебклиент (или хттп веб реквест) и сохраняешь в виде списка? Если будет урок, то будет интересно посмотреть 👍🏻
В рамках уроков C# по ссылке ниже как раз пройден этап с using, с http запросами и прочими плюшками, которые не дают утекать памяти. ua-cam.com/play/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb.html
Почему в шарпе для каждого поля, класса и метода надо писать public/private, почему Майкрософт не сделали как в плюсах: один раз написал и всё что ниже true или false. Так же экономнее.
Новых видосов от тебя не было, ждем ... Интересно было например, про яндекс диск, я как то делал на костылях, чтобы мои документы, рабочий стол и т.д. резервировались на яндекс диске, помню проблема еще была, считывал имена папок поочередно, ругался на мои рисунки и т.д. так так это были ссылки. Путь был типа Enviroment.Documents, чтобы не задавать вручную. Или что-нибудь про работу с глобальным буфером обмена, скриншотами. Про Linq и DataGrid через SQL интересно было бы. Или вообще про API telegram, выкачивать файлы с каналов. Как то так
Привет, Хачатур! Писал тебе примерно месяц назад, что после переименования формы пропала функциональность "назад-вперёд" (а-ля ctrl+z и ctrl+y), ты порекомендовал пофиксить это тем, что переименовать через нотепад++ все остатки Form1 на новое название. Всё так и сделал, всё прекрасно работает... Только вот переменные Form1 всё-таки не видны)). Провёл эксперимент той же самой программы, но без переименования формы - всё работает и все переменные, так же как и методы, видны. У меня по кнопке формы1 запускается отдельный cs файл в новом потоке, и хоть я и могу передать в него Form1 f, криворучки из Майкрософт как-то так намудрили, что ни одна переменная главной формы всё равно не видна... Но зато методы видны, и я теперь под каждую свою нужду в изменении переменной накостылял кучу методов в основной форме, которые тупо меняют значение переменной, но через void метод.... Хачатур, точно никак не получится нормально переименовать форму с сохранением всех возможностей?) Я интернет опять таки обыскал, об этом почти никто не пишет, да если и пишут, то либо не по теме, либо не работает.
Привет 🖐 Не помню, Тебе отвечал или нет, просто берёшь и во всех файлах с помощью Notepad++ меняешь имя Form1 на то, что нужно. Ну и сами файлы, если нужно. Метод рабочий и гарантированный.
@@XpucT Это я тупанул, переменную не нужно делать статической, только публичной, тогда к ней можно будет легко обратиться через owner.var = 5; Всё в итоге работает, спасибо!
Серьёзно?! Это вообще законно?!O.o Я так-то давно с WinForms не работаю, но, в своё время, данного материала мне очень не хватало...:( Теперь буду знать:) Спасибо большое, Хачатур!:)
Здравствуйте Хачатур. Спасибо за ролик. Могли бы вы осветить тему пересылки данных например текста из приложения в стороннее приложение, и наоборот извлекать текст из стороннего приложения в свое реализовав это на С#. Особенно часто это бывает нужно для игр, браузерных и отдельных клиентских. Можно было бы создавать множество вспомогательных программ облегчающих процесс игры. Например из своего приложения отправлять текст в чат игры, и обратно из чата/журнала игры извлекать текст. Самая большая загвоздка как я понимаю получить доступ к стороннему окну приложения.
Блин это конечно круто, но я пытался с шарпов перенести на плюсы но без успешно видимо я еще мало в программировании, буду у преподавателя спрашивать как это сделать, может на плюсах метод полегче есть
А я делаю так... В файле Program.cs - точька входа в программу, добавляю экземпляр класса нужного "окна" прямо в метод - static void Main() и после этого главное окно проги и то которое добавил - "видят друг друга". namespace Gyro { static class Program { internal static Main main; internal static selectAnotherCOMport selectCOMport; //------------------------------ второе окно. [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); main = new Main(); selectCOMport = new selectAnotherCOMport(); //------------------------------ второе окно. Application.Run(main); } } } Далее, например кликая по кнопке во втором окне, можно запустить метод в главном окне программы. private void btnOk_Click(object sender, EventArgs e) { this.Hide(); //Скрываем окно Program.main.viaUSB(); // Запускаем метод в основном окне программы. } Ну и у меня вопрос - Это вообще законно? )))
Я почему-то при такое передачи формы владельца привожу в object. Наверное мне просто не нравится что-то вроде Form1 и т.д. в типе параметра. Но это чисто вкусовщина
Привет, ХрисТ Благодарю за ещё один полезный урок , Скажи будут ли уроки на тему дизайна формы ТК в Русском Ютубе нет норманых уроков, И ещё скажи дизайн Win 10 Tweaker это (тема - skin ) или каждый элемент рисован отдельно , и очень интересно как ты сделал звук в форме .
Привет 🖐 Тема дизайна уже раскрыта на вкладке Сообщество для спонсоров. Дал даже готовый проект. Новый проект с готовыми скинами и их быстрым изменением на очереди ;)
@@XpucT Я вот сколько пробую не получиться, может я не првельно вопрос задал, у меня есть Forms1, и я хочу открыть Forms2, но я хочу изменить не Forms1 из Forms2, а Forms 2 из Forms1.
Спасибо! Два дня убиты напрасно, т.к. с самого начала не хотелось смотреть видео, выданное гуглом. И совершенно напрасно. Автор - крут !
Десятая секунда видео и уже словил улыбку :)
А я в Form1.cs создавал поле public static Form1 Main; И в конструкторе после Initialization() присваивал Main = this; Далее я мог абсолютно из любого места обращаться к Form1 (Form1.Main.Button1.Text = "Ураааа!";)
Лайфхак 👍
Спасибо огромное. Самостоятельно изучаю C#, Ваши уроки очень помогают.
Для тех, для кого всё равно "не дошло":
* Чтобы изменить что-то у Формы1, нужно к ней обратиться
* Чтобы к ней обратиться, нужна ссылка на неё. У нашей Формы2 нет ссылки на Форму1. Никакой.
* Для этого, при создании экземпляра Формы2, мы передаём ей ссылку на Форму1 (this - ссылка на себя).
* А в Форме2, мы принимаем эту ссылку (в Конструкторе) и записываем в переменную типа Form1.
* Теперь мы можем обратиться к Форме1 через эту новую переменную, которая хранит ссылку на Форму1, и поменять в ней всё, что мы могли бы поменять из самой Формы1.
Спасибо!!!
Как по мне есть более простой способ, я когда создаю новый проект всегда в классе Program пишу так:
internal static class Program {
public static FormMain? FormMain { get; private set; }
[STAThread]
private static void Main() {
ApplicationConfiguration.Initialize();
FormMain = new();
Application.Run(FormMain);
}
}
Теперь можно из любого места программы написать Program.FormMain.button1.text = "Блаблабла"
Ничего не забыл в коде? =)
Помню, долго над этим вопросом бился. Но потом для себя методом проб и перебора вариантов открыл именно это способ, который показал Хачатур, и до сих пор его успешно использую.
Спасибо! Классная подача! Замучили меня эти формы ))))
Огромное спасибо... реально полезный контент... и уже голову сломал, как же не наплодить экземпляров форм ... теперь все работает, как надо.
Скоро сниму ещё кое-что по этой теме =)
@@XpucTдоброго времени суток. Подскажите, новое видео есть?
Краса, не знаю що ще додати. На фоні більшості іт-блогерів ти крутий!
Огромная благодарность автору !!!!)))
почитал комментарии ниже и понял, что народ ни типы данных, ни ООП совсем не учат.
если б учили видео б им не понадобилось. такие видео это рыба а не удочка.
автору же спасибо за труд, досмотрел зачем то до конца )
Спасибо,все понятно и все работает,но можно вопрос.Как с кнопки form2 изменить переменную на form1, и как при нажатии кнопки с form1 менять кнопку form2?
Какая жесть. Я только упомянул в онлайн лекции в универе wforms, и тут же полилось в чате, "ну хотя бы wpf" и тд. от однокурсников. So scary atmosphere
=))
@@XpucT да не радостно чето нифига, теперь ясно почему ты иногда в уроках отдельные блоки посвящаешь таким прик0листам
@@vadymkon Ты даже примерно не представляешь, как это достало. У Меня поток такой, что держись психика...
@@XpucT в Ютубе вроде есть банворд для настроек комментариев. Можно закинуть туда wpf+лучше))0)
Большое спасибо!:)
Спасибо большое за видео и уроки я думал с ума сойду
Шикарное видео! На мой взгляд это лучшее решение.
хах, а Я то думал это и есть костыль, ссылка на родительский объект посылаемый в конструкторе класса дочернего объекта. Я пришел в C# из С++, и не придумал ничего лучше чем ссылаться на родительский объект, т.е. все формы, кнопки лейбы, это всё объекты у которых разный уровень доступа, видимости и т.д., а тут мы просто изворачиваем программу так что бы иметь доступ ко всем интересующим нас объектам и их свойствам, методам, событиям.
Теперь буду и дальше использовать без опаски порицания)))
Хитрый способ. То есть мы в параметрах отправляем ссылку на форму (cамого себя или же родительское окно), а уже в дочерней форме эту ссылку используем. Спасибо, Хачатур!
Благодарю вас. Спасли
Где это видео было раньше, я с wpf когда делал синхронизацию контролов, чисто случайно сидел думал как можно сделать, и решил попробовать подобное, и как я удивился когда это сработало.
С одной стороны это хорошо что сам додумался, а с другой кучу времени убил.
Делал это примерно так:
Public static MainWindow Main;
И в конструкторе указывал:
Main = this;
Думал что это костыль, но ты показал что нет, вполне нормальный способ.
Ооо, эта проблема жиза жизненная. Очень часто нужно было что-то подобное делать, по типу настроек каких то в дочернем окне, которые бы что-то меняли.. но насколько все сложно и неудобно было. Я тоже делал все через костыли, не такие как в видео, но все равно это ужасно было. И из-за этого у меня вообще отпало какое либо желание что-то в новой форме делать и потом максимально уже избегал новых форм и все пытался в одной вместить.. вот, ну а потом гуглил и да, нашел такое же решение как тут.. причем у меня знаний спокойно вообще хватало чтоб самому додуматься до этого, но я как-то вот не додумался.. так что да, это отличное решение, теперь всегда использую
Блин, помню я ломал голову над подобным 😂
Я не додумался гуглить, но за то додумался использовать ваш метод к которому пришёл сам спустя пару дней 😅
очень помог, спасибо огромное😊
Огромное спасибо!
Правильно ли я понимаю: нажатие на крестик [X] у созданного окна, не делает form2.visible = false; а отправляет к сборщику мусора? Я во второй форме в поле ввода текста ввожу этот самый текст, закрываю форму [X], открываю снова, а текста нет...
- Мама, а собаки нет... - (С) Малыш и Карлсон.
То есть получается мне надо создать метод FormClose(); отловить нажатие на [X] и вместо убийства формы, делать form2.visible = false?
Да, форма полностью закрывается, мусор собран, формы больше нет.
Если нужно сохранить данные второй формы, то нужно да, скрывать, а не закрывать.
Привет, Хачатур 👋.
Что скажешь насчет оптимизации памяти? Какие практики эффективны и какие сам используешь? Как лучше работать с изображениями, которые ты скачиваешь через вебклиент (или хттп веб реквест) и сохраняешь в виде списка? Если будет урок, то будет интересно посмотреть 👍🏻
В рамках уроков C# по ссылке ниже как раз пройден этап с using, с http запросами и прочими плюшками, которые не дают утекать памяти.
ua-cam.com/play/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb.html
Почему в шарпе для каждого поля, класса и метода надо писать public/private, почему Майкрософт не сделали как в плюсах: один раз написал и всё что ниже true или false. Так же экономнее.
Можно не писать private. Я не пишу. По умолчанию это будет private.
христ, благословит тебя бог, хахах, наконец то нормальный способ, сука АААААААА, спасибо огромное
Новых видосов от тебя не было, ждем ... Интересно было например, про яндекс диск, я как то делал на костылях, чтобы мои документы, рабочий стол и т.д. резервировались на яндекс диске, помню проблема еще была, считывал имена папок поочередно, ругался на мои рисунки и т.д. так так это были ссылки. Путь был типа Enviroment.Documents, чтобы не задавать вручную. Или что-нибудь про работу с глобальным буфером обмена, скриншотами. Про Linq и DataGrid через SQL интересно было бы. Или вообще про API telegram, выкачивать файлы с каналов. Как то так
найти бы еще как внедрить кнопки, безопасного извлечения флешек
Очень полезно давно хотел так зделать на WinForm а на Wpf переходить не хочю там трудно всё
огонь!!!
Привет, Хачатур! Писал тебе примерно месяц назад, что после переименования формы пропала функциональность "назад-вперёд" (а-ля ctrl+z и ctrl+y), ты порекомендовал пофиксить это тем, что переименовать через нотепад++ все остатки Form1 на новое название. Всё так и сделал, всё прекрасно работает... Только вот переменные Form1 всё-таки не видны)). Провёл эксперимент той же самой программы, но без переименования формы - всё работает и все переменные, так же как и методы, видны.
У меня по кнопке формы1 запускается отдельный cs файл в новом потоке, и хоть я и могу передать в него Form1 f, криворучки из Майкрософт как-то так намудрили, что ни одна переменная главной формы всё равно не видна... Но зато методы видны, и я теперь под каждую свою нужду в изменении переменной накостылял кучу методов в основной форме, которые тупо меняют значение переменной, но через void метод....
Хачатур, точно никак не получится нормально переименовать форму с сохранением всех возможностей?) Я интернет опять таки обыскал, об этом почти никто не пишет, да если и пишут, то либо не по теме, либо не работает.
Привет 🖐
Не помню, Тебе отвечал или нет, просто берёшь и во всех файлах с помощью Notepad++ меняешь имя Form1 на то, что нужно.
Ну и сами файлы, если нужно. Метод рабочий и гарантированный.
@@XpucT да, ты как раз мне про это отвечал - кароче, переменные всё равно не видны (грустный смайлик)
@@XpucT Это я тупанул, переменную не нужно делать статической, только публичной, тогда к ней можно будет легко обратиться через owner.var = 5;
Всё в итоге работает, спасибо!
Можно статический датабанк сделать и впихнвть туда нужные формы
Серьёзно?! Это вообще законно?!O.o
Я так-то давно с WinForms не работаю, но, в своё время, данного материала мне очень не хватало...:(
Теперь буду знать:)
Спасибо большое, Хачатур!:)
Здравствуйте Хачатур. Спасибо за ролик. Могли бы вы осветить тему пересылки данных например текста из приложения в стороннее приложение, и наоборот извлекать текст из стороннего приложения в свое реализовав это на С#. Особенно часто это бывает нужно для игр, браузерных и отдельных клиентских. Можно было бы создавать множество вспомогательных программ облегчающих процесс игры. Например из своего приложения отправлять текст в чат игры, и обратно из чата/журнала игры извлекать текст. Самая большая загвоздка как я понимаю получить доступ к стороннему окну приложения.
Блин это конечно круто, но я пытался с шарпов перенести на плюсы но без успешно видимо я еще мало в программировании, буду у преподавателя спрашивать как это сделать, может на плюсах метод полегче есть
А я делаю так...
В файле Program.cs - точька входа в программу, добавляю экземпляр класса нужного "окна" прямо в метод - static void Main()
и после этого главное окно проги и то которое добавил - "видят друг друга".
namespace Gyro
{
static class Program
{
internal static Main main;
internal static selectAnotherCOMport selectCOMport; //------------------------------ второе окно.
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
main = new Main();
selectCOMport = new selectAnotherCOMport(); //------------------------------ второе окно.
Application.Run(main);
}
}
}
Далее, например кликая по кнопке во втором окне, можно запустить метод в главном окне программы.
private void btnOk_Click(object sender, EventArgs e)
{
this.Hide(); //Скрываем окно
Program.main.viaUSB(); // Запускаем метод в основном окне программы.
}
Ну и у меня вопрос - Это вообще законно? )))
Тоже интересно. Чуть ниже был ещё лайфхак, ещё короче =))
Как раз искал решение, ахахах, просто мужик ты лучший!)
Я почему-то при такое передачи формы владельца привожу в object. Наверное мне просто не нравится что-то вроде Form1 и т.д. в типе параметра. Но это чисто вкусовщина
Прикольно когда так херачил и был доволен 😌 хорошие видосы , отличная подача материала !
Привет, ХрисТ Благодарю за ещё один полезный урок ,
Скажи будут ли уроки на тему дизайна формы ТК в Русском Ютубе нет норманых уроков,
И ещё скажи дизайн Win 10 Tweaker это (тема - skin ) или каждый элемент рисован отдельно , и очень интересно как ты сделал звук в форме .
Привет 🖐
Тема дизайна уже раскрыта на вкладке Сообщество для спонсоров.
Дал даже готовый проект. Новый проект с готовыми скинами и их быстрым изменением на очереди ;)
а как управлять сразу несколькими формами из одной формы🤔 я пытался добавить ещё нового овнера но не получается проект просто не компилируется
Абсолютно также. Будет работать также.
@@XpucT Я вот сколько пробую не получиться, может я не првельно вопрос задал, у меня есть Forms1, и я хочу открыть Forms2, но я хочу изменить не Forms1 из Forms2, а Forms 2 из Forms1.
а как сделать так чтоб 2-я кнопка нажималась а не менялся его название т.е. текст
Почему у меня все равно пишет, что недоступно из-за уровня защиты(
Пересмотрите видео. Фишка в модификаторе.
@@XpucT укуси меня пчела, у вас батон в модификаторе публичный :)
Финальная версия 9:30
Топчик! :)
Хах, переход на WPF, отличный совет, там тоже тот ещё геморрой с одного окна в другом, что то изменять.
Все интересно, но можно говорить чуть помедленнее и четче