Сайт для программистов

пятница, 6 ноября 2009 г.

Coding4Fun

Если сегодня зайти в книжный магазин и подойти к полке, где выставлены книги по C# или Visual Basic.NET, то глаза... нет, не разбегаются от изобилия названий. Да откуда взяться этому изобилию. Создается впечатление, что издатели тасуют некую колоду, состоящую из карт с подписанными словами. И мы видим на полках книги-близнецы: Полное-руководство-шаг за шагом-самоучитель-за 21 день-неделю-по 15 минут-для профессионалов-новичков-с примерами. Даже обложки одинаковы и выдержаны в одной цветовой гамме. А примеры в книгах для профессионалов на 70% совпадают с примерами в книгах для новичков. Спрашивается, какая между ними разница?
И, как гром среди ясного неба, для меня стало известие, что издательство Символ и его интернет-магазин Books.ru выпустили книгу Coding4Fun.Программируем для удовольствия.
Честно говоря, не ожидал, что в России напечатают эту книгу (и достаточно оперативно).
Сам я давно являюсь постоянным читателем блога Coding4Fun, начиная с самых первых выпусков 2005 года. Уже тогда статьи из блога привлекали меня своей нестандартностью. Несколько раз я не удержался и разместил на своем сайте статьи в вольном переводе. К счастью, недавно появилось русскоязычное зеркало блога, где достаточно оперативно выкладываются новые материалы. Но, к сожалению, по словам координатора русской версии, старые материалы переводиться не будут. А жаль, там встречаются интересные проекты.
Вернемся к книге. В ней представлено 10 проектов из тех примеров, которые были описаны в блоге. Кто-то может спросить, а зачем читать эту книгу. Разве нельзя почитать эти же материалы в блоге? Конечно, можно. Но, иногда чтение книги более продуктивнее и удобнее. Возможно, это дело привычки. Лично мне было приятно держать бумажный вариант на руках и читать главу за главой об интересных примерах.
Примеры поражают своей широтой - здесь есть примеры для Windows, Xbox, ASP.NET, Wiimote, светомузыки и т.д.
Кстати, пусть вас не вводит в заблуждение малое количество проектов. Возьмем, для примера проект InnerTube. В этом проекте описывается процесс взаимодействия с популярным онлайн-сервисом YouTube. Авторы знакомят нас с YouTube API, при помощи которых мы можем скачать нужный ролик. Но это еще не все. Попутно, мы узнаем, как можно сконвертировать скачанный ролик в нужный нам формат, а также синхронизировать полученные материалы с iTunes и Zune. Фактически, в одном проекте описываются три разных задачи, каждая из которых вполне может потянуть на отдельный проект.
Также мне порадовало наличие примеров для Wiimote, так как я являюсь счастливым обладателем приставки Wii. Надеюсь, что у меня дойдут руки для подробного изучения примеров, и я напишу какое-нибудь приложение, использующее возможности Wiimote.
Теперь добавлю ложку дегтя в бочку меда, чтобы не перехвалить книгу. Откровенно говоря, меня удивило, что в текстах книги используется слово броузер. Мне это напомнило далекие 90-е, когда половина людей использовала это слово, а другая половина говорила - браузер. Мне кажется, что на данный момент больше прижился термин браузер. Я даже не поленился, и во время написания этих строчек, запустил поиск в справочной системе Windows 7. По слову броузер было найдено 0 документов.
Второй момент, который мне не понравился - это обложка. Оригинальная обложка американского издания мне нравится больше. Возможно, это дело вкуса. Не будем спорить.
Если вы интересуетесь программированием под .NET Framework как хобби, то эта книга для вас из категории Must Have. Советую вам поторопиться с приобретением книги. Тираж у книги небольшой и, есть предположение, что до книжных прилавков он не дойдет. Самый удобный способ - приобрести через интернет-магазины, например, ОЗОН.
Приятного вам чтения!

суббота, 24 октября 2009 г.

Фотоотчет о посещении офиса Microsoft

Утро 23 октября 2009 было мерзким. На улице шел противный дождь. Еще вчера я взял отгул в счет отпуска на работе и мог спокойно спать. Но пришлось вставать. Ведь отгул я брал не просто так. У меня было запланировано посещение офиса мегакорпорации Microsoft. Дело в том, что меня попросили возглавить московское представительство Microsoft. Впрочем, нет, Билл Гейтс и Стив Балмер еще не созрели для такого предложения.

Я поперся туда в такую погоду по другой причине - Microsoft проводила очередной семинар Techdays в Москве.

В прошлом году семинар проходил в Бауманском Доме Культуры (или как он там называется). На этот раз устроители пригласили разработчиков к себе в логово. Упускать такой шанс было нельзя.

Преодолев стойкое желание поспать, я встал и стал собираться. Холодильник был пустой, если не считать замороженного мяса. Мясо предназначалось коту, я не имел права отнимать у него последний кусок. Попил пустой чай и поехал через всю Москву в Крылатское. Вся надежда была на Microsoft, которая не даст умереть с голоду разработчика под платформу Windows.

Мои надежды оправдались - в фойе, где проходила регистрация, были накрыты столы с пирожками, а также стояли термосы с чаем/кофем. Семинар проходил целый день с 10.00 до 19.00. Через каждый час устраивались перерывы - народ ломился из учебного зала, чтобы подкрепиться. Тут Microsoft не подкачал. Молодые девушки и юноши успевали к каждому такому перерыву обновлять содержимое стола. Кроме пирожков, появились также вкусные бутерброды, соки, минеральная вода.

Во время перерыва я изобразил из себя праздношатающего зеваку и стал обследовать офис. Конечно, в закрытые двери ломиться я стал, а просто прошелся по коридору. И, неожиданно, оказался в кафе для сотрудников и посетителей Windows Vista Cafe. В кафе оказалось четыре компа (два не работало), подключенных к интернету. Также имелась пара автоматов XBox. Повсюду были шарики по случаю релиза Windows 7 и Visual Studio 2010 beta.

На семинаре одному из участников достался приз - фирменная банка пива Windows 7. Интересно, можно ее купить где-нибудь?

О самом семинаре рассказывать не буду. Все равно все материалы устроители выложат на сайте.

После окончания семинара всех также угостили пивом и фирменными тортами с надписями MSDN и Windows 7. Решение объединить два продукта мне показалось спорным (я о пиве и торте). Лично я сначала выпил бокал пива, а потом уже стал пить чай с тортом. Рядом со мной находился человек, который совершал обряд в обратном порядке. Не знаю, не знаю.

Заинтересовался также бумажками, вывешенными в туалете. Удивило, что в московском представительстве тексты была набраны на английском и напрочь отсутствовала локализованная версия. Видимо, тексты предназначались только для иностранцев. Вникать в содержание плакатов не было желания, но иллюстрации на первой картинке напоминали азбуку жестов для глухонемых.

По традиции всех участников одарили блокнотами, ручками, брошюрами. А вот футболки стали приятным сюрпризом. Только почему-то всегда дарят белые футболки (ворчу про себя).

Подписывать фотки я не стал. Думаю, что после прочтения данного поста, вы и сами разберетесь, что к чему.

Спасибо, Microsoft. Было очень вкусно.










четверг, 22 октября 2009 г.

WM_APPCOMMAND

Недавно в справочник по функциям Windows API я добавил новый материал - описание сообщения WM_APPCOMMAND. Предлагаю вашему вниманию рассказ об этом интересном сообщении в сжатом виде. Само сообщение объявляется следующим образом:

private const int WM_APPCOMMAND = 0x319;

Сообщение WM_APPCOMMAND уведомляет окно о том, что пользователь создал командное событие прикладной программы, например, щелкнул на кнопке в приложении, используя мышь, или нажал на клавиатуре клавишу управления приложением.

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

private const int APPCOMMAND_VOLUME_MUTE = 0x8 * 0x10000;

private void button2_Click(object sender, EventArgs e)
{
// выключаем/включаем микшер
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE);
}

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

Также можно увеличивать или уменьшать уровень громкости микшера(константы APPCOMMAND_VOLUME_DOWN и APPCOMMAND_VOLUME_UP). Кроме того, среди используемых констант можно найти управление микрофоном, браузером или универсальным проигрывателем. Вот как можно поставить на паузу Windows Media Player из своей программы:

private const int APPCOMMAND_MEDIA_PLAY_PAUSE = 0x14 * 0x10000;

SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_MEDIA_PLAY_PAUSE);

Полный список доступных констант вы найдете в справочнике. Хочу обратить ваше внимание, что все значения констант в сообщении WM_APPCOMMAND необходимо умножить на 0x10000, что я и сделал в предыдущих примерах. Используются ли данные константы без умножения в других сообщениях , я не знаю. Кто в курсе - отзовитесь.

Кстати, при изучении документации MSDN, я обнаружил еще одну интересную константу APPCOMMAND_DWM_FLIP3D, который включает режим FLIP 3D в Windows 7 (Кстати, сегодня первый день розничной продажи Windows 7).

Удачного вам программирования!

воскресенье, 23 августа 2009 г.

Кнопка Пуск и панель задач в Windows 7

Недавно я установил себе новую операционную систему Windows 7. Свои первые впечатления о системе я описал в личном блоге. С появлением новой системы приходится пересматривать старые проекты, чтобы убедиться в работоспособности прежних проектов. Один из таких примеров - поведение кнопки Пуск. В своем справочнике по функциям Windows API для .NET Framework я использовал пример скрытия кнопки Пуск, а также панели задач, области уведомлений и часов. Все, кроме кнопки Пуск, работает замечательно. Вот только кнопка Пуск не желает исчезать. Ее можно скрыть только с панелью задач, но никак не отдельно. На сайте CodeProject приводится пример, в котором по утверждению автора, кнопка исчезает. Но тут есть одна проблема - в его коде используется слово Start для кнопки Пуск. Возможно, его пример работает в американской версии Windows, но в русской версии кнопка не исчезает. Я пробовал изменить слово на Пуск в коде, но это тоже не принесло результата.
Также на CodeProject имеется другой пример для работы с кнопкой. Но он также мне ничем не помог.
Сам пример описан в моей книге C#.Советы программистам, поэтому нет смысла его приводить здесь. Просто имейте в виду, что пример с кнопкой Пуск из книги в Windows 7 работать не будет.

суббота, 13 июня 2009 г.

Windows Mobile

Сегодня новости будут посвящены платформе Windows Mobile. Во-первых, недавно был запущен Русский блог Windows Mobile. Материалы для блога готовит команда из нескольких человек. Ребята с энтузиазмом взялись за работу, очень активно переводят статьи из зарубежных блогов. Качество перевода пока оставляет желать лучшего, но, надеюсь, это временные проблемы. Советую занести адрес блога в закладки.
На моем сайте также появилось несколько новых материалов. Например, статья о разработке виджетов для Windows Mobile 6.5. На самом деле, эта тема более обширна, чем изложено в статье. Я также написал расширенный вариант для одного журнала. Посмотрим, опубликуют ли статью.
Кроме того, Андрей Коновалов (кстати, один из лучших участников блога о Windows Mobile) на Хабре стал публиковать статьи Криса Крафта, того самого человека, который обещал за тридцать дней написать тридцать приложений. Я сам подумывал о переводах этого цикла, но времени совсем нет. Поэтому я решил использовать с небольшими сокращениями переводы Андрея, внося свои изменения. Вот, например, вы можете прочитать первую статью Обратный отсчёт до полуночи.
Обратите внимание, кстати, что вышел набор разработчика Windows Mobile 6.5 DTK. В этом наборе появилось несколько новых эмуляторов с различными разрешениями. После установки эмуляторов, вы можете использовать их и для старых проектов. Например, для Windows Mobile 6.1 есть модели с разрешением 800х400. Раньше нельзя было посмотреть в эмуляторе, как выглядит ваше приложение на экране с таким разрешением. Теперь это стало возможным. Сам проект не обязательно компилировать под новую платформу, просто запускайте нужный эмулятор.
И последнее. Как вы знаете, в этому году у меня вышла книга Программирование для мобильных устройств под управлением Windows Mobile. Хочу провести небольшую акцию - за 250 рублей вы можете приобрести эту книгу + получите годовую подписку на мой справочник по Windows API для .NET Framework. В эту цену входит и почтовая доставка. Так как количество книг ограничено, то вам сначала нужно написать мне письмо о своем желании (rusproject@mail.ru) и я вам вышлю свой номер кошелька WebMoney (также можно перечислить Яндекс-деньгами). Акция расчитана на жителей России. Заказывайте!
Удачного вам программирования!

среда, 27 мая 2009 г.

Microsoft Visual C# в задачах и примерах

Новая книга Н.Культина Microsoft Visual C# в задачах и примерах является переработанным вариантом книги C# в задачах и примерах. Изменения оказались в лучшую сторону. Если в раннем варианте для примеров использовался Turbo C#, то в этот раз используется Visual C#. Сами примеры также были переработаны, а также добавлены новые полезные задачи. В книге можно найти примеры различной степени сложности - от простейших программ вычисления курса валют до приложений, связанных с графикой и базами данных, том числе Microsoft Access и Microsoft SQL Server Compact Edition. Также в книге показано использование новой технологии LINQ. Справочник, входящий в книгу, содержит описание базовых компонентов, событий, исключений и наиболее часто используемых функций. К книге прилагается компакт-диск со всеми проектами, представленными в книге.
Книга рассчитана для начинающих программистов, которые хотят повысить свою квалификацию. Автор предлагает практичные примеры, взятые из жизни, и понятные для восприятия. Я с удовольствием почитал эту книжку и, даже, нашел для себя что-то новое. Например, описание функции Windows API TaskDialog, которая появилась в Windows Vista/Windows 7 (на момент покупки книги я еще не был близко знаком с библиотекой Windows Vista Bridge Sample Library).
Рекомендую приобрести и почитать книжку всем, кто только начинает программировать на C#.
Счастливого вам чтения!

суббота, 23 мая 2009 г.

Windows Vista Bridge Sample Library

Долгое время у меня не доходили руки до новой библиотеки Windows Vista Bridge Sample Library, которая позволяет использовать новые возможности Windows Vista и Windows 7 в своих программах. Я видел различные публикации как на американских блогах, так и переведенные статьи. И вот, наконец, я решил изучить эту библиотеку. После небольшого изучения я вновь перечитал статьи и ужаснулся. Насколько все поверхностно описано о возможностях библиотеки, как много осталось недосказанного. Статьи расчитаны на опытных программистов, которые могут самостоятельно изучить исходный код библиотеки и понять о чем идет речь в статьях. Но что делать менее опытным программистам, которые тоже хотят приобщиться к новых технологиям?
Поэтому я решил написать свой вариант статьи на эту тему. Чтобы не начинать работу с нуля, я взял за основу уже имеющиеся статьи и немного поправил их. Предварительный вариант статьи можно прочитать по адресу http://developer.alexanderklimov.ru/articles/vbsl.php. В дальнейшем я переработаю статью и постараюсь сделать ее более понятной. Если у вас есть вопросы по данной библиотеке, то можете обратиться ко мне. Самый лучший способ поделиться своим вопросом - это воспользоваться специальной формой Оставь свой отзыв, которую можно найти в правой части главной страницы http://developer.alexanderklimov.ru. Также можете задать свой вопрос по электронной почте или в комментариях к этому посту.
Удачного вам программирования!

воскресенье, 26 апреля 2009 г.

ToTitleCase

В .NET Framework есть такой интересный метод как ToTitleCase, когда в заданной строке все первые буквы слов становятся большими, а остальные - маленькими. В MSDN можно найти описание и пример использования этого метода. Прочитав, вы узнаете, что у метода есть одна особенность: если все буквы в слове большие, то с этим словом ничего не происходит. Например, это удобно, когда встречаются такие слова как СССР, МГУ, ЗАГС и т.п. Но тем не менее, иногда, хочется обойти это ограничение. Что для этого нужно сделать. Правильно, сначала перевести все слова в нижний регистр, а затем вызвать метод ToTitleCase.


Именно так поступил программист Jan Schreuder, написав функции-обертки для этого метода (блог http://bloggingabout.net/)



private string ToTitleCase(string text, System.Globalization.CultureInfo culture, bool forceCasing)
{
if (forceCasing)
{
return culture.TextInfo.ToTitleCase(text.ToLower());
}
return culture.TextInfo.ToTitleCase(text);
}

private string ToTitleCase(string text)
{
return ToTitleCase(text, System.Threading.Thread.CurrentThread.CurrentCulture, false);
}

private string ToTitleCase(string text, bool forceCasing)
{
return ToTitleCase(text, System.Threading.Thread.CurrentThread.CurrentCulture, forceCasing);
}

private string ToTitleCase(string text, System.Globalization.CultureInfo culture)
{
return ToTitleCase(text, culture, false);
}

//Вызываем какую-нибудь функцию
label1.Text = ToTitleCase(textBox1.Text, true);


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


Вот как будут выглядеть строки после вызова всех вариантов функций.



change this to title case => Change This To Title Case
chanGe This to TITLE case => Change This To TITLE Case
ChanGe This to TITLE case => Change This To TITLE Case
ChanGe This to TITLE case => Change This To Title Case

Возможно, пример покажется не самым полезным в вашей практике, ну, а вдруг пригодится.

воскресенье, 5 апреля 2009 г.

Колокольчик для коровы

Некоторое время назад я начал переводить статью для раздела Windows Mobile, взятую с Codin4Fun. А недавно обнаружил, что эту статью также перевели на русском варианте Coding4Fun. Честно говоря, мне не очень понравился тот перевод, поэтому я все-таки решил выложить на своем сайте свой вариант перевода. Прочитать статью можно здесь.


Удачного вам программирования!

вторник, 24 марта 2009 г.

Проверь знания и выиграй призы

Перед Новым годом я предлагал вам поучаствовать в конкурсе на сайте ITquiz.ru. Те, кто принял мое приглашение, смогли выграть неплохие призы. Сам я также получил пивной бокал (см. предыдущие посты).


И вот запускается новая серия. Попробуйте свои силы. Для того, чтобы принять участие в новом конкурсе, перейдите по ссылке и зарегистрируйтесь (если у вас нет LiveID, OpenId).


Всем удачи!

понедельник, 23 марта 2009 г.

Моя книга в Библио-Глобусе

Совсем недавно в издетельстве Питер вышла моя книга Программирование для мобильных устройств под управлением Windows Mobile. Первое время она продавалась только в Петербурге, но недавно добралась и до прилавков московских магазинов. Несколько дней назад на сайте книжного магазина Библио-Глобус обнаружил, что у них тоже продается моя книга. Сегодня зашел в этот магазин и долго искал книгу на полках компьютерного отдела. Так и не нашел. Но, к счастью, магазин оборудован очень удобными терминалами с сенсорными дисплеями. Набираешь на экране название нужной книги и запускаешь поиск. Через несколько секунд система выдает тебе список найденных книг. При желании можно распечатать себе квитанцию с точным расположением книги. С удовольствием воспользовался этой услугой и уже через несколько секунд держал в руках свою книгу.
Кстати, завтра 24 марта в магазине проходит акция - всем покупателям с 18.00 до 22.00 предоставляется скидка 20% на любую книгу. Поэтому, если вы покупаете книги в книжных магазинах, то приезжайте завтра в Библио-Глобус. Можно сэкономить неплохую сумму при нынешних ценах на компьютерную литературу.
Приятного вам чтения!

воскресенье, 22 марта 2009 г.

ShellAbout

Сегодня познакомлю вас с простой функцией Windows API ShellAbout.



[DllImport("shell32.dll")]
static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);


ShellAbout выводит стандартное диалоговое окно Windows "О программе". Такое окно, например, вы можете увидеть при выборе меню О программе в Блокноте (notepad.exe). ЭТо окно можно использовать, когда у вас нет времени на разработку своего окна About.



Параметры



hwnd
Описатель родительского окна, вызывающего функцию

szApp
Выводит текст в заголовке диалогового окна и в первой строчке после слова "Microsoft". Если текст содержит разделитель (#), разделяющий текст на две части, то функция выводит первую часть в заголовке, а вторую после слова "Microsoft"

szOtherStuff
Выводит текст после информации о версии и копирайте

hIcon
Значок, выводимый в диалоговом окне. Если параметр равен NULL, функция показывает значок Microsoft Windows


Пример



ShellAbout(this.Handle, "Блокнотик", "Супер-программа Александра Климова", IntPtr.Zero);

Данная функция включена в справочник по функциям Windows API.

суббота, 28 февраля 2009 г.

Удаление файлов из корзины

В своей книге C#.Советы программистам я привел несколько примеров удаления файлов в системную Корзину. Если вы хотите удалить файлы из самой корзины, то воспользуйтесь функцией Windows API SHEmptyRecycleBin.
[C#]
[DllImport("shell32.dll")]
static extern int SHEmptyRecycleBin(IntPtr hWnd, string pszRootPath, uint dwFlags);
[Visual Basic]
Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" (
ByVal hwnd As Integer,
ByVal pszRootPath As String,
ByVal dwFlags As Integer) As Integer


Теперь остается только вызвать функцию с нужными параметрами.
SHEmptyRecycleBin(IntPtr.Zero, "", SHERB_NOCONFIRMATION SHERB_NOSOUND);
Полное описание функции будет добавлено в справочник по функциям Windows API в среде .NET Framework.
Удачного вам программирования!

суббота, 14 февраля 2009 г.

Создание кружочков с цифрами без Photoshop

Сегодня в рассылке VB Helper Newsletter (http://www.vb-helper.com/) прочитал, как автор рассылки создавал специальные картинки для иллюстрации к своим книгам или статьям. Картинки представляют собой маленькие кружочки с цифрами внути. Подобные картинки обычно размещают для показа последоватьельности действий. Например, установите текст в текстовом поле (рис.1), нажмите на кнопку Далее (рис.2) и тому подобное. Безусловно, подобные вещи можно сделать в фотошопе и другом графическом редакторе. Но программисты не ищут легких путей. Гораздо интереснее самому генерировать картинки. Хотя, если серьезно, пример обладает определенным потенциалом для изучения техники работы с графикой, а также может послужить отправной точкой для создания других интересных вещей, например, генерирование лотерейных шаров с номерами.



Пример я портировал с Visual Basic на C#. Желающие ознакомиться с исходниками на VB, могут скачать пример с http://www.vb-helper.com/HowTo/howto_2005_make_number_icons.zip.



Привожу пример на C#. Одно маленькое замечание: в первоисточнике использовался цикл for для генерации десяти кружочков с цифрами от 0 до 9. Я ограничился одной цифрой 1.




const int WID = 24;



string base_path = @"e:\down\"; // ваш путь к папке



Font the_font = new Font("Arial", 10, FontStyle.Bold);



Bitmap bm = new Bitmap(WID,WID);



Graphics gr = Graphics.FromImage(bm);



gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

gr.Clear(Color.White);



Rectangle layout_rectangle = new Rectangle(0, 0, WID - 1, WID - 1);



using (LinearGradientBrush br = new LinearGradientBrush(layout_rectangle,

Color.White,Color.Blue,

LinearGradientMode.ForwardDiagonal))

{

gr.FillEllipse(br,layout_rectangle);

gr.DrawEllipse(Pens.Blue, layout_rectangle);

}



StringFormat string_format = new StringFormat();

string_format.LineAlignment = StringAlignment.Center;

string_format.Alignment = StringAlignment.Center;

gr.DrawString("1",the_font,Brushes.White,layout_rectangle,string_format);

bm.Save(base_path + "1" + ".bmp",System.Drawing.Imaging.ImageFormat.Bmp);



MessageBox.Show("Готово");




Кстати, сегодня День святого Валентина. Поздавляю всех романтичных котиков и кошечек )))



суббота, 17 января 2009 г.

Математические функции на мобильных устройствах или Справка тоже ошибается

Здравствуйте!


Сегодня хочу поделиться с одним наблюдением, которое поможет некоторым программистам, использующих математические функции в проектах для .NET Framework.


В составе класса System.Math есть методы Sinh, Cosh и Tanh, которые возвращают гиперболические синус, косинус и тангенс соответственно. Если вы посмотрите в справочной системе, то увидите, что данные методы поддерживаются, начиная с CF 1.0. Но так ли это на самом деле? Давайте попробуем проверить эти утверждения. Запустим новый проект для мобильных устройств и введем простой код для кнопки:



textBox1.Text = Math.Sinh(1.2).ToString();

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


К счастью, не все так страшно. Эти методы легко создать самостоятельно.



double angle = 1.2;

// sinh(double angle): (e^x - e^-x) / 2
double res = (Math.Exp(angle) - Math.Exp(-angle)) / 2.0;

// cosh(double angle): (e^x + e^-x) / 2
res = (Math.Exp(angle) + Math.Exp(-angle)) / 2.0;

// tanh(double angle): sinh / cosh
res = (Math.Exp(angle) - Math.Exp(-angle)) /
(Math.Exp(angle) + Math.Exp(-angle));


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


Данный совет будет помещен на страницу Вопрос+ответ=совет


Счастливого вам программирования!

воскресенье, 4 января 2009 г.

Ширина столбцов у ListView

Всех с Новым Годом!

Сегодня поделюсь с вами одним наблюдением, о котором возможно не все знают. Если вы используете в своих проектах элемент управления ListView в режиме Details, то могли заметить одно неудобство. В некоторых случаях, слова обрезаются по ширине ColumnHeader и это слегка раздражает пользователя. Приходится самому вручную увеличивать ширину столбца, чтобы прочитать весь текст. Первое, что приходит в голову - это самостоятельно вычислять ширину слов с помощью MeasureString.
Но не все так плохо. Если прочитать документацию по свойству ColumnHeader.Width, то можно узнать о двух интересных значениях - это отрицательные значения -1 и -2. Первое значение устанавливает ширину столбца по самому длинному слову в столбце, а второе значение устанавливает ширину по слову, содержащему в самом столбце.
Вы можете установить эти значения в режиме разработки, но обратите внимание, что когда вы нажимаете на кнопку OK в редакторе свойств для ListView, то значения -1 или -2 автоматические заменяются на реальную ширину, которая IDE вычисляет автоматически за нас. Поэтому, если внесете изменения в ListView во время разработки, то еще раз установите нужные значения.
Если вы хотите поддерживать нужные размеры столбцов во время выполнения программы, то делайте это программным способом.

ColumnHeader header;
header.Width = -1;


Этот совет я помещаю на страницу Вопросов и ответов. Кстати, он справедлив и для .NET Compact Framework.

Счастливого вам программирования!