Нажми Alt+Enter или скомпилируй код, что я выше писал, или скачай билд, что я ссылку давал - все выше)
это скорее всего дело именно в висте. На ХР работает 100% - я скидывал нескольким людям для проверки. А мой екзешник у тебя тоже не пашет?
Вопрос по шарпу. Почему код Code: private void Box_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Right) { this.Box.Location = new System.Drawing.Point((Box.Location.X + 5), Box.Location.Y); } } не работает, а Code: private void Box_Click(object sender, EventArgs e) { this.Box.Location = new System.Drawing.Point((Box.Location.X + 5), Box.Location.Y); } работает отлично? Как сделать так, чтобы при нажатии стрелки вправо делалось то-же самое, что и при нажатии мыши во втором фрагменте кода, то есть движение объекта по Х вправо? Блин, все оказалось просто - сделал обработчик событий для формы и все заработало :/
поставь точку остановки по событию KeyPress нажми на стрелку вправо.... посмотри ей код.... и if() сравнивай.... уверен, что всё будет good
Народ, подскажите, как в шарпе можно из 2-й формы закрыть первую? пример: у меня мини игра. После окончания игры, мне нужно чтобы выскакивало модальное окно 2-й формы с кнопкой начать новую игру(игра в первой форме). Та первая форма закрывается и запускается новый экземпляр первой формы с параметрами по умолчанию, то есть игра сначала. Как закрыть первую форму из 2-й и запустить другой экземпляр первой формы со значениями по умолчанию, то есть новой игрой? Блин, сижу и ломаю голову несколько часов, а как только на форуме напишу - спустя минут этак 10 и придумываю как сделать, ппц) мож это из-за того, что это совсем простые вопросы я задаю Тогда другой вопрос, как на время работы 2-й формы скрыть первую, а после окончания работы 2-й формы активировать 1-ю? Я знаю что можно использовать this.Hide() Форма скрывается, но как потом вернуть ее видимость?
Тогда как-то так: Code: Form.ActiveForm.Visible = false; Form.ActiveForm.Visible = true; исправил, думаю так должо сработать. Чуть позже сам покопаю посмотрю что-да как.
Спасибо за пример, но есть одно НО. Процесс остается висеть в памяти компьютера после завершения работы программы. Посмотри в диспетчере задач
Есть класс A и класс B(причем классов может быть неограниченное кол-во). В контроллер приходит имя из InputBox'a - "A". Мне требуется создать экземпляр класса по его имени(без if и switch). Это реально как-то организовать в рантайме? Если да, то как?
Конечно. Type.GetType("ConsoleApplication1.Test").GetConstructor(System.Type.EmptyTypes).Invoke(null);
Мм. Если нужна помощь, то изложи вопрос нормальным языком. Лучше всего - покажи исходный текст задачи. А то "Есть класс A и класс B(причем классов может быть неограниченное кол-во)" - какая-то палата ;6.
Делегат - это попросту говоря ссылка на метод, но в тоже время он ведёт себя как тип (сразу скажу, что без понимания ООП понять суть делегатов будет сложно). Делегаты - основа событий в C#. Без них не обходится ни одна нормальная программа. допустим, имеется метод: И, когда ты пишешь ты говоришь компилятору, что при событии SomeAction должен выполниться метод MethodToCall(). Как я говорил, делегат - прежде всего тип, который мы обязаны объявить: При этом набор аргументов и их типов является неким подобием интерфейса (то есть наш метод MethodToCall должен принимать такие же аргументы). Отсюда следует вывод, что перегруженные методы не могут ссылаться на делегат одного и того же типа. Также делегаты можно вызывать из разных потоков, что очень помогает при разработке многопоточных программ. но об это позже...
Немного дополню: Делегат содержит 2 поля: 1. Ссылка на объект. 2. указатель на метод. Если 1ое поле равно null, метод должен быть статистичеким. Постараюсь ответить на вопрос MaDfUn Если ты проектируешь спамер или флудер для школьников, то впринципе делегаты тебе не нужны. А если ты проектируешь opensource прилолжение, выполняешь важный заказ или просто хочешь чтобы твой код смотрелся красиво нужно использовать делегаты и события. Хотя с .net 2.0 есть еще анонимные методы, а с 3его уже можно использовать лямбда выражения, которые еще больше упрощают процесс понимания сего и проектирования. Повторю слова Трэй Нэша "В хорошо спроектированной системе, узер интерфейс отделен от логики управления посредством четкой абстрации - обычно реализуемой через шаблон Мост". Вообще видов делегатов бывают много (обобщеный делегат, делегат закрытого экземпляра, открытого экземпляра, статический делегат, цепочка делегатов). Вкратце о каждом: 1. Делегат закрытого экземпляра: Code: using System; namespace test { //создаем делегат // public - модификатор доступа // delegate - делагат ) // int - возвращаемое значение // RaiseReputation - тип делегата // int - параметры принимающие методом public delegate double RaiseReputation(double reputation); public class AntichatUser { //Конструктор объекта public AntichatUser(double reputation) { this.reputation = reputation; } /// <summary> /// поднять на % /// </summary> /// <param name="percent"></param> /// <returns></returns> public double ApplyRaiseOf(double percent) { reputation = reputation * (1 + percent); Console.WriteLine("reputation: {0}", reputation); return reputation; } // Репутация private double reputation; } public class EntryPoint { static void Main() { // Создаем экземпляры классов AntichatUser user1 = new AntichatUser(180); AntichatUser user2 = new AntichatUser(600); AntichatUser user3 = new AntichatUser(920); // создаем экземпляры делегата!!! RaiseReputation thisDelegate1 = new RaiseReputation(user1.ApplyRaiseOf); RaiseReputation thisDelegate2 = new RaiseReputation(user2.ApplyRaiseOf); RaiseReputation thisDelegate3 = new RaiseReputation(user3.ApplyRaiseOf); //Увеличиваем значение свойства объекта на 80% и выводим результат на консоль Console.WriteLine(thisDelegate1(0.8)); Console.WriteLine(thisDelegate1(0.8)); // а этому на 60% #-) Console.WriteLine(thisDelegate1(0.6)); //ожидаем активности пользователя Console.ReadKey(); } } } В самом начале тут, мы создаем делегат, в комментариях описано думаю подробно. Далее мы создаем класс и метод в классе с которым будут работать экземпляры делегатов. Далее все в Main() думаю подробно описано. Единтсвенное что можно добавить это то что мы инициируем вызов метода, методом thisDelegate1(0.8), который в свою очередь принимает параметры точно такого же типа или типа не явно конвертирующегося в тип принимаемый методом ApplyRaiseOf(). Точно так же, экземпляр делегата после этого возвращает нам параметры. Почему закрытого? Потому что каждый раз делегат выполняется только для экземпляра того класса, который мы указали в параметрах при вызове методы RaiseReputation. Главное запомнить, что когда мы используем делегат вызывающий метод экземпляра объекта, мы передаем ему так же и текущий экземпляр объекта. Об этом позже, чтоб не вводить тебя в заблуждения. 2. делегат открытого экземпляра А что если у нас не 3 объекта по отдельности, а 10 в коллекции? Именно для таких нужд и созданы делегаты открытого типа. Code: using System; namespace test { //создаем делегат // public - модификатор доступа // delegate - делагат ) // int - возвращаемое значение // RaiseReputation - тип делегата // int - параметры принимающие методом public delegate double RaiseReputation(AntichatUser user, double reputation); public class AntichatUser { //Конструктор объекта public AntichatUser(double reputation) { this.reputation = reputation; } /// <summary> /// поднять на % /// </summary> /// <param name="percent"></param> /// <returns></returns> public double ApplyRaiseOf(double percent) { reputation *= (1 + percent); Console.WriteLine("reputation: {0}", reputation); return reputation; } // Репутация private double reputation; } public class EntryPoint { static void Main() { // Создаем коллекцию и помещаем туда экземпляры System.Collections.Generic.List<AntichatUser> users = new System.Collections.Generic.List<AntichatUser>(); users.Add(new AntichatUser(100)); users.Add(new AntichatUser(590)); users.Add(new AntichatUser(980)); // Итак, тут немного дуаю будет сложно разобратся, - помогу. // Мы создаем экземпляр MethodInfo // далее мы безопасно получаем тип класса AntichatUser // (то же что и Type type = new Type(тра ля ля); // Далее вызываем метод GetMethod() первым параметром // которого является название метода, вторым это // прявязки так называемые. На основе которых будет подбираться метод // Public и Instance в данном случае значит что все pulic члены так же должны быть включены. System.Reflection.MethodInfo info = typeof(AntichatUser).GetMethod("ApplyRaiseOf", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); // Тут создание экземпляра делегата, мы доверяем методу CreateDelegate() RaiseReputation iAmDelegate = (RaiseReputation)Delegate.CreateDelegate(typeof(RaiseReputation), info); //Повышаем всем на 80% репутацию. foreach (AntichatUser user in users) iAmDelegate(user, 0.8); //ожидаем активности пользователя Console.ReadKey(); } } } В комментариях все подробно описано. 3. Статически делегат. Тоже самое что делегат закрытого типа. Только метод который стоит в указателе делагата на объект, является статистическим. т.е. 1ое поле у него null, а второе ссылка на *статистический* метод. 4. Обобщенный делегат, в точности такой же как делегат закрытого типа. За исключением того что он работает с обобщенными типами <T>. пример: Code: public delegate double RaiseReputation<T>(<T> reputation); Если мы не хотим поймать экскепшн, мы должны в нашем методе это предусмотреть. Думаю такая логика идиоту понятна, поэтому демонстрировать не буду) ------ Но я бы тебе пососветовал не останавливатся на делегатах и взглянуть на события.