КОТ++
Прикладное программирование
Системное программирование
Программирование микроконтроллеров

Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать. (с) Николай Безруков

Опубликовано
Комментарии 0

В данном посте хочу поделиться очень хорошим прогерским лайвхаком. С помощью этого трюка можно внедрить в основной код проверку на правильность ввода, на какие-либо другие пользовательские ошибки и многое другое. Ведь как это иногда бывает: писать основной код очень весело, а вот делать различные проверки на ошибки в ходе выполнения программы очень и очень скучно и не охото. Как только вы прочитаете этот пост всё будет иначе!

Нужно знать всего несколько правил:
1) не используйте в основном коде ифы (if) для проверки на ошибки в ходе выполнения;
2) не используйте коды ошибок, вместо них используйте классы ошибок (например в c# собственные классы ошибок наследуйте от Exception, в java от RuntimeException);
3) при проверке на ошибки используйте блоки try ... catch.

И это всё, что нужно знать чтобы лвлапнуться в мире кодинга!

Завершу примерами кода и примечаниями, которые прояснят всё ситуацию.

Проверка заполненности текстовых полей и их валидация (андроид). Смотрите как удобно, у нас нет огромного количества веток из ифов. Если пользователь сделал что-то не так, то мы с помощью throw выбрасываем ошибку и выполнение кода дальше не идёт, а вместо этого в блоке catch пользователю выдаётся сообщение об ошибке, которое зависит от типа исключения.
try
{
       String email = ((EditText)findViewById(R.id.login_edittext_email)).getText().toString();
       String pass = ((EditText)findViewById(R.id.login_edittext_pass)).getText().toString();

       if ((email.isEmpty()) || (pass.isEmpty()))
       {
                throw new EmptyEditTextException();
       }
       else if (!Utils.isValidEmail(email))
       {
                throw new NotValidEmailException();
       }

       ...//создаём параметры для входа
       account.login(params);
}
catch (NotValidEmailException e)
{
       Toast.makeText(getApplicationContext(), "Некорреткный email адрес", Toast.LENGTH_SHORT).show();
}
catch (EmptyEditTextException e)
{
       Toast.makeText(getApplicationContext(), "Не введён логин или пароль", Toast.LENGTH_SHORT).show();
}
Или вот ещё пример на c#. Проверяем сначала всё ли готово для печати, если нет, то показываем ошибку, если да, то начинаем печать. Опять же код мог бы быть куда более раздутым без try ... catch. Обратите внимание, что блоки try ... catch легко можно добавить в уже готовый код. Т.е. сначала можно реализовать основную логику программы, а потом спокойно добавить обработку ошибок.
try
{
       checkExistAdobeReaderPath(); //проверяем указан ли путь до Adobe Reader
       checkOpenedPdfFile(); //проверяем выбран ли PDF на печать
       /*если же какое либо условие не выполнилось то эти функции выкинут exception, а в catch мы их отловим)*/
       printDocument(); //отправляем на печать
}
catch (PdfFileNotOpenedException)
{
       MessageBox.Show("Pdf файл не выбран", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (AdobeReaderPathNullException)
{
       MessageBox.Show("Не указан путь к AdobeReader", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Теги ,
Автор

Опубликовано
Комментарии 0

FormatABC – программа предназначенная для организаций и частных лиц, которым необходимо быстро и правильно отправить на печать файл, имеющий разные форматы листов A0-A4. Программа автоматически определяет количество форматов A0-A4 в файлах с расширением «.pdf» и отправляет на печать.

Возможности программы:
-автоматическое определение количества листов;
-автоматическое определение принтеров;
-автоматическая отправка различных форматов на разные принтеры.

Для работы с программой Вам необходимо:
-зарегистрироваться;
-оплатить (на момент написания поста стоимость 1200р.);
-получить ключ;
-скачать программу;
-активировать ключ.

Описание от меня: программа разрабатывалась длительное время по заказу Дмитрия Ветошкина (formatabc@yandex.ru). Программа позволяет упростить печать PDF документов, в которых имеются листы различных форматов. Программа разработана на c# с использованием библиотеки PDFSharp, установочник написан с помощью InnoSetup.

Ссылка на сайт: http://formatabc.ru

Теги ,
Автор

Опубликовано
Комментарии 0

Разрабатывая очередную программу, столкнулся с рядом проблем, которые таит в себе WinApi. Передо мной стояла задача написать программу, которая будет выполнять действия в окнах за юзера в определённый момент. Программа должна научиться кликать мышкой и крутить колёсиком в чужих окнах. В этом посте постараюсь изложить то, как я решил задачу.

Я не буду здесь выкладывать сигнатуры всех используемых мной функций, т.к. это можно найти на msdn, наоборот я покажу какие функции, в какой ситуации лучше использовать и как это лучше сделать. Возможно, кому-нибудь пригодится данный опыт.

События мыши это по сути сообщения, которые пользователь посылает в систему. Эти события можно сымитировать программно. Для этого есть две замечательные функции из WinApi SendMessage и PostMessage. Задача у них одна – отправить сообщение в целевое окно. Различие в том, что первая ждёт пока целевое окно обработает отправленное сообщение, вторая не дожидается этого, она просто отсылает это сообщение больше ни о чём не беспокоясь. Разберём теперь как же найти это целевое окно. Я считаю, что хороший способ – найти окно по его заголовку. Для такого поиска есть функция WinApi FindWindow. Для написания программы я использовал c#, и как оказалось в нём достаточно функционала найти хэндл окна по заголовку.
//получаем массив всех процессов системы
Process[] procs = Process.GetProcesses();
//перебираем полученный массив
foreach (Process p in procs)
{
        //если заголовок окна содержит строку поиска
        if (p.MainWindowTitle.IndexOf(TITLE_SEARCH) != -1)
        {
                //то запоминаем хэндл окна
                IntPtr handle = p.MainWindowHandle;
        }
}
Зная хэндл можем отправить клик мыши в это окно. Здесь уже средствами .NET не обойтись, поэтому начинаем юзать WinApi функции. Чтобы подключить функцию SendMessage к c# программе нужно в код прописать следующее:
[DllImport("User32.dll")]
public static extern Int32 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
hWnd – хэндл окна, который мы нашли выше,
Msg – сообщение (нажатие ЛКМ = 0x201, отпускание ЛКМ = 0x202, вращение колёсика = 0x020A,
wParam – 16-битный параметр функции (word параметр), будем использовать для передачи значения на сколько сдвинулось колёсико мыши,
lParam – 32-битный параметр функции (long параметр), будем использовать для передачи координат мыши.
Но как же затолкать несколько значений всего в два параметра? Для таких действий есть такое извращение как помещение разных значений в старшие и в младшие биты. Для таких фокусов можно использовать эту функцию:
public static IntPtr MakeParam(int low, int hight)
{
       return (IntPtr)((low & 0xFFFF) | (hight << 16));
}
Теперь мы можем вызвать эту функцию и отправить сообщение клика окну. Клик мыши – это наведение курсора, нажатие клавиши мыши и отпускание. Поэтому надо отправить три сообщения.
SendMessage(handle, WM_MOUSEMOVE, (IntPtr)0, MakeParam(x, y));
SendMessage(handle, WM_LBUTTONDOWN, (IntPtr)0, MakeParam(x, y));                    
SendMessage(handle, WM_LBUTTONUP, (IntPtr)0, MakeParam(x, y));
Для прокрутки колёсика:
SendMessage(handle, WM_MOUSEMOVE, (IntPtr)0, MakeParam(x, y));
SendMessage(handle, WM_MOUSEWHEEL, MakeParam(0, delta), MakeParam(x, y));
Где delta значение на которое должно быть прокручено колёсико.
Теперь программа должна уметь кликать в чужие окна и нажимать там кнопки. НО программа кликает, а вот кнопки то не нажимаются! Может ошибка в координатах? Нет, ошибка в том, что сообщение было отправлено не туда. Кнопка это не элемент главного окна, это его часть и в системе она числится как дочернее окно. По сути все элементы окна это дочерние окна, если, конечно, можно так выразиться.

Элементы окна можно посмотреть с помощью программы Spy++. Запустить её можно через Visual Studio, Сервис -> Spy++, хочу обратить внимание, что там присутствуют две программы (Spy++ и Spy++ (x64)), так вот даже в 64 битной системе следует запускать Spy++, т.к. Spy++ (x64) почему-то ограничен в функционале (возможно такой глюк присутствует только у меня). Вот пример работы программы для поиска окон (для поиска нужно нажать на мишень и передвигать её по экрану).


Скриншот показывающий, что контролы окна это отдельные элементы и тоже имеют свой хэндл.

Также с помощью этой программы можно просматривать все сообщения, которые получает то или иное окно. Для этого нужно перейти в запись сообщений (ctrl+M). Кстати не в любом окне каждый контрол является отдельным элементом. Например, если графика отрисована с помощью OpenGL, то само собой кнопки и другие контролы не могут быть отдельными элементами, т.к. просто отрисованы в графическом окне средствами GPU и не имеют своего хэндла. Всё это можно проверить через Spy++. В заключение хочу сказать, что WinApi и Spy++ хорошие помощники в написании программы для автоматизации каких-либо действий пользователя в конкретных программах.

Теги , , ,
Автор

Опубликовано
Комментарии 0

Этот пост будет совсем небольшой, он будет просто предостережением для тех кто пользуется хитровыебанной банковской птицой киви ну или фруктом. Зашёл сегодня на киви, чтобы совершить оплату, но кошелёк оказался пустым! Захожу в историю и вижу, что 31-го числа он весь опустошился в связи с тем, что я по их мнению неактивный пользователь согласно пункту 4.15 оферты.

Очень блять удобно да? Воровать деньги у пользователя, если он длительное время (гугл подсказывает 180 дней) не пользуется одной из невостребованных платёжных систем. Он нужен был лишь, чтобы оплачивать покупки с алиэкспресс, и какой же ёбаный умник решил, что с алиэкспресс надо покупать не реже чем раз в полгода? Я всегда доверял киви, ассоциация была с фруктом и птичкой, а и то и другое очень добрые штуки. Оказалось всё не так! Так вот, я надеюсь, что многие люди откажутся пользоваться блядской птичкой киви, и в связи с этим злоебучая птица со всеми кто за неё ответственен останется без последних штанов, надеюсь акции киви упадут блять на дно)

Не пользуйтесь киви, берегите свои деньги)

Теги , ,
Автор

Опубликовано
Комментарии 0

Котострофа

В этом посте напишу про небольшой совет, касательно gps и разработки с ним. Ранее у меня бывали ситуации, когда был заказ на приложение с функционалом с gps, а у меня ну вот никак этот gps на телефоне не работал почему-то, на эмуляторе с фиктивными геоданными тоже. Код приходилось писать в слепую, без возможности проверить на работоспособность. Я соответственно не понимал в чем дело и грешил на особенность телефона, особенность gps датчика, на всё что угодно. Но у заказчика код работал, и я не парился. Кто-то скажет, что это мой код просто кривожопый. Но моим аргументом будет то, что на телефоне не работало ни одно приложение с gps, в том числе и 2гис.

Однажды код перестал работать и у заказчика, в итоге я предположил, что на андроиде с этим gps ужасная котострофа. Решили сделать функцию геолокации для пользователя на выбор, а не принудительной, чтобы те у кого gps не работает могли использовать обычный ввод своего адреса. Но сегодня я понял в чем проблема. Ненавистный gps у меня снова заработал после того как я откатил телефон назад к заводским настройкам. Смартфон стал пошустрее работать, и в том числе заработало gps.

В заключение хочу сказать, что в своих приложениях лучше предлагайте пользователям помимо gps ещё и альтернативу. А также, если у вас перестал работать gps, то вайпните своё устройство)

Теги , , ,
Автор

| 1 | | 4 | 5 | 6 | 7 | 8 |