Ответы пользователя по тегу C#
  • Как правильно реализовать кнопку "запомнить" в программе?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Используйте стандартный механизм хранения настроек приложения:
    https://habr.com/post/271483/
    https://stackoverflow.com/questions/453161/best-pr...
    Ответ написан
    Комментировать
  • Получить текстовое представление формулы, записанной в коде, обратно в текст?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Что-то типа такого:
    public static void Main(string[] args)
    {
        var cube = new Formula<Func<int, int>>( (x) => x * x, "(x) => x * x" );
        Console.WriteLine(cube.Exec(3));
        Console.WriteLine(cube.Text);
    }
    
    public class Formula<T>
    {
        public readonly T Exec;
        public readonly string Text;
        public Formula(T action, string text)
        {
            Exec = action;
            Text = text;
        }                    
    }
    Ответ написан
  • Как работать с созданными объектами в коде?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Передавать выбранные объекты другим методам и функциям.
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Gameplay : MonoBehaviour {
    
        string Word;
        public GameObject PrefabCharCell;
        public GameObject tempCell;
        public Transform GridCellPos;
        
        void SomeMethod(GameObject tempCell){ 
    
        }
    
        void Start ()
        {
            Word = "Meet"; 
            foreach (char ch in Word.ToUpper().ToCharArray())
            {
                tempCell = Instantiate(PrefabCharCell);
                tempCell.transform.SetParent(GridCellPos,false);
                SomeMethod(tempCell);
            }  
        }
    }
    Ответ написан
    2 комментария
  • Может ли Awesomium конкурировать с Selenium?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Используйте nwjs. Awesomium практически не юзабелен — документации нет, заброшен.
    Ответ написан
    Комментировать
  • Можно ли увеличить скорость скрывания столбцов в DataGridView?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    myControl.SuspendLayout();
    ... меняем контент в myControl ...
    myControl.ResumeLayout(false);
    myControl.PerformLayout();


    UPD
    Есть еще один дополнительный флаг для формы, который может ускорить рендеринг:
    public partial class MainWindow : Form
        {
            /// <summary>
            /// Fix for slow UI rendering
            /// </summary>
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED   
                    return cp;
                }
            }
        }
    Ответ написан
  • Когда используете принудительную сборку мусора?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Когда сборщик мусора не способен самостоятельно произвести сборку мусора в нужный момент времени или в определенных условиях.
    Ответ написан
    2 комментария
  • Как подружить C# и Java?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Если к программам на JAVA нет исходников — то самый простой способ через пайп/консоль. Если исходники есть — можно использовать любые механизмы межпроцессного взаимодействия.
    Ответ написан
    Комментировать
  • Как на c# отправить https GET или POST запрос, используя из параметров только url и raw(тело запроса)?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Конечно можно:
    1. Берем из ссылки хост
    2. Получаем IP адрес
    3. По этому адресу открываем обычно соединение через обычный сокет
    4. Отправляем нужные данные через сокет
    5. Закрываем соединение
    Ответ написан
    4 комментария
  • Как преобразовать string выражение?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    мне нужно общее решение
    Введите выражение у = [*ожидание ввода выражения]
    Введите x = [*ввод x]
    Значение Выражения в точке X = [значение выражение в точке]

    1. Получить выражение
    2. Проверить корректность выражения
    3. Получить дополнительные данные
    4. Проверить корректность введенных данных
    5. Распарсить выражение
    6. Распарсить введенные данные
    7. Произвести вычисления выражения с учетом введенных ранее данных
    8. Показать результат вычисления
    Ответ написан
    Комментировать
  • Как исправить размытый текст в Windows Forms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Гуглите DpiAware — изучите проблемы и выберете оптимальное решение для себя. Тут проблема в диком легаси наследии, реализованном через костыли и которое пытаются сохранить, добавляя исправления в виде костылей, которые генерируют новые баги и в новых версиях это пытаются исправить опять костылями. Кроме того, алгоритм работы масштабирования немного отличается в разных версиях ОС. Так что очень рекомендую проверять работу приложения в разных версиях ОС (7, 8.1, 10 Home, 10 Enterprise LTS) и с выключенным и включенным масштабированием. Да-да, в домашней десятке и в корпоративной долгосрочной десятке можно получить разный результат.

    Вариант 1 — вызов специальной функции в коде (реальный код, который я использую — плюс вторая функция для масштабирования шрифтов, тык — примерно так получается в 4к):
    const int WinDefaultDPI = 96;
    
    /// <summary>
    /// Исправление блюра при включенном масштабировании в ОС windows 8 и выше
    /// </summary>
    public static void DpiFix()
    {
        if (Environment.OSVersion.Version.Major >= 6)
        {
            SetProcessDPIAware();
        }
    }
    
    /// <summary>
    /// WinAPI SetProcessDPIAware 
    /// </summary>
    /// <returns></returns>
    [DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();
    
    /// <summary>
    /// Исправление размера шрифтов
    /// </summary>
    /// <param name="c"></param>
    public static float DpiFixFonts(Control c)
    {
        Graphics g = c.CreateGraphics();
        float dx = g.DpiX
            , dy = g.DpiY
            , fontsScale = Math.Max(dx, dy) / WinDefaultDPI
        ;
        g.Dispose();
        return fontsScale;
    }


    Плюс все формы имеют следующий конфиг (код, вызываемый в конструкторах форм):
    this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;


    Учтите, что AutoScaleDimensions — в конструкторе выставляется автоматически в зависимости от разрешения и DPI вашего монитора. Поэтому я не использую конструкторы. Иначе, при запуске приложения на разных машинах с разным DPI можно получить очень неожиданные результаты.

    Вариант 2 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    </configuration>


    Вариант 3 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    <configuration>


    Вариант 4:
    app.manifest
    <!-- Указывает, что приложение поддерживает определение DPI и не будет автоматически масштабироваться Windows при более высоких
           значениях DPI. Приложения Windows Presentation Foundation (WPF) по умолчанию поддерживают определение DPI, им не нужно 
           специально включать параметр для этого. Для приложений Windows Forms на платформе .NET Framework 4.6, для которых задан этот параметр, необходимо 
           также задать для "EnableWindowsFormsHighDpiAutoResizing" значение "true" в файле app.config.-->
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
      </application>
    Ответ написан
    6 комментариев
  • Возможно ли изменить цвет нарисованной с помощью DrawingVisual фигуры?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Вы бы почитали как вообще в ПК работают изображения и каким образом оно показывается на экране. Если говорить простыми словами: есть контекст рисования (изображение/виртуальный экран), который состоит из двухмерного массива пикселей. Когда какая-то функция рисует какую-то фигуру в этом экране — то она просто меняет цвет пикселей там. Если надо нарисовать фигуру другого цвета — то просто берем и вызываем эту функцию с теми же параметрами, но другим цветом.
    Ответ написан
  • Какая причина падения производительности приложения?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    А вы каким образом изображения обрабатываете, выводите и какие функции используете? Дело в том, что C# для таких вещей не очень хорошо подходит и стандартные механизмы работы с отдельными пикселями там очень медленные. Для работы с изображениями следует использовать как минимум неуправляемый код, а в вашем случае еще лучше вывести все функции обработки и вывода изображения в отдельный модуль, написанный на C/C++ или на чем-то еще типа такого.
    Ответ написан
  • Как понизить версию (winforms project) у инсталлятора .Net framework с 4.5 на 4.0?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Вероятно где-то в этом самом инсталляторе используется код или зависимости от версии 4.5. Лучше всего создать новый проект в нужной версии, далее перенести все настройки, зависимости и файлы исходного кода и пытаться собрать проект. Вероятно придется внести изменения в исходный код, зависимости или настройки. Еще как вариант можно использовать независимый сборщик дистрибутива — например NSIS.
    Ответ написан
    Комментировать
  • C#. Как автоматически прокрутить TableLayoutPanel в самый низ?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    control.VerticalScroll.Value
    Подробнее тут: https://msdn.microsoft.com/ru-ru/library/system.wi...
    Ответ написан
    Комментировать
  • Как сделать бэкенд на C# с нуля?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    1. Изучить сетевой стек — сетевая модель OSI. Не обязательно глубоко — но базовые вещи вроде уровней, протоколов надо знать.
    2. Изучить что такое сокеты и как они работают:
      1. реализовать чтение данных из сокета
      2. запись данных в сокет
      3. затем реализовать сокет-сервер и сокет клиент
      4. организовать передачу данных между ними
      5. сделать прием/передачу данных из/в сокета/сокет блокирующую и неблокирующую и понять разницу между ними
      6. реализовать на сервере поддержку коннекта нескольких клиентов
      7. реализовать группу потоков и очереди для чтения/записи в сокеты

    3. Изучить веб-сокеты
    4. Выбрать любую БД, подходящую под ваши критерии (схема данных, нагрузка, логика работы приложения и т.п.) — можно взять любую популярную MySQL, PosgreSQL, Mongo и т.п.
    5. Найти библиотеку для работы БД и пройти туториалы по ней
    6. Подключить библиотеку для работы с БД к сокет/веб-сокет серверу
    7. Реализовать сетевое API вашего сервера (логин клиентом, прием/передача данных и прочее)
    8. Реализовать клиентскую обертку для работы с API сервера
    Ответ написан
    2 комментария
  • Как исправить ошибку "ссылка на объект не указывает на экземпляр объекта"?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Эта ошибка означает, что вместо объекта - нуль.
    1. Запускаете программу в режиме отладки;
    2. Воспроизводите ошибку;
    3. Переходите по ссылке в указанную точку исходного кода;
    4. Исправляете ошибку.
    Ответ написан
    1 комментарий
  • C#. Как правильно разобрать JSON?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Для генерации классов из JSON есть отличнейший сервис: https://app.quicktype.io/#r=json2csharp
    Ответ написан
    Комментировать
  • Как реализовать отслеживание установок windows приложений?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Точно так же. При скачивании приложения в дистрибутив записывается вот этот ID в любом удобном виде. При установке приложение отправляет этот ID на сервер. А на сервере бэкэнд уже обрабатывает этот ID как надо.
    Ответ написан
    4 комментария
  • Как из exe собрать dll, имея сорсы?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    На самом деле ничего сверхсложного в этом нету: открываете пример DLL (например этот), по образцу переписываете Main.cpp вашего приложения с нужными вам функциями и получаете то, что вам нужно. В VisualStudio создаете решение, в него добавляете оба проекта (так просто удобнее - пересобрал длл и её сразу можно юзать во втором проекте без дополнительных телодвижений), линкуете на билд dll и все связанное в основном проекте (C# который), далее в C# приложении делаете обертку для dll и используете её уже как надо.
    Ответ написан
    3 комментария