[ C# / Java ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by procedure, 2 Nov 2008.

  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Консоли в полноэкранном не бывает =)
     
  2. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Нажми Alt+Enter :) или скомпилируй код, что я выше писал, или скачай билд, что я ссылку давал - все выше)
     
  3. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    horlyk хз, что у тебя. Но у меня на висте, ни в какую не хочет.
     
  4. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    это скорее всего дело именно в висте. На ХР работает 100% - я скидывал нескольким людям для проверки. А мой екзешник у тебя тоже не пашет?
     
  5. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Вопрос по шарпу.
    Почему код
    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);
            }
    работает отлично?
    Как сделать так, чтобы при нажатии стрелки вправо делалось то-же самое, что и при нажатии мыши во втором фрагменте кода, то есть движение объекта по Х вправо?


    Блин, все оказалось просто - сделал обработчик событий для формы и все заработало :/
     
    #105 horlyk, 21 Feb 2009
    Last edited: 21 Feb 2009
  6. .ATK

    .ATK Active Member

    Joined:
    20 Feb 2009
    Messages:
    143
    Likes Received:
    111
    Reputations:
    9
    поставь точку остановки по событию KeyPress нажми на стрелку вправо.... посмотри ей код.... и if() сравнивай.... уверен, что всё будет good
     
    1 person likes this.
  7. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Народ, подскажите, как в шарпе можно из 2-й формы закрыть первую?
    пример: у меня мини игра. После окончания игры, мне нужно чтобы выскакивало модальное окно 2-й формы с кнопкой начать новую игру(игра в первой форме). Та первая форма закрывается и запускается новый экземпляр первой формы с параметрами по умолчанию, то есть игра сначала.
    Как закрыть первую форму из 2-й и запустить другой экземпляр первой формы со значениями по умолчанию, то есть новой игрой?



    Блин, сижу и ломаю голову несколько часов, а как только на форуме напишу - спустя минут этак 10 и придумываю как сделать, ппц) мож это из-за того, что это совсем простые вопросы я задаю :)



    Тогда другой вопрос, как на время работы 2-й формы скрыть первую, а после окончания работы 2-й формы активировать 1-ю? Я знаю что можно использовать this.Hide()
    Форма скрывается, но как потом вернуть ее видимость?
     
    #107 horlyk, 22 Feb 2009
    Last edited: 22 Feb 2009
  8. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    не проще ли вывести MessageBox, а после нажатия кнопки обнулить все значения(т.е. начать новую игру)
     
  9. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Меня интересует именно тот способ, что я написал.
     
  10. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Тогда как-то так:
    Code:
    Form.ActiveForm.Visible = false;
    Form.ActiveForm.Visible = true;
    
    исправил, думаю так должо сработать.
    Чуть позже сам покопаю посмотрю что-да как.
     
    #110 rudvil, 22 Feb 2009
    Last edited: 23 Feb 2009
  11. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Вот, сделал!! в архиве(ifolder) проект(пример) :)
    З.Ы. удачи в создании игрушки)
     
  12. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Спасибо за пример, но есть одно НО. Процесс остается висеть в памяти компьютера после завершения работы программы. Посмотри в диспетчере задач :)
     
  13. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Есть класс A и класс B(причем классов может быть неограниченное кол-во).
    В контроллер приходит имя из InputBox'a - "A".
    Мне требуется создать экземпляр класса по его имени(без if и switch).
    Это реально как-то организовать в рантайме? Если да, то как?
     
    1 person likes this.
  14. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Конечно.
    Type.GetType("ConsoleApplication1.Test").GetConstructor(System.Type.EmptyTypes).Invoke(null);
     
  15. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Мм. Если нужна помощь, то изложи вопрос нормальным языком. Лучше всего - покажи исходный текст задачи.

    А то "Есть класс A и класс B(причем классов может быть неограниченное кол-во)" - какая-то палата ;6.
     
    1 person likes this.
  16. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    https://forum.antichat.ru/showpost.php?p=1190575&postcount=2578

    Это что интересно?
     
  17. MaDfUn

    MaDfUn Elder - Старейшина

    Joined:
    2 Feb 2007
    Messages:
    28
    Likes Received:
    10
    Reputations:
    0
    Пожалуйста растолкуйте понятным языком, что такое делегаты?зачем они нужны в реальных проектах?
     
  18. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Делегат - это попросту говоря ссылка на метод, но в тоже время он ведёт себя как тип (сразу скажу, что без понимания ООП понять суть делегатов будет сложно).
    Делегаты - основа событий в C#. Без них не обходится ни одна нормальная программа.
    допустим, имеется метод:
    И, когда ты пишешь
    ты говоришь компилятору, что при событии SomeAction должен выполниться метод MethodToCall().
    Как я говорил, делегат - прежде всего тип, который мы обязаны объявить:
    При этом набор аргументов и их типов является неким подобием интерфейса (то есть наш метод MethodToCall должен принимать такие же аргументы). Отсюда следует вывод, что перегруженные методы не могут ссылаться на делегат одного и того же типа.
    Также делегаты можно вызывать из разных потоков, что очень помогает при разработке многопоточных программ. но об это позже...
     
    #118 [х26]VОLАND, 30 Mar 2009
    Last edited: 30 Mar 2009
    1 person likes this.
  19. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    Немного дополню:

    Делегат содержит 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);
    Если мы не хотим поймать экскепшн, мы должны в нашем методе это предусмотреть.
    Думаю такая логика идиоту понятна, поэтому демонстрировать не буду)

    ------

    Но я бы тебе пососветовал не останавливатся на делегатах и взглянуть на события.
     
    2 people like this.
  20. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Помоему вот так:
    for (int i = 0; i < users.Count; iAmDelegate(users, 0.8));
    быстрее и красивее )
     
    1 person likes this.
Loading...
Similar Threads - Java начинающим задаем
  1. b3
    Replies:
    4
    Views:
    3,163