Создание своих библиотек в Visual Studio для DirectumRX (DLL для начинающих - часть 2)

30 4

Для тех, кто пропустил: Создание своих библиотек в Visual Studio для DirectumRX (DLL для начинающих - часть 1). На этот раз мы попробуем создать небольшой проект с использованием Windows Forms.

Без лишних слов и вступлений...

Поехали!

Открываем Visual Studio и создаем новый проект.

Выбираем "Приложение Windows Forms (.NET Framework)", указываем используемый Framework и заполняем имя проекта. Ждем "Ок".

У меня проект будет называться TestWindowsForms.


На этот раз структура проекта несколько отличается от библиотеки классов, а точнее у нас появились

  • класс формы Form1,
  • конструктор формы Form1.Designer.cs,
  • метод-конструктор класса Form1(),
  • методы Dispose(bool)InitializeComponent().

Подробнее по структуре приложения можно почитать например на сайте metanit в разделе - "Работа с формами".

Пишем приложение

Не будем ходить вокруг да около, давайте уже что-нибудь напишем, пусть это будет простенький ProgressBar.

Открываем "Панель элементов" -> "Все формы Windows Forms", ищем компонент ProgressBar и перетаскиваем его на форму.


Также нам понадобится кнопка, ну и дополнительно можно привести имена формы, progress и остального к более или менее читаемым. У меня получилось как-то так:


Переходим в класс ProgressForm() и напишем небольшую инициализацию, где зададим начальные значения progressBar, а также создадим переменную для отслеживания нажатия кнопки Stop:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestWindowsForms
{
    public partial class ProgressForm : Form
    {
        //Переменная, по которой будем отслеживать нажатие на кнопку Stop
        bool stopProgressBar = false;

        /// <summary>
        /// Инициализация формы ProgressForm 
        /// </summary>
        public ProgressForm()
        {
            InitializeComponent();

            //Минимальное значение
            progressBar.Minimum = 0;
            //Максимальное значение
            progressBar.Maximum = 100;
            //Текущая позиция
            progressBar.Value = 0;
            //Размер шага
            progressBar.Step = 1;
        }

        private void ProgressForm_Load(object sender, EventArgs e)
        {

        }
    }
}

Далее добавим код на нажатие кнопки Stop, а также функцию, которая будет возвращать нам результат нажатия этой кнопки:

/// <summary>
/// Действие кнопки Stop
/// </summary>
private void stopButton_Click(object sender, EventArgs e)
{
     stopProgressBar = true;
}

/// <summary>
/// Проверить, была ли нажата кнопка Stop на форме
/// </summary>
/// <returns>Результат проверки (true - нажимали, иначе false).</returns>
public bool GetAbort()
{
     return stopProgressBar;
}

Также напишем функцию NextStep(), чтобы двигать наш progress вперед:

/// <summary>
/// Сдвинуть ProgressBar на шаг Step
/// </summary>
public void NextStep()
{
    progressBar.PerformStep();

    // нужен для того, чтобы наша форма не зависли и progress визуально обновлялся
    Application.DoEvents();
}

Итак, что-то уже получилось, осталось только собрать.

Открываем свойства проекта и указываем "Тип выходных данных" = Библиотека классов и собираем решение.


Чтобы в DirectumRX стали доступны подписи функций, как на картинке ниже,

в разделе "Сборка" необходимо поставить галочку "XML-файл документации" и в дальнейшем подгрузить собранную XML к DLL в сторонних библиотеках.


Все собираем, готовый результат — это 3 файла (если поставили галочку XML): dll, pdb и xml.

DirectumRX

Переносим файлы на сервер с DirectumRX и подключим к тестовому модулю. Поскольку в нашей DLL мы работаем с System.Windows.Forms, нам понадобятся 2 файла:

  • System.Windows.Forms.dll,
  • System.Windows.Forms.xml.

Я взял их из C:\Windows\Microsoft.NET\Framework\ваша версия framework.

Обратите внимание на область действия библиотек.

Т.к. System.Windows.Forms это не Web библиотека, да и наша сборка тоже к Web-у никакого отношения не имеет, доступность сборки нужно ограничить, только Desktop-клиентом.

На обложке модуля я создал простое действие с функцией, которое будет получать progressBar и в цикле его сдвигать (не забудьте подключить System.Windows.Forms):

using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using System.Windows.Forms;

namespace finex.ModuleDLL.Client
{
	public class ModuleFunctions
	{
		public virtual void TestMyProgress()
		{
				// Отдельный поток нужен, чтобы клиент RX не висел во время вычислений
				// и с ним можно было работать		
				var task = System.Threading.Tasks.Task.Run(
				() =>
				{
					//Создаем новый экземпляр формы
					var progressForm = new TestWindowsForms.ProgressForm();
					
					// Стартовая позиция формы - по центру экрана
					progressForm.StartPosition = FormStartPosition.CenterScreen;
					
					// Заголовок формы
					progressForm.Text = "Тестируем форму";

					//Покажем нашу форму
					progressForm.Show();
					
					// Переместим форму на передний план
					progressForm.Activate();
					
					for (var i = 0; i < 100; i++)
					{
						// Сдвинем progress на 1 шаг
						progressForm.NextStep();
						
						// Немного подождем, имитируя какие-то вычисления
						System.Threading.Thread.Sleep(100);
						
						// Если на форме мы нажали на выход, то выйдем из цикла
						if (progressForm.GetAbort() || progressForm == null)
							break;
					}
					
					// Закроем форму
					if (progressForm != null)
						progressForm.Close();
				});
		}
	}
}

Собираем:

Запускаем и смотрим, что получилось:

Самая простая версия ProgressBar готова!

Можно в VS добавить функции по настройке progressBar:

public void SetProgressSetting(int min, int max, int startValue, int step)
        {
            progressBar.Minimum = min;
            progressBar.Maximum = max;
            progressBar.Value = startValue;
            progressBar.Step = step;
        }

А можно просто получить progressBar в DirectumRX и настроить его там, что, на мой взгляд, несколько удобнее:

public ProgressBar GetProgress()
        {
            return progressBar;
        }

Можно добавить Label и писать дополнительную информацию туда или подключить другой стиль окна и компонент и т.п.

На текущий момент Desktop-клиент DirectumRX уходит на задний план, т.к. приоритет развития это Web-клиент, НО...

Лишние знания, лишними никогда не бывают.

Прикреплен файл: TestWindowsForms.rar

Андрей Андреев

Привет! А как можно отследить активность пользователя в проводнике, для оценки трудозатрат, простоев. например? Желательно с записью в лог или отправкой на мыло.. 

Павел Логинов

Интересно как вызывать подобные диалоги, но в веб-клиенте?

Сергей Беляков

Павел, Вопрос интересный и на эту тему как раз и планировалась 3-я часть цикла, но времени заняться этим вопросом категорически нет. Надо копать в сторону ASP.Net. Возможно, когда-нибудь ... )))

Сергей Беляков

Андрей, Можно написать Job в БД, который будет мониторить таблицу Sungero_System_Clients. 

Тут правда встает пара вопросов:

1) С какой периодичностью его выполнять, чтобы не сильно грузить систему

2) Достоверность информации, т.к. в поле LastActivity пишется последняя активность в системе, но при это пользователь может читать документ например. Как найти ту тонкую грань между работой и безделием !? Я пока не знаю.

Сергей Беляков: обновлено 02.04.2021 в 09:53
Сергей Беляков: обновлено 02.04.2021 в 09:53

Авторизуйтесь, чтобы написать комментарий