Позднее связывание, на примере взаимодействия с терминалом сбора данных Cipher 8001L

В данной публикации я продемонстрирую взаимодействие с COM объектом на языке C#. В примере будет использована OLE-компонента для взаимодействия с ТСД Cipher 8001L компании CitySoft. Думаю, всё то что описано можно использовать и для других COM-Объектов.

Для начала поясню в чём суть позднего связывания, и зачем это надо. Позднее связывание необходимо нам тогда, когда тип объекта заранее не известен и мы не можем напрямую обращаться к параметрам, методам и свойствам используемого объекта — вот для этого и используется позднее связывание.

Для вызова метода надо знать его название и список формальных параметров, которые он принимает. Для вызова используем метод InvokeMember().

Читать дальше →

Немножко о PictureBox и памяти.

Наткнулся на одно явление, решил описать себе на память и для общественности, может кому-то окажется полезным.

Всем известно что память надо чистить, и чем методичнее это делаешь тем лучше. И вот на днях Эксепшн по памяти вылез там, откуда я его не ожидал.

Итак задача: делаем приложение в котором есть PictureBox и ImageList, приложение «мониторит» определённые параметры и в зависимости от того чего «намониторило» меняет изображение в PictureBox на одно из коллекции ImageList.

Казалось бы, чего проще…
pictureBox1.Image = imageList1.Images[номер_картинки];

Но не тут то было, оказывается если сделать так определённое количество раз (довольно большое количество, но думаю зависит от размера изображений), то спустя некоторое время получим Ошибку по памяти. Судя по всему при таком способе память от предыдущего изображения остаётся занятой, при этом добавляется блок памяти под новое. Вообщем помогает это исправить Dispose().

Чтобы всё было хорошо, сколько бы изображение не менялось, делать надо так:
pictureBox1.Image.Dispose();
pictureBox1.Image = imageList1.Images[номер_картинки];

При таком варианте ошибок не возникает.

Вот-так. Век живи — век учись.

Динамический вывод картинок в отчётах Crystal Report на C#.

В данной публикации я расскажу каким образом в отчёт Crystal Report можно вывести требуемое количество изображений (например из базы данных).

!!! Для того чтобы публикация была понятна, рекомендуется к обязательному прочтению предыдущая статья Используем Crystal Report в C#.

Собственно, перепробовав много методов (в основном описанных на зарубежных сайтах — в Ру-нете как то не особо изучен этот вопрос), нашёл действительно работоспособный и эффективный метод вывода изображений в отчёт Crystal Report, который заключается в передаче изображений в отчёт через источник данных.

Для того чтобы передать таким способом изображения мы просто создаём DataTable, в котором одному из столбцов (можно и нескольким) задаём тип данных массив байт — «System.Byte[]». Далее просто добавляем в ячейки этого поля изображения преобразовав их в массив Byte[].

Читать дальше →

Программное добавление событий для элементов управления в C#

Часто бывают случаи, когда создать событие для элементов управления необходимо программно, например когда нам надо выполнить определённые манипуляции с элементами и данными которые они содержат до того как начнут обрабатываться события на изменение выбранного значения, на клик мышкой, на изменение содержимого и многие другие.
Для этого целесообразно создавать события не в дизайнере формы а программно. Как это сделать я здесь и покажу на примере.

Пример будет получать источник данных в ComboBox, и по событию SelectedIndexChanged — будет выводить индекс выбранного элемента, вот это событие мы и создадим программно.

Итак приступаем:
DataSet ds = new DataSet(); //Создаем источник данных.
EventHandler handler; //Создаем делегат.

Читать дальше →

Сортировка списка (List) в C#

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

Допустим, имеем мы класс:
public class User
    {
        public int id;
        public string name;
    }


Создаем список:
List<User> usr = new List<User>();
            //Заполняем список
            User u1 = new User();
            u1.id = 2;
            u1.name = "Ольга";
            usr.Add(u1);
            u1 = new User();
            u1.id = 1;
            u1.name = "Дима";
            usr.Add(u1);
            u1 = new User();
            u1.id = 3;
            u1.name = "Света";
            usr.Add(u1);


Читать дальше →

Рисуем изображение с прозрачным фоном и заставляем его перемещаться в NET CF.

Довольно долго я всевозможными способами пробовал вывести изображения с прозрачным фоном (например картинку формата png) в .NET CF на Windows Mobile устройствах. Но всё получалось либо медленно и некрасиво, либо очень сложно. А нужен был метод позволяющий делать это просто быстро и качественно. И вот недавно наткнулся на чудесный набор библиотек OpenNETCF Smart Device Framework (думаю о нём я ещё не раз напишу — в нём ну очень много полезных и нужных вещей). В этом наборе имеется библиотека OpenNNETCF.Drawing.dll — предназначенная для работы с изображениями с использованием GDI+. Вот она то мне и помогла сделать то что так давно хотелось.

Читать дальше →

Делаем скриншоты в C# под .NET CF

Столкнулся с необходимостью делать скриншоты с КПК, и так и не нашёл ни одной подходящей программы. А именно простой, маленькой и чтобы ничего не устанавливалось, но при этом работала.
Решил написать, часа два окучивал интернет по поводу того как это сделать — всё оказалось не так то просто, на мобильных устройствах через .NET в чистом виде не получится только через API.

Читать дальше →