Ответы пользователя по тегу C#
  • Сложно ли сделать свой гибридный компилятор?

    cjey
    @cjey
    Сложно )

    Начните с реализации интерпретатора. Возьмите самый простой из языков, например лого или кукарачу, не знаю что нынче в школе преподают.
    Напишите лексический, синтаксический и семантические анализаторы.
    Когда заработает попробуйте добавить языковых конструкций: новые операции, функции и т.д.

    Я думаю полгода - год у вас на это уйдет.

    Потом возьмите какой-нибудь простой знакомый язык, basic / подмножество Java. Напишите интерпретатор.
    Потом переделаете интерпретатор в генератор промежуточного кода.
    Потом сделаете компилятор промежуточного кода под одну конкретную платформу.
    Ответ написан
  • Как просмотреть обработанный sql код после внесения параметров на C#?

    cjey
    @cjey
    SQL Profiler
    Ответ написан
    Комментировать
  • Можете объяснить зачем в параметрах this у функции?

    cjey
    @cjey
    Пусть есть массив Product[] products;
    Если вы объявляете просто функцию(без this), то для её вызова вам бы пришлось написать:
    MyExtensionMethods.TotalPrices(products);

    Если вы объявлете метод расширения (с this), тогда вы можете писать так:
    products.TotalPrices();
    Особенно удобно использовать с LINQ
    decimal stuffPrice = products.Where(x => x.Price < 100).TotalPrices();

    За подробностями в google
    Ответ написан
    Комментировать
  • Как динамически создать новые кнопки?

    cjey
    @cjey
    private static int n = 0;
    
            private void button1_Click(object sender, EventArgs e)
            {
                var newButton = new Button()
                {
                    Name = "btn" + n,
                    Text = n.ToString(),
                    Location = new Point(10, 10 + n*30),
                    Size = new Size(50, 25),
                    TabIndex = 100 + n,
                };
                n++;
                this.Controls.Add(newButton);
            }


    Созданные кнопки можно хранить в статическом массиве. Для удаление используйте this.Controls.Remove(obj);
    Ответ написан
    2 комментария
  • Как сделать ввод даных через консоль?

    cjey
    @cjey
    Ввод четырех чисел через пробел
    var s = Console.ReadLine();
                var arr = s.Split(' ');
    
                if (arr.Length == 4)
                {
                    var a1 = Convert.ToDouble(arr[0]);
                    var a2 = Convert.ToDouble(arr[1]);
                    var a3 = Convert.ToDouble(arr[2]);
                    var a4 = Convert.ToDouble(arr[3]);
    
                    Console.Write("{0} {1} {2} {3}", a1, a2, a3, a4);
    
                    Console.ReadKey();
                }
    Ответ написан
    Комментировать
  • C# или ActionScript?

    cjey
    @cjey
    Оцените стоимость и скорость разработки. Если на ActionScript нужно 3 человека на проект и 3 месяца, а для C# на тот же проект 2 человека и 2 месяца, то выгода очевидна. А если ActionScript использовать для несвойственных задач, то скорость разработки будет небольшой.

    В качестве аргумента попробуйте сравнить сложность поиска новых специалистов для ActionScript и C#. Кол-во соискателей, средняя зарплата, и т.д. В том числе тенденцию через 3, 5 лет когда нужно будет поддерживать сегодняшние проекты.

    Упирайте на финансовую выгоду, это будет интересовать начальство в 100500 раз больше технических деталей :)
    Ответ написан
  • Как изменить имя выбранного элемента в ListBox?

    cjey
    @cjey
    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.Items[0] = ((String)listBox1.Items[0]).Replace('e','!') + "_Clicked";
    }
    Ответ написан
  • Есть ли примитивный excel на c# c открытым кодом?

    cjey
    @cjey
    Есть Microsoft.Office.Interop.Excel , но его код вероятно закрыт.
    Ответ написан
    Комментировать
  • Получить название монитора через WinApi?

    cjey
    @cjey
    Вот пример вызовов WinAPI для получения информации(разрешение, область в виртуальном мониторе) для всех мониторов(в многомониторной конфигурации).

    Запускать MonitorInfo.FindMonitors();

    using System;
    using System.Runtime.InteropServices;
    
    namespace MonitorInfoWinAPI
    {
        public class MonitorInfo
        {
            private static IntPtr hDesktop;
    
            private static bool EnumerateMonitors(IntPtr hDesktop, IntPtr hdc, ref Rect pRect, int dwData)
            {
                MonitorInfo.hDesktop = hDesktop;
                MonitorInfoEx info = new MonitorInfoEx();
                GetMonitorInfo(hDesktop, info);
    
                Console.WriteLine("Monitor {0}", new string(info.szDevice));
                Console.WriteLine("  resolution                   {0}x{1}", info.rcMonitor.right, info.rcMonitor.bottom);
                Console.WriteLine("  virtual monitor left  top    {0}x{1}", info.rcWork.left, info.rcMonitor.top);
                Console.WriteLine("  virtual monitor right bottom {0}x{1}", info.rcWork.right, info.rcMonitor.bottom);
    
                Console.WriteLine();
    
                return true;
            }
    
            public static void FindMonitors()
            {
                EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, EnumerateMonitors, IntPtr.Zero);
                return;
            }
    
    
            public delegate bool EnumMonitorsDelegate(IntPtr hDesktop, IntPtr hdc, ref Rect pRect, int dwData);
    
            #region DLLImport
            [DllImport("user32.dll")]
            public static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint);
    
            [DllImport("user32.dll")]
            public static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, EnumMonitorsDelegate lpfnEnum, IntPtr dwData);
    
            [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern bool GetMonitorInfo(IntPtr hmonitor, [In, Out]MonitorInfoEx info);
    
            #endregion
    
    
            #region Structs
    
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
            public class MonitorInfoEx
            {
                public int cbSize = Marshal.SizeOf(typeof(MonitorInfoEx));
                public Rect rcMonitor = new Rect();
                public Rect rcWork = new Rect();
                public int dwFlags = 0;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public char[] szDevice = new char[32];
            }
    
            [StructLayout(LayoutKind.Sequential)]
            public struct Rect
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }
    
            [StructLayout(LayoutKind.Sequential)]
            public struct Point
            {
                public int X;
                public int Y;
            }
    
            #endregion
        }
    }
    Ответ написан
    Комментировать
  • Разграничение доступа к элементам формы в зависимости от роли в базе?

    cjey
    @cjey
    Наиболее простым вариантом будет хранить в таблице T_UserRights(ID_User, ID_Button, isVisible)
    ID_Button в форме хранить в поле Tag.

    Ну и потом
    foreach(Control item in Controls)
    {
      if (item is Button)
      {
        (Button)item.Visible = // берем значение из таблицы.
      }
    }


    Но права пользователей нужно проверять на уровне базы, нельзя доверять эту проверку клиенту (ее элементарно обойти).
    Ответ написан
  • Как очистить textBox'ы на другой форме?

    cjey
    @cjey
    Вы создаете новую форму и в ней очищаете данные, поэтому и не работает текущий вариант.
    Я так понимаю вам нужно очищать данные в уже созданной форме.

    Наиболее правильным решением будет
    в Form1:
    Form2 f2 = new Form2();
    if (f2.ShowDialog() == DialogResult.OK)
    {
      TextBox1.Text = "ok";
    }
    else 
    {
      TextBox1.Text = "";
    }


    А в Form2
    private void Cancel_Click(object sender, EventArgs e)
    {
      dialogResult = DialogResult.Cancel;
      Close();
    }
    
    private void OK_Click(object sender, EventArgs e)
    {
      dialogResult = DialogResult.OK;
      Close();
    }


    Альтернативным решением будет хранить в статическом поле класса Program ссылку на Form1 и обращаться к форме 1 через Program.form1
    Ответ написан
    Комментировать
  • Проект на C# WinForm не завершается полностью после перехода между формами, как решить?

    cjey
    @cjey
    Обращаю ваше внимание, что при закрытии второй формы вы не показываете уже существующую первую форму, а создаете еще одну первую форму, а еще одна первая форма остается висеть в фоне.

    Возвращаясь к исходному вопросу: вам нужно хранить все созданные вами формы, и при выходе явно их закрывать.

    Например можно модифицировать Program.cs, создать две статические переменные для первой и второй формы. И уже через эти переменные явно их прятать, показывать и закрывать.
    Ответ написан
    Комментировать