Ответы пользователя по тегу Windows Forms
  • Подмена реализации интерфейса без перекомпиляции проекта. Как реализовать?

    Nipheris
    @Nipheris Куратор тега C#
    Получается мне что то на подобии создания плагинов надо. При помощи какой технологии можно подобное сделать?

    Managed Extensibility Framework (MEF)
    Ответ написан
  • Где прописывать свои функции при работе с Windows Forms?

    Nipheris
    @Nipheris Куратор тега C#
    Вы должны его писать там, где ему место. Классы форм и класс Program - лишь одни из многих классов которые могут быть и должны быть в вашей программе.

    Ваш вопрос не имеет прямого отношения к Windows Forms, вам нужно изучать язык C# и то, как с его помощью решать задачи: как использовать классы, как оформлять алгоритмы и данные с их помощью и прочее. Сейчас вы теми немногими инструментами, которые понимаете и которые видите перед собой, пытаетесь решить задачу.

    Впрочем, если вам нужно прямо сейчас решить элементарную задачу из учебника и вышеуказанные вопросы вас пока не беспокоят, можете добавить метод в класс формы.
    Ответ написан
  • Миграция проекта с WindowsForms на .NET Core. Куда смотреть?

    Nipheris
    @Nipheris Куратор тега C#
    Это абзац. Вам нужно многое узнать, я вам скажу.

    Во-первых, реализовать "в браузере" - вы вообще понимаете что вам в принципе нужно будет делать и какие компоненты на чём писать? "frontend-разработка", "backend-разработка" вам говорит о чём-то?

    Вам надо смотреть в сторону понимания того, какую логику приложения следует выполнять на сервере (и вы сможете её писать под .Net Core), а какую - на клиенте (и тут .Net Core в общем-то не при чём).

    Ну и да, я надеюсь вы понимаете что .NET Core и ASP.NET Core - это не одно и то же, и "делать веб-приложение на .NET Core" - весьма расплывчатое утверждение. Что оно вообще для вас значит?
    Ответ написан
  • Как сделать запрет на редактирование файла для второго пользователя если его открыл первый пользователь?

    Nipheris
    @Nipheris Куратор тега C++
    https://msdn.microsoft.com/en-us/library/system.io... - значение этого параметра нужно выставить в Read. Не стоит велосипеды городить, стоит изучить стандартную библиотеку.
    Ответ написан
  • Как сделать загрузку файла в фоне из сайта с логином и паролем?

    Nipheris
    @Nipheris Куратор тега C#
    А) Залогиньтесь через WebBrowser, возьмите куку, отдайте WebClient-у, скачайте файл;
    Б) Разберитесь, как происходит авторизация на сайте, проведите её с помощью WebClient, получите куку, установите её в запрос на скачивание файла, скачайте файл.
    Ответ написан
  • Как определить цвет пикселя на форме?

    Nipheris
    @Nipheris Куратор тега C#
    1) если хотите проверить, что кликнули на фигуру - лучше сделайте это с помощью уравнения эллипса;
    2) если все-таки нужен цвет пикселя - лучше делайте всю отрисовку в отдельный Bitmap, его потом выводите на форму (с помощью контрола Image, например), и ИЗ НЕГО потом считывайте цвет при клике по контролу. Так будет меньше сюрпризов, чем заморачиваться с экраном;
    3) внимательно следите, относительно чего считаются координаты, с которыми вы работаете - относительно угла экрана, формы или клиентской области формы.
    Ответ написан
  • Как сделать изменяемый интерфейс на стороне клиента c# WinForm?

    Nipheris
    @Nipheris Куратор тега C#
    > Подскажите пожалуйста если есть какие мысли по решению данной задачи.
    Есть мысль поставить задачу более конкретно. Понять, что это за "поля", которые можно добавить, к каким сущностям будут привязаны эти поля, какие будут к этим полям запросы, будут ли поля глобальны для всех пользователей, или же они свои у каждого пользователя, и другим не видны.

    > Необходимо что бы администратор программы мог добавить новый label, текстовое поле, изображение, мб даже форму.
    Я не уверен в том, что вы действительно заходите администратору программы давать выполнять такие действия, т.к. он будет понемногу превращаться в программиста. Рано или поздно (а скорее всего рано) клиентам захочется добавлять еще и логику на формы, они попросят для этого язык, и уже целиком превратятся в программистов.

    Я представляю решение вашей задачи как мини-IDE + шелл для работы с базой (непонятно кстати, какой лучше - SQL или, например, документной) в одном флаконе. Такие решения в общем-то существуют и имеют смысл - достаточно вспомнить про 1C с его конфигурациями и средствами разработки, или, например, про Лексему. Однако, я не уверен, что вы хотите и сможете получить подобное решение, раз задаете такой вопрос). Мне все-таки кажется, что ваша проблема более частная, а желание дать возможность администратору клепать формочки - острый недостаток в проработанном техническом задании и/или нежелание вашего клиента платить вам в последствии за развитие и техническую поддержку продукта, которое выливается в попытку переложить рутинные задачи (эти самые "новые поля", "новые формы и лэйблы" и прочие вещи) на дешевые кадры. В общем-то в этом есть смысл, однако чтобы это организовать, нужно довольно много стартовых затрат.
    Ответ написан
  • Как организовать меж поточное взаимодействие в winforms?

    Nipheris
    @Nipheris Куратор тега C#
    Сложный путь: берете ConcurrentQueue, пишете небольшой класс сообщения, передаете сообщения о прогрессе из рабочего потока в GUI-поток (в GUI-потоке проверяете очередь сообщений по таймеру).
    Другой вариант, более простой - обернуть рабочий поток в класс-конвертор, сделать у этого класса событие ProgressChanged, дергать событие c помощью Invoke.
    А вообще есть BackgroundWorker для этой цели - это самый простой вариант, вам как раз подойдет.

    P.S. не забудьте поюзать LockBits, а то работать медленно будет.
    Ответ написан
  • Как Реализовать многослойный canvas с поддержкой прозрачности слоев?

    Nipheris
    @Nipheris Куратор тега C#
    Вам нужно определиться с количеством ресурсов, которое вам доступно. Безусловно, редактор с ядром на opengl будет очень шустрым (вон сейчас фотошоп активно пользуется аппаратным ускорением), но не факт, что вам хватит времени и умения использовать его напрямую.
    С другой стороны, вы можете попробовать написать нужные вам обработки самостоятельно, в виде обычного CPU-кода, но без использования WinForms для чего либо, кроме вывода изображения. Вы видимо пытались применить панельки для работы со слоями, это конечно будет крайне неудобно, и многое чего не выйдет. Советую попробовать поработать с этими задачами (смешение слоев, работа с прозрачностью и т.д.) самому, т.е. использоват только один picturebox для вывода готовой картинки.
    Ответ написан
  • Какие недостатки в коде/ваше мнения о данном коде?

    Nipheris
    @Nipheris Куратор тега C#
    Совет по общей структуре: в классе формы многовато данных. Понятно что с нее вы начинали все писать и из нее все вызывается, но время от времени нужно выделять группы данных/методов и выносить в отдельные классы или модули (в случае шарпа - это т.н. "статические" классы). Я по вашему коду разбил бы примерно так:
    - хелперы для загрузки данных через прокси (и их автоматического переключения в случае ошибки - я правильно понял?): можно вынести в отдельный УмныйЗагрузчик, который заберет в себя всю логику пробивания к данным - перебор юзер-агентов, сбор статистики и т.д. Из этого умного загрузчика должны торчать: простой метод для загрузки нужного урла, простой метод для получения статистики, пусть даже текстом. На форме останется лишь присовение этой статистики textBox.Text;
    - парсер html-контента. Всю логику поиска данных на странице убрать в него.
    - общий координатор работ - можно слить с предыдущим пунктом, можно выделить отдельно. Я бы убрал в него бэкграунд-воркеров, например, не обязательно им на форме торчать.
    - код записи данных в базу тоже стоит вынести. Сделайте простейшие POCO-классы для данных, которые извлекаете из html, возращайте объекты из парсера и передавайте в сохранялку.
    - ну и конечно сохранение настроек - это прекрасно отделится от всего остального также в отдельный класс.
    Разумеется нужно разбивать не только код, но и данные вместе с ним - вы сами увидите, как все станет проще и читабельнее, когда public static int CounterProxy = 0; будет в одном файле, а const string strWinState = "WindowState"; - в другом.

    Ну а теперь по мелочам:
    - не злоупотребляйте static-ами: статических данных в программе обычно немного, и это как правило объекты, с которых приложение начинает "жить" - и то лучше взять IoC-контейнер для этих целей. В вашем случае, когда вы разобьете код на классы, сами поймете что статики в таком количестве вам не нужны.
    - ArrayList я уже давно не видел в коде, не знаю в каком учебнике вы его нашли. В вашем случае он тем более ни к чему. Используйте List<T> и не извращайтесь вот так: Agent[CounterUserAgent].ToString();
    - сразу давайте всему внятные имена, в т.ч. контролам. Это сейчас у вас button1 и button2, а завтра будет button42.
    - используйте xml-документацию, раз уж делаете комментарии к методам
    - по возможности привыкайте пользоваться английским - довольно мало команд разработчиков могут себе позволить использование родного языка в коде.
    Для начала достаточно. Прежде чем заморачиваться паттернами, ощутите на нескольких примерах как вообще пользоваться ОО-языком, что он вам дает и что требует от вас.
    Ответ написан
  • Как реализовать "бегающие" точки?

    Nipheris
    @Nipheris Куратор тега C#
    Вопрос действительно академический: вам нужно основательно разобраться с событийно-управляемой (event-driven) архитектурой приложений. Пожалуй, все современные графические подсистемы так или иначе построены на ней (а вообще - не только графические). И в первую очередь нужно понять, что выполнение действий в своем цикле без передачи управления обработчикам сообщений - неверный подход. Дело в том, что GUI-приложение, в отличие от консольного, для того чтобы "не зависать", должно постоянно выполнять некоторые действия помимо нужных для вашей задачи, а именно - перерисовываться, обрабатывать события клавиатуры и мыши и т.д. Изза того что ваша программа "крутится" в цикле, то все те стандартные обработчики событий, которые должны получать управление, не получают его. Поэтому, если нужно выполнять интенсивные вычисления в графическом приложении, нужно либо:
    а) выполнять их в другом потоке - тогда получится сохранить структуру приложения и циклы, но встанет задача межпоточной передачи данных;
    б) выполнять работу порционно, время от времени передавая управления обработчикам системных событий. Это т.н. вызов DoEvents, в разных API он разный, но суть одна и та же.

    Конкретно для вашей задачи цикл на самом деле совершенно не нужен - вся анимация, какой бы они ни была, в современных приложениях (старые DOSовские игры не в счет) строится на таймерах и событиях их срабатывания. Поэтому вам нужно разобраться, как пользоваться в вашей среде таймерами и генерировать периодические события, и уже в обработчике события таймера делать label1.Text = "." , ".." , "..." в зависимости от того, какой "кадр" был предыдущий.
    Ответ написан