Для тех, кто пропустил: Создание своих библиотек в Visual Studio для DirectumRX (DLL для начинающих - часть 1). На этот раз мы попробуем создать небольшой проект с использованием Windows Forms.
Без лишних слов и вступлений...
Открываем Visual Studio и создаем новый проект.
Выбираем "Приложение Windows Forms (.NET Framework)", указываем используемый Framework и заполняем имя проекта. Ждем "Ок".
У меня проект будет называться TestWindowsForms.
На этот раз структура проекта несколько отличается от библиотеки классов, а точнее у нас появились
Подробнее по структуре приложения можно почитать например на сайте 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 и подключим к тестовому модулю. Поскольку в нашей DLL мы работаем с System.Windows.Forms, нам понадобятся 2 файла:
Я взял их из 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 пишется последняя активность в системе, но при это пользователь может читать документ например. Как найти ту тонкую грань между работой и безделием !? Я пока не знаю.
Авторизуйтесь, чтобы написать комментарий